Improved GBP-VBD communication process 81/46281/10
authorVladimir Lavor <vlavor@cisco.com>
Thu, 29 Sep 2016 07:13:36 +0000 (09:13 +0200)
committerVladimir Lavor <vlavor@cisco.com>
Fri, 14 Oct 2016 13:28:48 +0000 (13:28 +0000)
    - GBP now registers listener if some request for VBD is created
    - VBD now has bigger time window to complete tasks
    - VBD bridge domain creation status is used (patch here:
      https://git.opendaylight.org/gerrit/#/c/46283/)
    - BridgeDomain class defined in vpp-renderer.yang renamed to
      GbpBridgeDomain to avoid usage of fully qualified names
    - UT fixed

Change-Id: I1dae38a20a528c70b6de8df45d841a99405f34d8
Signed-off-by: Vladimir Lavor <vlavor@cisco.com>
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NetworkAware.java
neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NetworkAwareTest.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/BridgeDomainManagerImpl.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/ForwardingManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/VppIidFactory.java
renderers/vpp/src/main/yang/vpp-renderer.yang
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/BridgeDomainManagerImplTest.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/ForwardingManagerTest.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/VppRendererPolicyManagerTest.java

index ccacb17352e617a95944e6808aec5ddcd10537bb..265c8e90a04e470bece400ed4aeba6474c00cc60 100644 (file)
@@ -14,18 +14,17 @@ import java.util.List;
 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.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.FlatNetwork;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.NetworkTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRefBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
@@ -65,17 +64,17 @@ public class NetworkAware implements MappingProvider<Network> {
 
     @Override
     public void processCreatedNeutronDto(Network network) {
-        BridgeDomain bridgeDomain = createBridgeDomain(network);
+        GbpBridgeDomain bridgeDomain = createGbpBridgeDomain(network);
         if (bridgeDomain != null) {
             ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
-            rwTx.put(LogicalDatastoreType.CONFIGURATION, getBridgeDomainIid(bridgeDomain.getId()), bridgeDomain, true);
+            rwTx.put(LogicalDatastoreType.CONFIGURATION, getGbpBridgeDomainIid(bridgeDomain.getId()), bridgeDomain, true);
             DataStoreHelper.submitToDs(rwTx);
         }
     }
 
     @VisibleForTesting
-    BridgeDomain createBridgeDomain(Network network) {
-        BridgeDomainBuilder bridgeDomainBuilder = new BridgeDomainBuilder();
+    GbpBridgeDomain createGbpBridgeDomain(Network network) {
+        GbpBridgeDomainBuilder bridgeDomainBuilder = new GbpBridgeDomainBuilder();
         String description = (network.getName() != null) ? network.getName() : "Neutron network";
         bridgeDomainBuilder.setDescription(description);
         bridgeDomainBuilder.setId(network.getUuid().getValue());
@@ -148,24 +147,24 @@ public class NetworkAware implements MappingProvider<Network> {
             .build();
     }
 
-    InstanceIdentifier<BridgeDomain> getBridgeDomainIid(String id) {
-        return InstanceIdentifier.builder(Config.class).child(BridgeDomain.class, new BridgeDomainKey(id)).build();
+    InstanceIdentifier<GbpBridgeDomain> getGbpBridgeDomainIid(String id) {
+        return InstanceIdentifier.builder(Config.class).child(GbpBridgeDomain.class, new GbpBridgeDomainKey(id)).build();
     }
 
     @Override
     public void processUpdatedNeutronDto(Network originalNetwork, Network updatedNetwork) {
-        InstanceIdentifier<BridgeDomain> bdIid = getBridgeDomainIid(originalNetwork.getUuid().getValue());
+        InstanceIdentifier<GbpBridgeDomain> bdIid = getGbpBridgeDomainIid(originalNetwork.getUuid().getValue());
         ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
         deleteBridgeDomainIfPresent(rwTx, bdIid);
-        BridgeDomain updatedBridgeDomain = createBridgeDomain(updatedNetwork);
+        GbpBridgeDomain updatedBridgeDomain = createGbpBridgeDomain(updatedNetwork);
         if (updatedBridgeDomain != null) {
             rwTx.put(LogicalDatastoreType.CONFIGURATION, bdIid, updatedBridgeDomain, true);
         }
         DataStoreHelper.submitToDs(rwTx);
     }
 
-    private void deleteBridgeDomainIfPresent(ReadWriteTransaction rwTx, InstanceIdentifier<BridgeDomain> bdIid) {
-        Optional<BridgeDomain> readFromDs = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, bdIid, rwTx);
+    private void deleteBridgeDomainIfPresent(ReadWriteTransaction rwTx, InstanceIdentifier<GbpBridgeDomain> bdIid) {
+        Optional<GbpBridgeDomain> readFromDs = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, bdIid, rwTx);
         if (readFromDs.isPresent()) {
             rwTx.delete(LogicalDatastoreType.CONFIGURATION, bdIid);
         }
@@ -173,7 +172,7 @@ public class NetworkAware implements MappingProvider<Network> {
 
     @Override
     public void processDeletedNeutronDto(Network network) {
-        InstanceIdentifier<BridgeDomain> bdIid = getBridgeDomainIid(network.getUuid().getValue());
+        InstanceIdentifier<GbpBridgeDomain> bdIid = getGbpBridgeDomainIid(network.getUuid().getValue());
         ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
         deleteBridgeDomainIfPresent(rwTx, bdIid);
         DataStoreHelper.submitToDs(rwTx);
index c3eab90f1673e4ad518525b0da92962e23b32263..2a1e84bae8c90b6e8cc18f189b5597bb778f4f13 100644 (file)
@@ -28,8 +28,8 @@ import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.FlatNetwork;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomain;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRef;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRef;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;\r
@@ -70,8 +70,8 @@ public class NetworkAwareTest extends AbstractDataBrokerTest {
         Network network = createTestNetwork("net", netExtBuilder.build());\r
         networkAware.processCreatedNeutronDto(network);\r
         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
-        Optional<BridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
-                networkAware.getBridgeDomainIid(network.getUuid().getValue()), rTx);\r
+        Optional<GbpBridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                networkAware.getGbpBridgeDomainIid(network.getUuid().getValue()), rTx);\r
         assertTrue(optBrDomain.isPresent());\r
     }\r
 \r
@@ -84,8 +84,8 @@ public class NetworkAwareTest extends AbstractDataBrokerTest {
             .build();\r
         networkAware.processUpdatedNeutronDto(network1, network2);\r
         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
-        Optional<BridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
-                networkAware.getBridgeDomainIid(network2.getUuid().getValue()), rTx);\r
+        Optional<GbpBridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                networkAware.getGbpBridgeDomainIid(network2.getUuid().getValue()), rTx);\r
         assertTrue(optBrDomain.isPresent());\r
         assertEquals(optBrDomain.get().getDescription(), "net2");\r
     }\r
@@ -96,8 +96,8 @@ public class NetworkAwareTest extends AbstractDataBrokerTest {
         Network network = createTestNetwork("net1", netExtBuilder.build());\r
         networkAware.processDeletedNeutronDto(network);\r
         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
-        Optional<BridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
-                networkAware.getBridgeDomainIid(network.getUuid().getValue()), rTx);\r
+        Optional<GbpBridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                networkAware.getGbpBridgeDomainIid(network.getUuid().getValue()), rTx);\r
         assertFalse(optBrDomain.isPresent());\r
     }\r
 \r
@@ -106,7 +106,7 @@ public class NetworkAwareTest extends AbstractDataBrokerTest {
         netExtBuilder.setNetworkType(NetworkTypeVlan.class);\r
         netExtBuilder.setSegmentationId("2016");\r
         Network vlanNetwork = createTestNetwork("VlanNet", netExtBuilder.build());\r
-        BridgeDomain bridgeDomain = networkAware.createBridgeDomain(vlanNetwork);\r
+        GbpBridgeDomain bridgeDomain = networkAware.createGbpBridgeDomain(vlanNetwork);\r
         assertEquals(bridgeDomain.getId(), vlanNetwork.getUuid().getValue());\r
         assertEquals(bridgeDomain.getDescription(), vlanNetwork.getName());\r
         assertEquals(bridgeDomain.getType(), VlanNetwork.class);\r
@@ -117,7 +117,7 @@ public class NetworkAwareTest extends AbstractDataBrokerTest {
     public void testCreateBridgeDomain_flatNetwork() {\r
         netExtBuilder.setNetworkType(NetworkTypeFlat.class);\r
         Network flatNetwork = createTestNetwork("FlatNet", netExtBuilder.build());\r
-        BridgeDomain bridgeDomain = networkAware.createBridgeDomain(flatNetwork);\r
+        GbpBridgeDomain bridgeDomain = networkAware.createGbpBridgeDomain(flatNetwork);\r
         assertEquals(bridgeDomain.getId(), flatNetwork.getUuid().getValue());\r
         assertEquals(bridgeDomain.getDescription(), flatNetwork.getName());\r
         assertEquals(bridgeDomain.getType(), FlatNetwork.class);\r
@@ -128,14 +128,14 @@ public class NetworkAwareTest extends AbstractDataBrokerTest {
         netExtBuilder.setNetworkType(NetworkTypeFlat.class);\r
         netExtBuilder.setPhysicalNetwork(null);\r
         Network flatNetwork = createTestNetwork("FlatNet", netExtBuilder.build());\r
-        BridgeDomain bridgeDomain = networkAware.createBridgeDomain(flatNetwork);\r
+        GbpBridgeDomain bridgeDomain = networkAware.createGbpBridgeDomain(flatNetwork);\r
         assertNull(bridgeDomain.getPhysicalLocationRef());\r
     }\r
 \r
     @Test\r
     public void testCreateBridgeDomain_noNetworkType() {\r
         Network vlanNetwork = createTestNetwork("noTypeNet", new NetworkProviderExtensionBuilder().build());\r
-        BridgeDomain bridgeDomain = networkAware.createBridgeDomain(vlanNetwork);\r
+        GbpBridgeDomain bridgeDomain = networkAware.createGbpBridgeDomain(vlanNetwork);\r
         assertNull(bridgeDomain);\r
     }\r
 \r
index 852db5a5bf20c9fef0a815872ca8b90768fc47ab..bcf1b6ad6ff077743526de900b751c8a2c384119 100644 (file)
@@ -8,11 +8,20 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy;
 
-import java.util.Arrays;
-import java.util.Collection;
-
 import javax.annotation.Nonnull;
-
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
 import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
@@ -26,11 +35,15 @@ import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanVni;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.status.rev161005.BridgeDomainStatusAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.status.rev161005.BridgeDomainStatusFields.BridgeDomainStatus;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.NodeVbridgeAugment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyTypesVbridgeAugment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyTypesVbridgeAugmentBuilder;
@@ -62,15 +75,6 @@ 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.base.Preconditions;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
-
 public class BridgeDomainManagerImpl implements BridgeDomainManager {
 
     private static final Logger LOG = LoggerFactory.getLogger(BridgeDomainManagerImpl.class);
@@ -78,8 +82,8 @@ public class BridgeDomainManagerImpl implements BridgeDomainManager {
     private static final TopologyTypes VBRIDGE_TOPOLOGY_TYPE = new TopologyTypesBuilder().addAugmentation(
             TopologyTypesVbridgeAugment.class,
             new TopologyTypesVbridgeAugmentBuilder().setVbridgeTopology(new VbridgeTopologyBuilder().build()).build())
-        .build();
-    private final DataBroker dataProvder;
+            .build();
+    private final DataBroker dataProvider;
 
     private static final class ListenableFutureSetter<T extends DataObject>
             implements ClusteredDataTreeChangeListener<T> {
@@ -91,7 +95,7 @@ public class BridgeDomainManagerImpl implements BridgeDomainManager {
         private final ListenerRegistration<ListenableFutureSetter<T>> registeredListener;
 
         private ListenableFutureSetter(DataBroker dataProvider, SettableFuture<Void> future,
-                DataTreeIdentifier<T> iid, ModificationType modificationForFutureSet) {
+                                       DataTreeIdentifier<T> iid, ModificationType modificationForFutureSet) {
             this.future = Preconditions.checkNotNull(future);
             Preconditions.checkArgument(!future.isDone());
             this.modificationForFutureSet = Preconditions.checkNotNull(modificationForFutureSet);
@@ -101,18 +105,44 @@ public class BridgeDomainManagerImpl implements BridgeDomainManager {
         }
 
         @Override
-        public void onDataTreeChanged(Collection<DataTreeModification<T>> changes) {
-            changes.forEach(modif -> {
-                DataObjectModification<T> rootNode = modif.getRootNode();
-                ModificationType modificationType = rootNode.getModificationType();
+        public void onDataTreeChanged(@Nonnull final Collection<DataTreeModification<T>> changes) {
+            changes.forEach(modification -> {
+                final DataObjectModification<T> rootNode = modification.getRootNode();
+                final ModificationType modificationType = rootNode.getModificationType();
                 if (modificationType == modificationForFutureSet) {
                     LOG.debug("{} in OPER DS: {}", modificationType.name(), iid.getRootIdentifier());
-                    unregisterOnTrue(future.set(null));
+                    final T data = rootNode.getDataAfter();
+                    // If waiting for bridge domain creation, do more specific check about BD status
+                    if (data != null && data instanceof BridgeDomain) {
+                        final BridgeDomain domain = (BridgeDomain) data;
+                        final BridgeDomainStatusAugmentation statusAugment =
+                                domain.getAugmentation(BridgeDomainStatusAugmentation.class);
+                        final BridgeDomainStatus status = statusAugment.getBridgeDomainStatus();
+                        switch (status) {
+                            case Started: {
+                                LOG.debug("Bridge domain {} started", domain.getName());
+                                unregister(future.set(null));
+                                break;
+                            }
+                            case Failed: {
+                                LOG.warn("Bridge domain {} failed to start", domain.getName());
+                                unregister(future.set(null));
+                                break;
+                            }
+                            case Starting:
+                            case Stopped: {
+                                LOG.debug("Bridge domain {} status changed to {}", domain.getName(), status.getName());
+                                break;
+                            }
+                        }
+                    } else {
+                        unregister(future.set(null));
+                    }
                 }
             });
         }
 
-        private void unregisterOnTrue(boolean _true) {
+        private void unregister(boolean _true) {
             if (_true) {
                 LOG.debug("Unregistering listener for path {}", iid.getRootIdentifier());
                 if (registeredListener != null) {
@@ -122,58 +152,65 @@ public class BridgeDomainManagerImpl implements BridgeDomainManager {
         }
     }
 
-    public BridgeDomainManagerImpl(DataBroker dataProvder) {
-        this.dataProvder = Preconditions.checkNotNull(dataProvder);
+    public BridgeDomainManagerImpl(DataBroker dataProvider) {
+        this.dataProvider = Preconditions.checkNotNull(dataProvider);
+    }
+
+    private static NodeBuilder createBasicVppNodeBuilder(NodeId nodeId) {
+        return new NodeBuilder().setNodeId(nodeId).setSupportingNode(Collections.singletonList(
+                new SupportingNodeBuilder().setTopologyRef(SUPPORTING_TOPOLOGY_NETCONF).setNodeRef(nodeId).build()));
     }
 
     @Override
-    public ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName,
-            @Nonnull VxlanVni vni, @Nonnull NodeId vppNodeId) {
-        TopologyVbridgeAugment topoAug = new TopologyVbridgeAugmentBuilder().setTunnelType(TunnelTypeVxlan.class)
-            .setArpTermination(false)
-            .setFlood(true)
-            .setForward(true)
-            .setLearn(true)
-            .setUnknownUnicastFlood(true)
-            .setTunnelParameters(new VxlanTunnelParametersBuilder().setVni(vni).build())
-            .build();
-        return createBridgeDomainOnVppNode(bridgeDomainName, topoAug,
+    public ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull final String bridgeDomainName,
+                                                                   @Nonnull final VxlanVni vni,
+                                                                   @Nonnull final NodeId vppNodeId) {
+        TopologyVbridgeAugment topologyAug = new TopologyVbridgeAugmentBuilder().setTunnelType(TunnelTypeVxlan.class)
+                .setArpTermination(false)
+                .setFlood(true)
+                .setForward(true)
+                .setLearn(true)
+                .setUnknownUnicastFlood(true)
+                .setTunnelParameters(new VxlanTunnelParametersBuilder().setVni(vni).build())
+                .build();
+        return createBridgeDomainOnVppNode(bridgeDomainName, topologyAug,
                 createBasicVppNodeBuilder(vppNodeId).build());
     }
 
     @Override
-    public ListenableFuture<Void> createVlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName,
-            @Nonnull VlanId vlanId, @Nonnull NodeId vppNodeId) {
-        TopologyVbridgeAugment topoAug = new TopologyVbridgeAugmentBuilder().setTunnelType(TunnelTypeVlan.class)
-            .setArpTermination(false)
-            .setFlood(true)
-            .setForward(true)
-            .setLearn(true)
-            .setUnknownUnicastFlood(true)
-            .setTunnelParameters(
-                    new VlanNetworkParametersBuilder().setVlanId(vlanId).setVlanType(_802dot1q.class).build())
-            .build();
-        InstanceIdentifier<BridgeDomain> bridgeDomainConfigIid = InstanceIdentifier.builder(Config.class)
-            .child(BridgeDomain.class, new BridgeDomainKey(bridgeDomainName))
-            .build();
-        ReadOnlyTransaction rTx = dataProvder.newReadOnlyTransaction();
-        CheckedFuture<Optional<BridgeDomain>, ReadFailedException> futureTopology =
+    public ListenableFuture<Void> createVlanBridgeDomainOnVppNode(@Nonnull final String bridgeDomainName,
+                                                                  @Nonnull final VlanId vlanId,
+                                                                  @Nonnull final NodeId vppNodeId) {
+        TopologyVbridgeAugment topologyAug = new TopologyVbridgeAugmentBuilder().setTunnelType(TunnelTypeVlan.class)
+                .setArpTermination(false)
+                .setFlood(true)
+                .setForward(true)
+                .setLearn(true)
+                .setUnknownUnicastFlood(true)
+                .setTunnelParameters(
+                        new VlanNetworkParametersBuilder().setVlanId(vlanId).setVlanType(_802dot1q.class).build())
+                .build();
+        InstanceIdentifier<GbpBridgeDomain> bridgeDomainConfigIid = InstanceIdentifier.builder(Config.class)
+                .child(GbpBridgeDomain.class, new GbpBridgeDomainKey(bridgeDomainName))
+                .build();
+        ReadOnlyTransaction rTx = dataProvider.newReadOnlyTransaction();
+        CheckedFuture<Optional<GbpBridgeDomain>, ReadFailedException> futureTopology =
                 rTx.read(LogicalDatastoreType.CONFIGURATION, bridgeDomainConfigIid);
         rTx.close();
-        return Futures.transform(futureTopology, new AsyncFunction<Optional<BridgeDomain>, Void>() {
+        return Futures.transform(futureTopology, new AsyncFunction<Optional<GbpBridgeDomain>, Void>() {
 
             @Override
-            public ListenableFuture<Void> apply(Optional<BridgeDomain> optBridgeDomainConf) throws Exception {
+            public ListenableFuture<Void> apply(@Nonnull Optional<GbpBridgeDomain> optBridgeDomainConf) throws Exception {
                 if (optBridgeDomainConf.isPresent() && optBridgeDomainConf.get().getPhysicalLocationRef() != null) {
                     for (PhysicalLocationRef ref : optBridgeDomainConf.get().getPhysicalLocationRef()) {
                         if (!ref.getNodeId().equals(vppNodeId)) continue; //not our referenced node skipping
 
                         if (ref.getInterface() != null && ref.getInterface().size() > 0) {
                             NodeVbridgeVlanAugment vppNodeVlanAug = new NodeVbridgeVlanAugmentBuilder()
-                                .setSuperInterface(ref.getInterface().get(0)).build();
+                                    .setSuperInterface(ref.getInterface().get(0)).build();
                             Node vppNode = createBasicVppNodeBuilder(vppNodeId)
-                                .addAugmentation(NodeVbridgeVlanAugment.class, vppNodeVlanAug).build();
-                            return createBridgeDomainOnVppNode(bridgeDomainName, topoAug, vppNode);
+                                    .addAugmentation(NodeVbridgeVlanAugment.class, vppNodeVlanAug).build();
+                            return createBridgeDomainOnVppNode(bridgeDomainName, topologyAug, vppNode);
                         }
                     }
                 }
@@ -183,61 +220,103 @@ public class BridgeDomainManagerImpl implements BridgeDomainManager {
         });
     }
 
-    private static NodeBuilder createBasicVppNodeBuilder(NodeId nodeId) {
-        return new NodeBuilder().setNodeId(nodeId).setSupportingNode(Arrays.asList(
-                new SupportingNodeBuilder().setTopologyRef(SUPPORTING_TOPOLOGY_NETCONF).setNodeRef(nodeId).build()));
-    }
-
-    private ListenableFuture<Void> createBridgeDomainOnVppNode(@Nonnull String bridgeDomainName,
-            final TopologyVbridgeAugment vBridgeAug, Node vppNode) {
-        TopologyKey topologyKey = new TopologyKey(new TopologyId(bridgeDomainName));
-        ReadOnlyTransaction rTx = dataProvder.newReadOnlyTransaction();
-        InstanceIdentifier<Topology> topologyIid = VppIidFactory.getTopologyIid(topologyKey);
-        CheckedFuture<Optional<Topology>, ReadFailedException> futureTopology =
+    /**
+     * Method checks whether bridge domain already exists in topology under its {@link TopologyId}. If not, BD is
+     * written into CONF DS (request for VBD) and registers listener which awaits result from VBD. Result can be
+     * checked in OPER DS as a {@link BridgeDomainStatus}. If status is {@link BridgeDomainStatus#Started}, listener
+     * unregisters itself and bridge domain creation in VBD is considered successful.
+     * <p>
+     * Next part creates request for {@link BridgeMember} in topology CONF DS and registers listener listening on
+     * topology OPER DS. If bridge member is created in VBD, listener is closed.
+     * <p>
+     * This process has limited time, limit is defined in {@link ForwardingManager#WAIT_FOR_BD_CREATION} to prevent
+     * stuck if VBD processing fails in some point.
+     *
+     * @param bridgeDomainName serving as a topology-id
+     * @param vBridgeAug       augmented data in BD
+     * @param vppNode          transformed into bridge member
+     * @return composed future which serves as a marker for caller method that the computation is done. If future is
+     * not returned in time, {@link TimeoutException} will be thrown there.
+     */
+    private ListenableFuture<Void> createBridgeDomainOnVppNode(@Nonnull final String bridgeDomainName,
+                                                               @Nonnull final TopologyVbridgeAugment vBridgeAug,
+                                                               @Nonnull final Node vppNode) {
+        final TopologyKey topologyKey = new TopologyKey(new TopologyId(bridgeDomainName));
+        final ReadOnlyTransaction rTx = dataProvider.newReadOnlyTransaction();
+        final InstanceIdentifier<Topology> topologyIid = VppIidFactory.getTopologyIid(topologyKey);
+        final CheckedFuture<Optional<Topology>, ReadFailedException> optTopology =
                 rTx.read(LogicalDatastoreType.CONFIGURATION, topologyIid);
         rTx.close();
-        return Futures.transform(futureTopology, new AsyncFunction<Optional<Topology>, Void>() {
-
+        return Futures.transform(optTopology, new AsyncFunction<Optional<Topology>, Void>() {
             @Override
-            public ListenableFuture<Void> apply(Optional<Topology> optTopology) throws Exception {
-                WriteTransaction wTx = dataProvder.newWriteOnlyTransaction();
+            public ListenableFuture<Void> apply(@Nonnull final Optional<Topology> optTopology)
+                    throws InterruptedException, ExecutionException {
+                // Topology
+                final SettableFuture<Void> topologyFuture = SettableFuture.create();
                 if (!optTopology.isPresent()) {
-                    Topology topology = new TopologyBuilder().setKey(topologyKey)
-                        .setTopologyTypes(VBRIDGE_TOPOLOGY_TYPE)
-                        .addAugmentation(TopologyVbridgeAugment.class, vBridgeAug)
-                        .build();
-                    wTx.put(LogicalDatastoreType.CONFIGURATION, topologyIid,
-                            topology, true);
-                }
-                InstanceIdentifier<Node> nodeIid = VppIidFactory.getNodeIid(topologyKey, vppNode.getKey());
-                wTx.put(LogicalDatastoreType.CONFIGURATION, nodeIid, vppNode);
-                SettableFuture<Void> future = SettableFuture.create();
-                Futures.addCallback(wTx.submit(), new FutureCallback<Void>() {
+                    final WriteTransaction wTx = dataProvider.newWriteOnlyTransaction();
+                    final Topology topology = new TopologyBuilder().setKey(topologyKey)
+                            .setTopologyTypes(VBRIDGE_TOPOLOGY_TYPE)
+                            .addAugmentation(TopologyVbridgeAugment.class, vBridgeAug)
+                            .build();
+                    wTx.put(LogicalDatastoreType.CONFIGURATION, topologyIid, topology, true);
+                    Futures.addCallback(wTx.submit(), new FutureCallback<Void>() {
 
-                    @Override
-                    public void onSuccess(Void result) {
-                        DataTreeIdentifier<BridgeMember> bridgeMemberIid =
-                                new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
-                                        nodeIid.augmentation(NodeVbridgeAugment.class).child(BridgeMember.class));
-                        LOG.debug("Request create node in topology for VBD was stored to CONF DS. {}", nodeIid);
-                        new ListenableFutureSetter<>(dataProvder, future, bridgeMemberIid,
-                                ModificationType.WRITE);
-                    }
+                        @Override
+                        public void onSuccess(@Nullable final Void result) {
+                            final InstanceIdentifier<BridgeDomain> bridgeDomainStateIid =
+                                    VppIidFactory.getBridgeDomainStateIid(new BridgeDomainKey(bridgeDomainName));
+                            final DataTreeIdentifier<BridgeDomain> bridgeDomainStateIidDTI = new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
+                                    bridgeDomainStateIid);
+                            new ListenableFutureSetter<>(dataProvider, topologyFuture, bridgeDomainStateIidDTI, ModificationType.WRITE);
+                        }
 
+                        @Override
+                        public void onFailure(@Nonnull Throwable t) {
+                            LOG.warn("Request create topology for VBD was not stored to CONF DS. {}", topologyIid, t);
+                            topologyFuture.setException(new Exception("Cannot send request to VBD."));
+                        }
+                    });
+                } else {
+                    topologyFuture.set(null);
+                }
+                return Futures.transform(topologyFuture, new AsyncFunction<Void, Void>() {
                     @Override
-                    public void onFailure(Throwable t) {
-                        LOG.warn("Request create node in topology for VBD was not stored to CONF DS. {}", nodeIid, t);
-                        future.setException(new Exception("Cannot send request to VBD."));
+                    public ListenableFuture<Void> apply(@Nonnull Void topologyInput) throws Exception {
+                        // Bridge member
+                        final SettableFuture<Void> futureBridgeMember = SettableFuture.create();
+                        final InstanceIdentifier<Node> nodeIid = VppIidFactory.getNodeIid(topologyKey, vppNode.getKey());
+                        final WriteTransaction wTx = dataProvider.newWriteOnlyTransaction();
+                        wTx.put(LogicalDatastoreType.CONFIGURATION, nodeIid, vppNode);
+                        Futures.addCallback(wTx.submit(), new FutureCallback<Void>() {
+
+                            @Override
+                            public void onSuccess(@Nullable final Void _void) {
+                                final DataTreeIdentifier<BridgeMember> bridgeMemberIid =
+                                        new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
+                                                nodeIid.augmentation(NodeVbridgeAugment.class).child(BridgeMember.class));
+                                LOG.debug("Request create node in topology for VBD was stored to CONF DS. {}", nodeIid);
+                                new ListenableFutureSetter<>(dataProvider, futureBridgeMember, bridgeMemberIid,
+                                        ModificationType.WRITE);
+                            }
+
+                            @Override
+                            public void onFailure(@Nonnull final Throwable t) {
+                                LOG.warn("Request create node in topology for VBD was not stored to CONF DS. {}", nodeIid, t);
+                                futureBridgeMember.setException(new Exception("Cannot send request to VBD."));
+                            }
+                        });
+                        return futureBridgeMember;
                     }
                 });
-                return future;
             }
         });
     }
 
     @Override
-    public ListenableFuture<Void> removeBridgeDomainFromVppNode(@Nonnull String bridgeDomainName, NodeId vppNode) {
-        WriteTransaction wTx = dataProvder.newWriteOnlyTransaction();
+    public ListenableFuture<Void> removeBridgeDomainFromVppNode(@Nonnull final String bridgeDomainName,
+                                                                @Nonnull final NodeId vppNode) {
+        WriteTransaction wTx = dataProvider.newWriteOnlyTransaction();
         InstanceIdentifier<Node> nodeIid =
                 VppIidFactory.getNodeIid(new TopologyKey(new TopologyId(bridgeDomainName)), new NodeKey(vppNode));
         wTx.delete(LogicalDatastoreType.CONFIGURATION, nodeIid);
@@ -250,16 +329,15 @@ public class BridgeDomainManagerImpl implements BridgeDomainManager {
                         new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
                                 nodeIid.augmentation(NodeVbridgeAugment.class).child(BridgeMember.class));
                 LOG.debug("Request delete node in topology for VBD was stored to CONF DS. {}", nodeIid);
-                new ListenableFutureSetter<>(dataProvder, future, bridgeMemberIid, ModificationType.DELETE);
+                new ListenableFutureSetter<>(dataProvider, future, bridgeMemberIid, ModificationType.DELETE);
             }
 
             @Override
-            public void onFailure(Throwable t) {
+            public void onFailure(@Nonnull Throwable t) {
                 LOG.warn("Request delete node in topology for VBD was not stored to CONF DS. {}", nodeIid, t);
                 future.setException(new Exception("Cannot send request to VBD."));
             }
         });
         return future;
     }
-
 }
index 6e7ed5a1717898c33c32bcf13679597d77b72b1e..d98d6581735b71e27f3d76a305ab8be22ccf0553 100644 (file)
@@ -43,8 +43,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanVni;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
@@ -63,7 +63,7 @@ public final class ForwardingManager {
 
     private static final Logger LOG = LoggerFactory.getLogger(ForwardingManager.class);
     @VisibleForTesting
-    static long WAIT_FOR_BD_CREATION = 10; // seconds
+    private byte WAIT_FOR_BD_CREATION = 60; // seconds
     private long lastVxlanVni = 1L;
     private final Map<String, VxlanVni> vxlanVniByBridgeDomain = new HashMap<>();
     private final InterfaceManager ifaceManager;
@@ -75,9 +75,9 @@ public final class ForwardingManager {
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
     }
 
-    public Optional<BridgeDomain> readBridgeDomainConfig(String name) {
-        InstanceIdentifier<BridgeDomain> bdIid = InstanceIdentifier.builder(Config.class)
-            .child(BridgeDomain.class, new BridgeDomainKey(name))
+    public Optional<GbpBridgeDomain> readGbpBridgeDomainConfig(String name) {
+        InstanceIdentifier<GbpBridgeDomain> bdIid = InstanceIdentifier.builder(Config.class)
+            .child(GbpBridgeDomain.class, new GbpBridgeDomainKey(name))
             .build();
         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
         return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, bdIid, rTx);
@@ -85,7 +85,7 @@ public final class ForwardingManager {
 
     public void createBridgeDomainOnNodes(SetMultimap<String, NodeId> vppNodesByBridgeDomain) {
         for (String bd : vppNodesByBridgeDomain.keySet()) {
-            Optional<BridgeDomain> bdConfig = readBridgeDomainConfig(bd);
+            Optional<GbpBridgeDomain> bdConfig = readGbpBridgeDomainConfig(bd);
             Set<NodeId> vppNodes = vppNodesByBridgeDomain.get(bd);
             if (bdConfig.isPresent()) {
                 if (bdConfig.get().getType().equals(VlanNetwork.class)) {
@@ -102,41 +102,41 @@ public final class ForwardingManager {
         }
     }
 
-    private void createVxlanBridgeDomains(String bd, VxlanVni vni, Set<NodeId> vppNodes) {
+    private void createVxlanBridgeDomains(final String bd, final VxlanVni vni, final Set<NodeId> vppNodes) {
         for (NodeId vppNode : vppNodes) {
             try {
                 LOG.debug("Creating VXLAN bridge-domain {} on node {} with VNI {}", bd, vppNode.getValue(),
                         vni);
-                // TODO think about propagating ListenableFuture - timeout set as workaround
                 bdManager.createVxlanBridgeDomainOnVppNode(bd, vni, vppNode).get(WAIT_FOR_BD_CREATION,
                         TimeUnit.SECONDS);
             } catch (InterruptedException | ExecutionException e) {
                 LOG.warn("VXLAN Bridge domain {} was not created on node {}", bd, vppNode.getValue(), e);
             } catch (TimeoutException e) {
                 LOG.warn("Probably, VXLAN Bridge domain {} was not created on node {} because BridgeDomainManager "
-                        + "did not respond by {} seconds.", bd, vppNode.getValue(), WAIT_FOR_BD_CREATION, e);
+                        + "did not respond by {} seconds. Check VBD log for more details",
+                        bd, vppNode.getValue(), WAIT_FOR_BD_CREATION, e);
             }
         }
     }
 
-    private void createVlanBridgeDomains(String bd, VlanId vlanId, Set<NodeId> vppNodes) {
+    private void createVlanBridgeDomains(final String bd, final VlanId vlanId, final Set<NodeId> vppNodes) {
         for (NodeId vppNode : vppNodes) {
             try {
                 LOG.debug("Creating VLAN bridge-domain {} on node {} with VLAN ID {}", bd, vppNode.getValue(),
                         vlanId.getValue());
-                // TODO think about propagating ListenableFuture - timeout set as workaround
                 bdManager.createVlanBridgeDomainOnVppNode(bd, vlanId, vppNode).get(WAIT_FOR_BD_CREATION,
                         TimeUnit.SECONDS);
             } catch (InterruptedException | ExecutionException e) {
                 LOG.warn("VLAN Bridge domain {} was not created on node {}", bd, vppNode.getValue(), e);
             } catch (TimeoutException e) {
                 LOG.warn("Probably, VLAN Bridge domain {} was not created on node {} because BridgeDomainManager "
-                        + "did not respond by {} seconds.", bd, vppNode.getValue(), WAIT_FOR_BD_CREATION, e);
+                        + "did not respond by {} seconds. Check VBD log for more details",
+                        bd, vppNode.getValue(), WAIT_FOR_BD_CREATION, e);
             }
         }
     }
 
-    public void removeBridgeDomainOnNodes(SetMultimap<String, NodeId> vppNodesByBridgeDomain) {
+    public void removeBridgeDomainOnNodes(final SetMultimap<String, NodeId> vppNodesByBridgeDomain) {
         for (String bd : vppNodesByBridgeDomain.keySet()) {
             Set<NodeId> vppNodes = vppNodesByBridgeDomain.get(bd);
             for (NodeId vppNode : vppNodes) {
@@ -147,7 +147,8 @@ public final class ForwardingManager {
                     LOG.warn("Bridge domain {} was not removed from node {}", bd, vppNode.getValue(), e);
                 } catch (TimeoutException e) {
                     LOG.warn("Probably, bridge domain {} was not removed from node {} because BridgeDomainManager "
-                            + "did not respond by {} seconds.", bd, vppNode.getValue(), WAIT_FOR_BD_CREATION, e);
+                            + "did not respond by {} seconds. Check VBD log for more details",
+                            bd, vppNode.getValue(), WAIT_FOR_BD_CREATION, e);
                 }
             }
         }
@@ -158,7 +159,7 @@ public final class ForwardingManager {
         ExternalLocationCase rEpLoc = resolveAndValidateLocation(rEp);
         if (Strings.isNullOrEmpty(rEpLoc.getExternalNodeConnector())) {
             // TODO add it to the status for renderer manager
-            LOG.info("Rednerer endpoint does not have external-node-connector therefore it is ignored {}", rEp);
+            LOG.info("Renderer endpoint does not have external-node-connector therefore it is ignored {}", rEp);
             return;
         }
 
@@ -166,7 +167,7 @@ public final class ForwardingManager {
             java.util.Optional<String> optL2FloodDomain = resolveL2FloodDomain(rEp, policyCtx);
             if (!optL2FloodDomain.isPresent()) {
                 // TODO add it to the status for renderer manager
-                LOG.info("Rednerer endpoint does not have l2FloodDomain as network containment {}", rEp);
+                LOG.info("Renderer endpoint does not have l2FloodDomain as network containment {}", rEp);
                 return;
             }
             String l2FloodDomain = optL2FloodDomain.get();
@@ -252,7 +253,7 @@ public final class ForwardingManager {
         return java.util.Optional.empty();
     }
 
-    public static @Nonnull java.util.Optional<RendererForwardingContext> getForwardingCtxForParent(
+    private static @Nonnull java.util.Optional<RendererForwardingContext> getForwardingCtxForParent(
             @Nullable TenantId tenant, @Nullable Parent parent,
             Table<TenantId, RendererForwardingContextKey, RendererForwardingContext> forwardingCtxTable) {
         if (tenant == null || parent == null) {
@@ -265,4 +266,8 @@ public final class ForwardingManager {
         return java.util.Optional.empty();
     }
 
+    @VisibleForTesting
+    void setTimer(byte time) {
+        WAIT_FOR_BD_CREATION = time;
+    }
 }
index 50426de3ae3caaf1a4f099a1bddcbe4fd5701d0d..bb79a83f74110609cc7cdc454081423a5ad75054 100644 (file)
@@ -18,6 +18,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomains;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomainKey;
 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;
@@ -37,28 +41,35 @@ public class VppIidFactory {
 
     public static InstanceIdentifier<RendererNodes> getRendererNodesIid() {
         return InstanceIdentifier.builder(Renderers.class)
-            .child(Renderer.class, new RendererKey(VppRenderer.NAME))
-            .child(RendererNodes.class)
-            .build();
+                .child(Renderer.class, new RendererKey(VppRenderer.NAME))
+                .child(RendererNodes.class)
+                .build();
     }
 
     public static InstanceIdentifier<RendererNode> getRendererNodeIid(RendererNode rendererNode) {
         return InstanceIdentifier.builder(Renderers.class)
-            .child(Renderer.class, new RendererKey(VppRenderer.NAME))
-            .child(RendererNodes.class)
-            .child(RendererNode.class, new RendererNodeKey(rendererNode.getNodePath()))
-            .build();
+                .child(Renderer.class, new RendererKey(VppRenderer.NAME))
+                .child(RendererNodes.class)
+                .child(RendererNode.class, new RendererNodeKey(rendererNode.getNodePath()))
+                .build();
     }
 
     public static InstanceIdentifier<Node> getNodeIid(TopologyKey topologyKey, NodeKey nodeKey) {
         return InstanceIdentifier.builder(NetworkTopology.class)
-            .child(Topology.class, topologyKey)
-            .child(Node.class, nodeKey)
-            .build();
+                .child(Topology.class, topologyKey)
+                .child(Node.class, nodeKey)
+                .build();
     }
 
     public static InstanceIdentifier<Topology> getTopologyIid(TopologyKey bridgeDomainKey) {
         return InstanceIdentifier.builder(NetworkTopology.class)
                 .child(Topology.class, bridgeDomainKey).build();
     }
+
+    public static InstanceIdentifier<BridgeDomain> getBridgeDomainStateIid(final BridgeDomainKey bridgeDomainStateKey) {
+        return InstanceIdentifier.builder(VppState.class)
+                .child(BridgeDomains.class)
+                .child(BridgeDomain.class, bridgeDomainStateKey)
+                .build();
+    }
 }
index 46f3c5a50170258be2d1ca5fe4f7347ed51413c0..2c6ae2b5b586591c326cf1898d98da266c629135 100644 (file)
@@ -92,7 +92,7 @@ module vpp-renderer {
             }
         }
 
-        list bridge-domain {
+        list gbp-bridge-domain {
             key "id";
             leaf id {
                 description "Same as in VBD.";
index c89e4249505daa063ee2655565a49a1615dedef2..f80628a0c684e64c9b4fcfcac13306c4958db15a 100644 (file)
@@ -8,16 +8,20 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy;
 
+import javax.annotation.Nonnull;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.concurrent.ExecutionException;
 
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.Mockito;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
 import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
@@ -59,11 +63,11 @@ public class BridgeDomainManagerImplTest extends CustomDataBrokerTest {
     private final static boolean BRIDGE_DOMAIN_ARP = false;
     private final static NodeId VPP_NODE_ID = new NodeId("vppNode");
     private final static Topology BASE_TOPOLOGY = new TopologyBuilder().setTopologyId(BASE_TOPOLOGY_ID)
-        .setNode(Arrays.asList(new NodeBuilder().setNodeId(VPP_NODE_ID)
-            .setSupportingNode(Arrays.asList(new SupportingNodeBuilder().setTopologyRef(SUPPORTING_TOPOLOGY_NETCONF)
-                .setNodeRef(VPP_NODE_ID)
+        .setNode(Collections.singletonList(new NodeBuilder().setNodeId(VPP_NODE_ID)
+                .setSupportingNode(Collections.singletonList(new SupportingNodeBuilder().setTopologyRef(SUPPORTING_TOPOLOGY_NETCONF)
+                        .setNodeRef(VPP_NODE_ID)
+                        .build()))
                 .build()))
-            .build()))
         .setTopologyTypes(new TopologyTypesBuilder()
             .addAugmentation(TopologyTypesVbridgeAugment.class, new TopologyTypesVbridgeAugmentBuilder()
                 .setVbridgeTopology(new VbridgeTopologyBuilder().build()).build())
@@ -83,6 +87,7 @@ public class BridgeDomainManagerImplTest extends CustomDataBrokerTest {
     private BridgeDomainManagerImpl bridgeDomainManager;
 
     @Override
+    @Nonnull
     public Collection<Class<?>> getClassesFromModules() {
         return Arrays.asList(NetworkTopology.class, Topology.class, TopologyVbridgeAugment.class,
                 TunnelTypeVxlan.class);
@@ -92,12 +97,14 @@ public class BridgeDomainManagerImplTest extends CustomDataBrokerTest {
     public void init() {
         dataBroker = getDataBroker();
         bridgeDomainManager = new BridgeDomainManagerImpl(dataBroker);
+        final InterfaceManager interfaceManager = Mockito.mock(InterfaceManager.class);
+        final ForwardingManager fwManager = new ForwardingManager(interfaceManager, bridgeDomainManager, dataBroker);
+        fwManager.setTimer((byte) 1);
     }
 
     @Test
     public void testCreateVxlanBridgeDomainOnVppNode() throws Exception {
         bridgeDomainManager.createVxlanBridgeDomainOnVppNode(BRIDGE_DOMAIN_ID, BRIDGE_DOMAIN_VNI, VPP_NODE_ID);
-
         // simulates VBD - when BD is created a node is stored to OPER DS
         Thread vbdThread = new Thread(() -> {
             WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
@@ -121,7 +128,8 @@ public class BridgeDomainManagerImplTest extends CustomDataBrokerTest {
         Assert.assertTrue(topologyOptional.isPresent());
 
         Topology topology = topologyOptional.get();
-        Assert.assertEquals(BASE_TOPOLOGY, topology);
+        Assert.assertEquals(BASE_TOPOLOGY.getAugmentation(TopologyVbridgeAugment.class),
+                topology.getAugmentation(TopologyVbridgeAugment.class));
     }
 
     @Test
index c341e6aea685a845cf09250488c6bdbb17f96618..c4e30b166629430b84863a9bec88416fbaa03747 100644 (file)
@@ -31,12 +31,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.NetworkTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanVni;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
@@ -67,22 +66,22 @@ public class ForwardingManagerTest extends CustomDataBrokerTest {
 
     @Override
     public Collection<Class<?>> getClassesFromModules() {
-        return Arrays.asList(BridgeDomain.class);
+        return Arrays.asList(GbpBridgeDomain.class);
     }
 
     @Test
     public void testReadBridgeDomainConfig() throws Exception {
-        BridgeDomain bd = new BridgeDomainBuilder().setId(BD_1).setType(NetworkTypeBase.class).build();
-        InstanceIdentifier<BridgeDomain> bdIid =
-                InstanceIdentifier.builder(Config.class).child(BridgeDomain.class, bd.getKey()).build();
-        Optional<BridgeDomain> bdOptional = fwdManager.readBridgeDomainConfig(bd.getId());
+        GbpBridgeDomain bd = new GbpBridgeDomainBuilder().setId(BD_1).setType(NetworkTypeBase.class).build();
+        InstanceIdentifier<GbpBridgeDomain> bdIid =
+                InstanceIdentifier.builder(Config.class).child(GbpBridgeDomain.class, bd.getKey()).build();
+        Optional<GbpBridgeDomain> bdOptional = fwdManager.readGbpBridgeDomainConfig(bd.getId());
         Assert.assertFalse(bdOptional.isPresent());
 
         WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.CONFIGURATION, bdIid, bd);
         wTx.submit().get();
 
-        bdOptional = fwdManager.readBridgeDomainConfig(bd.getId());
+        bdOptional = fwdManager.readGbpBridgeDomainConfig(bd.getId());
         Assert.assertTrue(bdOptional.isPresent());
         Assert.assertEquals(bd, bdOptional.get());
     }
@@ -104,9 +103,9 @@ public class ForwardingManagerTest extends CustomDataBrokerTest {
         Mockito.when(bdManager.createVlanBridgeDomainOnVppNode(Mockito.eq(BD_1), Mockito.any(VlanId.class),
                 Mockito.eq(NODE_1)))
             .thenReturn(Futures.immediateFuture(null));
-        BridgeDomain bd = new BridgeDomainBuilder().setId(BD_1).setType(VlanNetwork.class).setVlan(VLAN_1).build();
-        InstanceIdentifier<BridgeDomain> bdIid =
-                InstanceIdentifier.builder(Config.class).child(BridgeDomain.class, bd.getKey()).build();
+        GbpBridgeDomain bd = new GbpBridgeDomainBuilder().setId(BD_1).setType(VlanNetwork.class).setVlan(VLAN_1).build();
+        InstanceIdentifier<GbpBridgeDomain> bdIid =
+                InstanceIdentifier.builder(Config.class).child(GbpBridgeDomain.class, bd.getKey()).build();
         WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.CONFIGURATION, bdIid, bd);
         wTx.submit().get();
index d9a37aa4bbcd1f186c5446f0883bf782805bec75..f0e189ca366c4b80a318b997b479e12aca841b13 100644 (file)
@@ -24,7 +24,6 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.DtoFactory;
-import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.RendererPolicyConfEvent;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.VppEndpointConfEvent;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
@@ -51,7 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_render
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanVni;
@@ -79,7 +78,7 @@ public class VppRendererPolicyManagerTest extends CustomDataBrokerTest {
     private DataBroker mountPointDataBroker;
     private DataBroker dataBroker;
 
-    private BridgeDomainManager bdManager;
+    private BridgeDomainManagerImpl bdManager;
     private InterfaceManager ifaceManager;
     private ForwardingManager fwManager;
     private VppRendererPolicyManager vppRendererPolicyManager;
@@ -93,7 +92,6 @@ public class VppRendererPolicyManagerTest extends CustomDataBrokerTest {
 
     @Before
     public void init() throws Exception {
-        ForwardingManager.WAIT_FOR_BD_CREATION = 2;
         mountedDataProviderMock = Mockito.mock(MountedDataBrokerProvider.class);
         mountPointDataBroker = getDataBroker();
         setup(); // initialize new data broker for ODL data store
@@ -105,6 +103,7 @@ public class VppRendererPolicyManagerTest extends CustomDataBrokerTest {
         bdManager = new BridgeDomainManagerImpl(mountPointDataBroker);
         fwManager = new ForwardingManager(ifaceManager, bdManager, dataBroker);
         vppRendererPolicyManager = new VppRendererPolicyManager(fwManager, dataBroker);
+        fwManager.setTimer((byte) 1);
     }
 
     @Test