X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsal%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fimplementation%2Finternal%2FFlowProgrammerService.java;h=854125b3567a196b940556363ed56c82e99d50c0;hb=5d796fc880196eeb080f28e4bc0b3f3a57281e8a;hp=dd1277311e6a7bb93e9dcbf81ad62e97f25488b8;hpb=11837100975c9ad113e12668c09ecd78f9433f73;p=controller.git diff --git a/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java b/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java index dd1277311e..854125b356 100644 --- a/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java +++ b/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java @@ -10,6 +10,7 @@ package org.opendaylight.controller.sal.implementation.internal; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; @@ -27,8 +28,8 @@ import org.opendaylight.controller.sal.action.PopVlan; import org.opendaylight.controller.sal.action.SetNwDst; import org.opendaylight.controller.sal.core.ConstructionException; import org.opendaylight.controller.sal.core.Node; -import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Node.NodeIDType; +import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.flowprogrammer.Flow; import org.opendaylight.controller.sal.flowprogrammer.IFlowProgrammerListener; import org.opendaylight.controller.sal.flowprogrammer.IFlowProgrammerService; @@ -36,11 +37,12 @@ import org.opendaylight.controller.sal.flowprogrammer.IPluginInFlowProgrammerSer import org.opendaylight.controller.sal.flowprogrammer.IPluginOutFlowProgrammerService; import org.opendaylight.controller.sal.match.Match; import org.opendaylight.controller.sal.match.MatchType; -import org.opendaylight.controller.sal.utils.StatusCode; import org.opendaylight.controller.sal.utils.EtherTypes; +import org.opendaylight.controller.sal.utils.GlobalConstants; import org.opendaylight.controller.sal.utils.IPProtocols; import org.opendaylight.controller.sal.utils.NodeConnectorCreator; import org.opendaylight.controller.sal.utils.Status; +import org.opendaylight.controller.sal.utils.StatusCode; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.slf4j.Logger; @@ -58,16 +60,23 @@ public class FlowProgrammerService implements IFlowProgrammerService, .getLogger(FlowProgrammerService.class); private ConcurrentHashMap pluginFlowProgrammer; private Set listener; + private AtomicLong seq; public FlowProgrammerService() { pluginFlowProgrammer = new ConcurrentHashMap(); listener = new HashSet(); + seq = new AtomicLong(); + /* + * This Request ID generator starts with 1. Each aysnc message is + * associated with an unique Request ID (!= 0). + */ + seq.lazySet(1); } /** * Function called by the dependency manager when all the required * dependencies are satisfied - * + * */ void init() { logger.debug("INIT called!"); @@ -77,7 +86,7 @@ public class FlowProgrammerService implements IFlowProgrammerService, * Function called by the dependency manager when at least one dependency * become unsatisfied or when the component is shutting down because for * example bundle is being stopped. - * + * */ void destroy() { // Clear previous registration to avoid they are left hanging @@ -88,7 +97,7 @@ public class FlowProgrammerService implements IFlowProgrammerService, /** * Function called by dependency manager after "init ()" is called and after * the services provided by the class are registered in the service registry - * + * */ void start() { logger.debug("START called!"); @@ -100,28 +109,28 @@ public class FlowProgrammerService implements IFlowProgrammerService, * Function called by the dependency manager before the services exported by * the component are unregistered, this will be followed by a "destroy ()" * calls - * + * */ void stop() { logger.debug("STOP called!"); } // Set the reference to the plugin flow programmer - public void setService(Map props, IPluginInFlowProgrammerService s) { + public void setService(Map props, IPluginInFlowProgrammerService s) { if (this.pluginFlowProgrammer == null) { logger.error("pluginFlowProgrammer store null"); return; } - logger.trace("Got a service set request {}", s); - String type = null; - for (Object e : props.entrySet()) { - Map.Entry entry = (Map.Entry) e; - logger.trace("Prop key:({}) value:({})", entry.getKey(), - entry.getValue()); + if (logger.isTraceEnabled()) { + logger.trace("Got a service set request {}", s); + for (Map.Entry entry : props.entrySet()) { + logger.trace("Prop key:({}) value:({})", entry.getKey(), entry.getValue()); + } } - Object value = props.get("protocolPluginType"); + String type = null; + Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString()); if (value instanceof String) { type = (String) value; } @@ -134,21 +143,22 @@ public class FlowProgrammerService implements IFlowProgrammerService, } } - public void unsetService(Map props, IPluginInFlowProgrammerService s) { + public void unsetService(Map props, IPluginInFlowProgrammerService s) { if (this.pluginFlowProgrammer == null) { logger.error("pluginFlowProgrammer store null"); return; } - String type = null; logger.debug("Received unsetpluginFlowProgrammer request"); - for (Object e : props.entrySet()) { - Map.Entry entry = (Map.Entry) e; - logger.trace("Prop key:({}) value:({})", entry.getKey(), - entry.getValue()); + if (logger.isTraceEnabled()) { + logger.trace("Got a service set request {}", s); + for (Map.Entry entry : props.entrySet()) { + logger.trace("Prop key:({}) value:({})", entry.getKey(), entry.getValue()); + } } - Object value = props.get("protocoloPluginType"); + String type = null; + Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString()); if (value instanceof String) { type = (String) value; } @@ -213,6 +223,39 @@ public class FlowProgrammerService implements IFlowProgrammerService, return new Status(StatusCode.NOSERVICE, "Plugin unuvailable"); } + @Override + public Status addFlowAsync(Node node, Flow flow) { + if (pluginFlowProgrammer != null) { + if (this.pluginFlowProgrammer.get(node.getType()) != null) { + return this.pluginFlowProgrammer.get(node.getType()).addFlowAsync( + node, flow, getNextRid()); + } + } + return new Status(StatusCode.NOSERVICE, "Plugin unuvailable"); + } + + @Override + public Status removeFlowAsync(Node node, Flow flow) { + if (pluginFlowProgrammer != null) { + if (this.pluginFlowProgrammer.get(node.getType()) != null) { + return this.pluginFlowProgrammer.get(node.getType()) + .removeFlowAsync(node, flow, getNextRid()); + } + } + return new Status(StatusCode.NOSERVICE, "Plugin unuvailable"); + } + + @Override + public Status modifyFlowAsync(Node node, Flow oldFlow, Flow newFlow) { + if (pluginFlowProgrammer != null) { + if (this.pluginFlowProgrammer.get(node.getType()) != null) { + return this.pluginFlowProgrammer.get(node.getType()) + .modifyFlowAsync(node, oldFlow, newFlow, getNextRid()); + } + } + return new Status(StatusCode.NOSERVICE, "Plugin unuvailable"); + } + @Override public void flowRemoved(Node node, Flow flow) { for (IFlowProgrammerListener l : listener) { @@ -220,6 +263,16 @@ public class FlowProgrammerService implements IFlowProgrammerService, } } + @Override + public void flowErrorReported(Node node, long rid, Object err) { + logger.error("Got error {} for message rid {} from node {}", + new Object[] { err, rid, node }); + + for (IFlowProgrammerListener l : listener) { + l.flowErrorReported(node, rid, err); + } + } + // ---------------- OSGI TEST CODE ------------------------------// private void registerWithOSGIConsole() { @@ -379,6 +432,7 @@ public class FlowProgrammerService implements IFlowProgrammerService, Flow flow = new Flow(match, actions); flow.setPriority((short) 100); flow.setHardTimeout((short) 360); + flow.setId(1234L); return flow; } @@ -436,8 +490,40 @@ public class FlowProgrammerService implements IFlowProgrammerService, Flow flow = new Flow(match, actions); flow.setPriority((short) 300); flow.setHardTimeout((short) 240); + flow.setId(65536L); return flow; } + /** + * This Request ID generator starts with 1. Each aysnc message is + * associated with an unique Request ID (!= 0). + * + * @return Request ID + */ + private long getNextRid() { + return seq.getAndIncrement(); + } + + @Override + public Status syncSendBarrierMessage(Node node) { + if (this.pluginFlowProgrammer != null) { + if (this.pluginFlowProgrammer.get(node.getType()) != null) { + return this.pluginFlowProgrammer.get(node.getType()) + .syncSendBarrierMessage(node); + } + } + return new Status(StatusCode.NOSERVICE, "Plugin unuvailable"); + } + + @Override + public Status asyncSendBarrierMessage(Node node) { + if (this.pluginFlowProgrammer != null) { + if (this.pluginFlowProgrammer.get(node.getType()) != null) { + return this.pluginFlowProgrammer.get(node.getType()) + .asyncSendBarrierMessage(node); + } + } + return new Status(StatusCode.NOSERVICE, "Plugin unuvailable"); + } }