Bug 8873 - Bundle based reconciliation to enable bundling of messages 20/60520/13
authoreeiillu <suja.t@ericsson.com>
Tue, 18 Jul 2017 05:13:00 +0000 (10:43 +0530)
committerSuja T <suja.t@ericsson.com>
Fri, 4 Aug 2017 10:38:50 +0000 (10:38 +0000)
Change-Id: Ida09badca9a16619fec6e6f293042956ce8ec4e4
Signed-off-by: eeiillu <suja.t@ericsson.com>
applications/forwardingrules-manager/pom.xml
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesManager.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesProperty.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowNodeReconciliationImpl.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/ForwardingRulesManagerImpl.java
applications/forwardingrules-manager/src/main/yang/forwardingrules-manager-config.yang
applications/forwardingrules-manager/src/test/java/test/mock/util/FRMTest.java
applications/forwardingrules-manager/src/test/java/test/mock/util/RpcProviderRegistryMock.java
applications/forwardingrules-manager/src/test/java/test/mock/util/SalBundleServiceMock.java [new file with mode: 0644]
openflowplugin-blueprint-config/src/main/resources/initial/openflowplugin.cfg

index a97e19fbb83b8c93b1b26af9564458aa47e4d591..2721780d2c148d51dbb9a83b492c462cd926b245 100644 (file)
       <scope>test</scope>
       <type>test-jar</type>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.openflowplugin</groupId>
+      <artifactId>openflowplugin-extension-onf</artifactId>
+    </dependency>
   </dependencies>
 
   <build>
index 2bfd84037f68d551544128968f062b404525d74a..54de44cd034a3b69c67136a5bbc5f0af3486c571 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.me
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.SalTableService;
@@ -94,6 +95,13 @@ public interface ForwardingRulesManager extends ConfigurationListener, AutoClose
      */
     SalTableService getSalTableService();
 
+    /**
+     * Bundle RPC service
+     *
+     * @return salBundleService
+     */
+    SalBundleService getSalBundleService();
+
     /**
      * Content definition method and prevent code duplicity in Reconcil
      * @return ForwardingRulesCommiter&lt;Flow&gt;
@@ -149,5 +157,11 @@ public interface ForwardingRulesManager extends ConfigurationListener, AutoClose
      */
     FlowNodeConnectorInventoryTranslatorImpl getFlowNodeConnectorInventoryTranslatorImpl();
 
+    /**
+     * holds the value read from the configuration file openflowplugin.cfg file
+     * @return True if user enables bundle-based-reconciliation-enabled field in config file or False
+     */
+    boolean isBundleBasedReconciliationEnabled();
+
 }
 
index 8fab3c0934af814b2982fecc434c72a232c6d36d..ccfb336bb012663304c47835729de499c336e8a2 100644 (file)
@@ -14,7 +14,8 @@ import java.util.Map;
 public enum ForwardingRulesProperty {
     DISABLE_RECONCILIATION,
     STALE_MARKING_ENABLED,
-    RECONCILIATION_RETRY_COUNT;
+    RECONCILIATION_RETRY_COUNT,
+    BUNDLE_BASED_RECONCILIATION_ENABLED;
 
 
     private static final Map<String, ForwardingRulesProperty> KEY_VALUE_MAP;
index 0fb6318c014732d4c8a1e045b24b561e858f4530..788199d2810cc4254c72d9dae3b81d553e611e27 100644 (file)
@@ -8,11 +8,11 @@
 
 package org.opendaylight.openflowplugin.applications.frm.impl;
 
-
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+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;
@@ -26,15 +26,19 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.concurrent.Future;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicLong;
+import javax.annotation.Nullable;
 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.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.applications.frm.FlowNodeReconciliation;
 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase;
@@ -62,13 +66,36 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.StaleGroup;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.StaleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.Messages;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.MessagesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.Message;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.MessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleAddFlowCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleAddGroupCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleRemoveFlowCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleRemoveGroupCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.bundle.add.flow._case.AddFlowCaseDataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.bundle.add.group._case.AddGroupCaseDataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.bundle.remove.flow._case.RemoveFlowCaseDataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.bundle.remove.group._case.RemoveGroupCaseDataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.BundleControlType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.BundleFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.BundleId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -92,9 +119,15 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
     private final ForwardingRulesManager provider;
     private final ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
 
+    private final SalBundleService salBundleService;
+
+    private static final AtomicLong BUNDLE_ID = new AtomicLong();
+    private static final BundleFlags BUNDLE_FLAGS = new BundleFlags(true, true);
+
     public FlowNodeReconciliationImpl (final ForwardingRulesManager manager, final DataBroker db) {
         this.provider = Preconditions.checkNotNull(manager, "ForwardingRulesManager can not be null!");
         dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!");
+        salBundleService = Preconditions.checkNotNull(manager.getSalBundleService(),"salBundleService can not be null!");
     }
 
     @Override
@@ -118,8 +151,101 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
                         connectedNode.toString());
                 reconciliationPreProcess(connectedNode);
             }
-            ReconciliationTask reconciliationTask = new ReconciliationTask(connectedNode);
-            executor.execute(reconciliationTask);
+            LOG.debug("Bundle based reconciliation status : {}", provider.isBundleBasedReconciliationEnabled()?"Enable":"Disable");
+            if (provider.isBundleBasedReconciliationEnabled()) {
+                BundleBasedReconciliationTask bundleBasedReconTask = new BundleBasedReconciliationTask(connectedNode);
+                executor.execute(bundleBasedReconTask);
+            } else {
+                ReconciliationTask reconciliationTask = new ReconciliationTask(connectedNode);
+                executor.execute(reconciliationTask);
+            }
+        }
+    }
+
+    private class BundleBasedReconciliationTask implements Runnable {
+        final InstanceIdentifier<FlowCapableNode> nodeIdentity;
+
+        public BundleBasedReconciliationTask(final InstanceIdentifier<FlowCapableNode> nodeIdent) {
+            nodeIdentity = nodeIdent;
+        }
+
+        @Override
+        public void run() {
+            String sNode = nodeIdentity.firstKeyOf(Node.class, NodeKey.class).getId().getValue();
+            Optional<FlowCapableNode> flowNode = Optional.absent();
+            BundleId bundleIdValue = new BundleId(BUNDLE_ID.getAndIncrement());
+            BigInteger nDpId = getDpnIdFromNodeName(sNode);
+            LOG.debug("Triggering bundle based reconciliation for device :{}", nDpId);
+            ReadOnlyTransaction trans = provider.getReadTranaction();
+            try {
+                flowNode = trans.read(LogicalDatastoreType.CONFIGURATION, nodeIdentity).get();
+            } catch (Exception e) {
+                LOG.error("Error occurred while reading the configuration data store for node {}", nodeIdentity, e);
+            }
+
+            if (flowNode.isPresent()) {
+                LOG.debug("FlowNode present for Datapath ID {}", nDpId);
+                final NodeRef nodeRef = new NodeRef(nodeIdentity.firstIdentifierOf(Node.class));
+
+                final ControlBundleInput openBundleInput = new ControlBundleInputBuilder()
+                        .setNode(nodeRef)
+                        .setBundleId(bundleIdValue)
+                        .setFlags(BUNDLE_FLAGS)
+                        .setType(BundleControlType.ONFBCTOPENREQUEST)
+                        .build();
+
+                final ControlBundleInput commitBundleInput = new ControlBundleInputBuilder()
+                        .setNode(nodeRef)
+                        .setBundleId(bundleIdValue)
+                        .setFlags(BUNDLE_FLAGS)
+                        .setType(BundleControlType.ONFBCTCOMMITREQUEST)
+                        .build();
+
+                final AddBundleMessagesInput addBundleMessagesInput = new AddBundleMessagesInputBuilder()
+                        .setNode(nodeRef)
+                        .setBundleId(bundleIdValue)
+                        .setFlags(BUNDLE_FLAGS)
+                        .setMessages(createMessages(nodeRef, flowNode))
+                        .build();
+
+                Future<RpcResult<Void>> openBundle = salBundleService.controlBundle(openBundleInput);
+
+                ListenableFuture<RpcResult<Void>> addBundleMessagesFuture =
+                        Futures.transformAsync(JdkFutureAdapters.listenInPoolThread(openBundle), rpcResult -> {
+                            if (rpcResult.isSuccessful()) {
+                                return JdkFutureAdapters.listenInPoolThread(
+                                        salBundleService.addBundleMessages(addBundleMessagesInput));
+                            }
+                            return Futures.immediateFuture(null);
+                        });
+
+                ListenableFuture<RpcResult<Void>> commitBundleFuture =
+                        Futures.transformAsync(addBundleMessagesFuture, rpcResult -> {
+                            if (rpcResult.isSuccessful()) {
+                                return JdkFutureAdapters.listenInPoolThread(
+                                        salBundleService.controlBundle(commitBundleInput));
+                            }
+                            return Futures.immediateFuture(null);
+                        });
+
+                /* Bundles not supported for meters*/
+                List<Meter> meters = flowNode.get().getMeter() != null
+                        ? flowNode.get().getMeter() : Collections.emptyList();
+                ListenableFuture<RpcResult<Void>> meterFuture =
+                        Futures.transformAsync(commitBundleFuture, rpcResult -> {
+                            if (rpcResult.isSuccessful()) {
+                                for (Meter meter : meters) {
+                                    final KeyedInstanceIdentifier<Meter, MeterKey> meterIdent =
+                                            nodeIdentity.child(Meter.class, meter.getKey());
+                                    provider.getMeterCommiter().add(meterIdent, meter, nodeIdentity);
+                                }
+                            }
+                            return Futures.immediateFuture(null);
+                        });
+
+                LOG.debug("Completing bundle based reconciliation for device ID:{}", nDpId);
+                trans.close();
+            }
         }
     }
 
@@ -133,7 +259,6 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
 
         @Override
         public void run() {
-
             String sNode = nodeIdentity.firstKeyOf(Node.class, NodeKey.class).getId().getValue();
             BigInteger nDpId = getDpnIdFromNodeName(sNode);
 
@@ -547,5 +672,50 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
             }
         });
     }
+
+    private Flow getDeleteAllFlow(){
+        final FlowBuilder flowBuilder = new FlowBuilder();
+        flowBuilder.setTableId(OFConstants.OFPTT_ALL);
+        return flowBuilder.build();
+    }
+
+    private Group getDeleteAllGroup(){
+        final GroupBuilder groupBuilder = new GroupBuilder();
+        groupBuilder.setGroupType(GroupTypes.GroupAll);
+        groupBuilder.setGroupId(new GroupId(OFConstants.OFPG_ALL));
+        return groupBuilder.build();
+    }
+
+    private Messages createMessages(final NodeRef nodeRef , final Optional<FlowCapableNode> flowNode) {
+        final List<Message> messages  = new ArrayList<>();
+        messages.add(new MessageBuilder().setNode(nodeRef).setBundleInnerMessage(
+                new BundleRemoveFlowCaseBuilder()
+                        .setRemoveFlowCaseData(new RemoveFlowCaseDataBuilder(getDeleteAllFlow()).build()).build()).build());
+
+        messages.add(new MessageBuilder().setNode(nodeRef).setBundleInnerMessage(
+                new BundleRemoveGroupCaseBuilder()
+                        .setRemoveGroupCaseData(new RemoveGroupCaseDataBuilder(getDeleteAllGroup()).build()).build()).build());
+
+        if(flowNode.get().getGroup()!= null) {
+            for (Group gr : flowNode.get().getGroup()) {
+                messages.add(new MessageBuilder().setNode(nodeRef).setBundleInnerMessage(
+                        new BundleAddGroupCaseBuilder()
+                                .setAddGroupCaseData(new AddGroupCaseDataBuilder(gr).build()).build()).build());
+            }
+        }
+
+        if(flowNode.get().getTable()!= null) {
+            for (Table table : flowNode.get().getTable()) {
+                for (Flow flow : table.getFlow()) {
+                    messages.add(new MessageBuilder().setNode(nodeRef).setBundleInnerMessage(
+                            new BundleAddFlowCaseBuilder()
+                                    .setAddFlowCaseData(new AddFlowCaseDataBuilder(flow).build()).build()).build());
+                }
+            }
+        }
+
+        LOG.debug("The size of the flows and group messages created in createMessage() {}", messages.size());
+        return new MessagesBuilder().setMessage(messages).build();
+    }
 }
 
index b98c271093f6e877b2503457969e02df37635af5..be9b361ccbfcee3eac109aba4516bb8d4102a6de 100644 (file)
@@ -35,6 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.Sal
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.forwardingrules.manager.config.rev160511.ForwardingRulesManagerConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.SalTableService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
@@ -64,6 +65,7 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
     private final SalTableService salTableService;
     private final ClusterSingletonServiceProvider clusterSingletonServiceProvider;
     private final NotificationProviderService notificationService;
+    private final SalBundleService salBundleService;
     private final AutoCloseable configurationServiceRegistration;
     private ForwardingRulesCommiter<Flow> flowListener;
     private ForwardingRulesCommiter<Group> groupListener;
@@ -75,6 +77,7 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
     private boolean disableReconciliation;
     private boolean staleMarkingEnabled;
     private int reconciliationRetryCount;
+    private boolean isBundleBasedReconciliationEnabled;
 
     public ForwardingRulesManagerImpl(final DataBroker dataBroker,
                                       final RpcConsumerRegistry rpcRegistry,
@@ -85,7 +88,7 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
         disableReconciliation = config.isDisableReconciliation();
         staleMarkingEnabled = config.isStaleMarkingEnabled();
         reconciliationRetryCount = config.getReconciliationRetryCount();
-
+        isBundleBasedReconciliationEnabled = config.isBundleBasedReconciliationEnabled();
         this.configurationServiceRegistration = configurationService.registerListener(this);
         this.dataService = Preconditions.checkNotNull(dataBroker, "DataBroker can not be null!");
         this.clusterSingletonServiceProvider = Preconditions.checkNotNull(clusterSingletonService,
@@ -103,6 +106,8 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
                 "RPC SalMeterService not found.");
         this.salTableService = Preconditions.checkNotNull(rpcRegistry.getRpcService(SalTableService.class),
                 "RPC SalTableService not found.");
+        this.salBundleService = Preconditions.checkNotNull(rpcRegistry.getRpcService(SalBundleService.class),
+                "RPC SalBundlService not found.");
     }
 
     @Override
@@ -207,6 +212,11 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
         return salTableService;
     }
 
+    @Override
+    public SalBundleService getSalBundleService() {
+        return salBundleService;
+    }
+
     @Override
     public ForwardingRulesCommiter<Flow> getFlowCommiter() {
         return flowListener;
@@ -247,6 +257,11 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
         return flowNodeConnectorInventoryTranslatorImpl;
     }
 
+    @Override
+    public boolean isBundleBasedReconciliationEnabled() {
+        return isBundleBasedReconciliationEnabled;
+    }
+
     @Override
     public boolean isNodeOwner(InstanceIdentifier<FlowCapableNode> ident) {
         return Objects.nonNull(ident) && deviceMastershipManager.isDeviceMastered(ident.firstKeyOf(Node.class).getId());
@@ -270,6 +285,9 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
                 case RECONCILIATION_RETRY_COUNT:
                     reconciliationRetryCount = Integer.valueOf(propertyValue);
                     break;
+                case BUNDLE_BASED_RECONCILIATION_ENABLED:
+                    isBundleBasedReconciliationEnabled = Boolean.valueOf(propertyValue);
+                    break;
             }
         });
     }
index 62899dba77133d64b6aee4e78ede9198125c032d..53fdcfb9999cbd6d7dfa62a83de91c728afddc35 100644 (file)
@@ -26,5 +26,10 @@ module forwarding-rules-manager-config {
             type uint16;
             default 5;
         }
+
+        leaf bundle-based-reconciliation-enabled {
+            type boolean;
+            default false;
+        }
     }
 }
index 8f52415cb1cde3b296e6866c7c10caeaf34836a4..a81201368da9ae53df291418184165074da8b366 100644 (file)
@@ -70,6 +70,7 @@ public abstract class FRMTest extends AbstractDataBrokerTest {
         cfgBuilder.setDisableReconciliation(false);
         cfgBuilder.setStaleMarkingEnabled(false);
         cfgBuilder.setReconciliationRetryCount(0);
+        cfgBuilder.setBundleBasedReconciliationEnabled(false);
         return cfgBuilder.build();
     }
 
@@ -88,6 +89,9 @@ public abstract class FRMTest extends AbstractDataBrokerTest {
         Mockito.when(configurationService.getProperty(Mockito.eq("reconciliation-retry-count"), Mockito.any()))
                 .thenReturn(config.getReconciliationRetryCount());
 
+        Mockito.when(configurationService.getProperty(Mockito.eq("bundle-based-reconciliation-enabled"), Mockito.any()))
+                .thenReturn(config.isBundleBasedReconciliationEnabled());
+
         return configurationService;
     }
 
index 68559b9a1e176954024d1308d5bb94e447781f76..40a466b80837dfcea5fc8c3bd71dfaf3fd341c02 100644 (file)
@@ -7,6 +7,7 @@
  */
 package test.mock.util;
 
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.SalTableService;
 
 import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener;
@@ -46,6 +47,8 @@ public class RpcProviderRegistryMock implements RpcProviderRegistry {
             return (T) new SalMeterServiceMock();
         } else if (serviceInterface.equals(SalTableService.class)) {
             return (T) new SalTableServiceMock();
+        } else if (serviceInterface.equals(SalBundleService.class)) {
+            return (T) new SalBundleServiceMock();
         } else {
             return null;
         }
diff --git a/applications/forwardingrules-manager/src/test/java/test/mock/util/SalBundleServiceMock.java b/applications/forwardingrules-manager/src/test/java/test/mock/util/SalBundleServiceMock.java
new file mode 100644 (file)
index 0000000..2445d56
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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 test.mock.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Future;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+
+
+public class SalBundleServiceMock implements SalBundleService {
+
+    private final List<ControlBundleInput> controlBundleInput = new ArrayList<>();
+    private final List<AddBundleMessagesInput>  addBundleMessagesInput = new ArrayList<>();
+
+
+    @Override
+    public Future<RpcResult<java.lang.Void>> controlBundle(ControlBundleInput input) {
+        getControlBundleInput().add(input);
+        return null;
+    }
+
+    @Override
+    public Future<RpcResult<java.lang.Void>> addBundleMessages(AddBundleMessagesInput input) {
+        getAddBundleMessagesInput().add(input);
+        return null;
+    }
+
+    public List<ControlBundleInput> getControlBundleInput() {
+        return controlBundleInput;
+    }
+
+    public List<AddBundleMessagesInput> getAddBundleMessagesInput() {
+        return addBundleMessagesInput;
+    }
+
+
+}
index 417c34bf685cba1e4716ccaffb0e3f42419f465d..1f84b4fdc692463e1c0cee5349071125335f162e 100644 (file)
 # configuration.
 #
 # reconciliation-retry-count=5
+
+#
+# To Enable bundle based reconciliation change the configuration value to true.
+# By default it will be false which means bundle based reconciliation will be disabled
+# and normal reconciliation will be enabled.
+# NOTE: This option will be effective only if disable_reconciliation=false.
+# bundle-based-reconciliation-enabled=false
+
+