From 198d5e3309648814c6d5ef849d86d15dfc8e886f Mon Sep 17 00:00:00 2001 From: Alessandro Boch Date: Wed, 2 Apr 2014 23:22:47 -0700 Subject: [PATCH] Add async addStaticFlow api to FRM Change-Id: I6189ab2f617895a780bd14b9a620250476058da5 Signed-off-by: Alessandro Boch --- opendaylight/commons/opendaylight/pom.xml | 2 +- .../forwardingrulesmanager/api/pom.xml | 2 +- .../IForwardingRulesManager.java | 34 +++++++++++++- .../internal/ForwardingRulesManager.java | 46 +++++++++++++++---- 4 files changed, 73 insertions(+), 11 deletions(-) diff --git a/opendaylight/commons/opendaylight/pom.xml b/opendaylight/commons/opendaylight/pom.xml index e638ba68a7..1e8d3d26b5 100644 --- a/opendaylight/commons/opendaylight/pom.xml +++ b/opendaylight/commons/opendaylight/pom.xml @@ -95,7 +95,7 @@ 2.4 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT - 0.5.1-SNAPSHOT + 0.6.0-SNAPSHOT 0.5.1-SNAPSHOT 0.5.1-SNAPSHOT 0.4.3-SNAPSHOT diff --git a/opendaylight/forwardingrulesmanager/api/pom.xml b/opendaylight/forwardingrulesmanager/api/pom.xml index 3bd1af3a10..304a3151de 100644 --- a/opendaylight/forwardingrulesmanager/api/pom.xml +++ b/opendaylight/forwardingrulesmanager/api/pom.xml @@ -15,7 +15,7 @@ forwardingrulesmanager - 0.5.1-SNAPSHOT + 0.6.0-SNAPSHOT bundle diff --git a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/IForwardingRulesManager.java b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/IForwardingRulesManager.java index 9d68f84a3a..070e8c4998 100644 --- a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/IForwardingRulesManager.java +++ b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/IForwardingRulesManager.java @@ -369,6 +369,16 @@ public interface IForwardingRulesManager { */ public Status addStaticFlow(FlowConfig config); + /** + * Add a flow specified by the {@code FlowConfig} object on the current + * container, through an asynchronous call. + * + * @param config + * the {@code FlowConfig} object representing the static flow + * @return the {@code Status} object indicating the result of this action. + */ + public Status addStaticFlowAsync(FlowConfig config); + /** * Remove a flow specified by the {@code FlowConfig} object on the current * container @@ -379,6 +389,16 @@ public interface IForwardingRulesManager { */ public Status removeStaticFlow(FlowConfig config); + /** + * Remove a flow specified by the {@code FlowConfig} object on the current + * container, through an asynchronous call. + * + * @param config + * the {@code FlowConfig} object representing the static flow + * @return the {@code Status} object indicating the result of this action + */ + public Status removeStaticFlowAsync(FlowConfig config); + /** * Replace the flow identified by the {@code FlowConfig.name} name for the * {@code FlowConfig.node} network node with the new flow specified by @@ -386,7 +406,7 @@ public interface IForwardingRulesManager { * * @param config * the {@code FlowConfig} object - * @returnthe {@code Status} object indicating the result of this action + * @return the {@code Status} object indicating the result of this action */ public Status modifyStaticFlow(FlowConfig config); @@ -401,6 +421,18 @@ public interface IForwardingRulesManager { */ public Status removeStaticFlow(String name, Node node); + /** + * Remove the flow specified by name on the passed network node via an + * asynchronous call + * + * @param name + * for the static flow + * @param node + * on which the flow is attached + * @return the {@code Status} object indicating the result of this action + */ + public Status removeStaticFlowAsync(String name, Node node); + /** * Toggle the installation status of the specified configured flow If the * flow configuration status is active, this call will change the flow diff --git a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java index 614c39e060..f7b647dd72 100644 --- a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java +++ b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java @@ -1590,6 +1590,10 @@ public class ForwardingRulesManager implements @Override public Status addStaticFlow(FlowConfig config) { + return addStaticFlow(config, false); + } + + private Status addStaticFlow(FlowConfig config, boolean async) { // Configuration object validation Status status = config.validate(); if (!status.isSuccess()) { @@ -1598,7 +1602,13 @@ public class ForwardingRulesManager implements config.setStatus(error); return new Status(StatusCode.BADREQUEST, error); } - return addStaticFlowInternal(config, false); + return addStaticFlowInternal(config, async, false); + } + + + @Override + public Status addStaticFlowAsync(FlowConfig config) { + return addStaticFlow(config, true); } /** @@ -1616,7 +1626,7 @@ public class ForwardingRulesManager implements * installation on the network node was successful * @return The status of this request */ - private Status addStaticFlowInternal(FlowConfig config, boolean restore) { + private Status addStaticFlowInternal(FlowConfig config, boolean async, boolean restore) { boolean multipleFlowPush = false; String error; Status status; @@ -1653,7 +1663,7 @@ public class ForwardingRulesManager implements // Program hw if (config.installInHw()) { FlowEntry entry = config.getFlowEntry(); - status = this.installFlowEntry(entry); + status = async ? this.installFlowEntryAsync(entry) : this.installFlowEntry(entry); if (!status.isSuccess()) { config.setStatus(status.getDescription()); if (!restore) { @@ -1765,6 +1775,15 @@ public class ForwardingRulesManager implements @Override public Status removeStaticFlow(FlowConfig config) { + return removeStaticFlow(config, false); + } + + @Override + public Status removeStaticFlowAsync(FlowConfig config) { + return removeStaticFlow(config, true); + } + + private Status removeStaticFlow(FlowConfig config, boolean async) { /* * No config.isInternal() check as NB does not take this path and GUI * cannot issue a delete on an internal generated flow. We need this @@ -1788,7 +1807,8 @@ public class ForwardingRulesManager implements } // Program the network node - Status status = this.uninstallFlowEntry(config.getFlowEntry()); + Status status = async ? this.uninstallFlowEntryAsync(config.getFlowEntry()) : this.uninstallFlowEntry(config + .getFlowEntry()); // Update configuration database if programming was successful if (status.isSuccess()) { @@ -1800,6 +1820,15 @@ public class ForwardingRulesManager implements @Override public Status removeStaticFlow(String name, Node node) { + return removeStaticFlow(name, node, false); + } + + @Override + public Status removeStaticFlowAsync(String name, Node node) { + return removeStaticFlow(name, node, true); + } + + private Status removeStaticFlow(String name, Node node, boolean async) { // Look for the target configuration entry Integer key = 0; FlowConfig target = null; @@ -1830,7 +1859,7 @@ public class ForwardingRulesManager implements } // Program the network node - Status status = this.removeEntry(target.getFlowEntry(), false); + Status status = this.removeEntry(target.getFlowEntry(), async); // Update configuration database if programming was successful if (status.isSuccess()) { @@ -2081,7 +2110,7 @@ public class ForwardingRulesManager implements } for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, STATIC_FLOWS_FILE_NAME)) { - addStaticFlowInternal((FlowConfig) conf, true); + addStaticFlowInternal((FlowConfig) conf, false, true); } } @@ -2193,7 +2222,7 @@ public class ForwardingRulesManager implements // check if the frm really needs to act on the notification. // this is to check against duplicate notifications if(programInternalFlow(proactive, fc)) { - Status status = (proactive) ? addStaticFlowInternal(fc, false) : removeStaticFlow(fc); + Status status = (proactive) ? addStaticFlowInternal(fc, false, false) : removeStaticFlow(fc); if (status.isSuccess()) { log.trace("{} Proactive Static flow: {}", (proactive ? "Installed" : "Removed"), fc.getName()); } else { @@ -2376,7 +2405,7 @@ public class ForwardingRulesManager implements if ((staticFlow.getNode().equals(node)) && (staticFlow.getPortGroup().equals(config.getName()))) { for (Short port : data.getPorts()) { FlowConfig derivedFlow = getDerivedFlowConfig(staticFlow, config.getName(), port); - addStaticFlowInternal(derivedFlow, false); + addStaticFlowInternal(derivedFlow, false, false); } } } @@ -3240,4 +3269,5 @@ public class ForwardingRulesManager implements } return list; } + } -- 2.36.6