X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fprotocol_plugins%2Fopenflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fprotocol_plugin%2Fopenflow%2Finternal%2FFlowProgrammerService.java;h=f58acf62edb0962703b9e4971e582bc412314c47;hb=ff1b4a79cca00743a00c3b0b1100bd0ab2b2fb31;hp=1d19c8b45c039e90e8e6bd859d03fe9312e712e3;hpb=d6a8638df6f25c5f163242654d7608be36f3aa6d;p=controller.git diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java index 1d19c8b45c..f58acf62ed 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java @@ -110,7 +110,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, /** * Function called by the dependency manager when all the required * dependencies are satisfied - * + * */ void init() { this.controller.addMessageListener(OFType.FLOW_REMOVED, this); @@ -122,7 +122,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, * 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() { } @@ -130,7 +130,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, /** * 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() { } @@ -139,7 +139,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, * 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() { } @@ -201,21 +201,9 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, * will be inserted automatically to synchronize the * progression. */ - result = asyncMsgSend(node, sw, msg, rid); - } - if (result instanceof Boolean) { - return ((Boolean) result == Boolean.TRUE) ? new Status( - StatusCode.SUCCESS, rid) : new Status( - StatusCode.TIMEOUT, errorString(null, action, - "Request Timed Out")); - } else if (result instanceof OFError) { - OFError res = (OFError) result; - return new Status(StatusCode.INTERNALERROR, errorString( - "program", action, Utils.getOFErrorString(res))); - } else { - return new Status(StatusCode.INTERNALERROR, errorString( - "send", action, "Internal Error")); + result = asyncMsgSend(node, sw, msg, rid); } + return getStatusInternal(result, action, rid); } else { return new Status(StatusCode.GONE, errorString("send", action, "Switch is not available")); @@ -267,52 +255,28 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, */ result = asyncMsgSend(node, sw, msg1, rid); } - if (result instanceof Boolean) { - if ((Boolean) result == Boolean.FALSE) { - return new Status(StatusCode.TIMEOUT, errorString(null, - action, "Request Timed Out")); - } else if (msg2 == null) { - return new Status(StatusCode.SUCCESS, rid); - } - } else if (result instanceof OFError) { - return new Status(StatusCode.INTERNALERROR, errorString( - "program", action, - Utils.getOFErrorString((OFError) result))); - } else { - return new Status(StatusCode.INTERNALERROR, errorString( - "send", action, "Internal Error")); + + Status rv = getStatusInternal(result, action, rid); + if ((msg2 == null) || !rv.isSuccess()) { + return rv; } - if (msg2 != null) { - action = "add"; - if (rid == 0) { - /* - * Synchronous message send. Each message is followed by a - * Barrier message. - */ - result = sw.syncSend(msg2); - } else { - /* - * Message will be sent asynchronously. A Barrier message - * will be inserted automatically to synchronize the - * progression. - */ - result = asyncMsgSend(node, sw, msg2, rid); - } - if (result instanceof Boolean) { - return ((Boolean) result == Boolean.TRUE) ? new Status( - StatusCode.SUCCESS, rid) : new Status( - StatusCode.TIMEOUT, errorString(null, action, - "Request Timed Out")); - } else if (result instanceof OFError) { - return new Status(StatusCode.INTERNALERROR, - errorString("program", action, Utils - .getOFErrorString((OFError) result))); - } else { - return new Status(StatusCode.INTERNALERROR, - errorString("send", action, "Internal Error")); - } + action = "add"; + if (rid == 0) { + /* + * Synchronous message send. Each message is followed by a + * Barrier message. + */ + result = sw.syncSend(msg2); + } else { + /* + * Message will be sent asynchronously. A Barrier message + * will be inserted automatically to synchronize the + * progression. + */ + result = asyncMsgSend(node, sw, msg2, rid); } + return getStatusInternal(result, action, rid); } else { return new Status(StatusCode.GONE, errorString("send", action, "Switch is not available")); @@ -348,19 +312,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, */ result = asyncMsgSend(node, sw, msg, rid); } - if (result instanceof Boolean) { - return ((Boolean) result == Boolean.TRUE) ? new Status( - StatusCode.SUCCESS, rid) : new Status( - StatusCode.TIMEOUT, errorString(null, action, - "Request Timed Out")); - } else if (result instanceof OFError) { - return new Status(StatusCode.INTERNALERROR, errorString( - "program", action, - Utils.getOFErrorString((OFError) result))); - } else { - return new Status(StatusCode.INTERNALERROR, errorString( - "send", action, "Internal Error")); - } + return getStatusInternal(result, action, rid); } else { return new Status(StatusCode.GONE, errorString("send", action, "Switch is not available")); @@ -372,7 +324,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, @Override public Status removeAllFlows(Node node) { - return new Status(StatusCode.SUCCESS, null); + return new Status(StatusCode.SUCCESS); } private String errorString(String phase, String action, String cause) { @@ -440,7 +392,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, if ((rid == null) || (rid == 0)) { return; } - + /* * Notifies the caller that error has been reported for a previous flow * programming request @@ -493,7 +445,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, } @Override - public Status sendBarrierMessage(Node node) { + public Status syncSendBarrierMessage(Node node) { if (!node.getType().equals(NodeIDType.OPENFLOW)) { return new Status(StatusCode.NOTACCEPTABLE, "The node does not support Barrier message."); @@ -503,9 +455,9 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, long swid = (Long) node.getID(); ISwitch sw = controller.getSwitch(swid); if (sw != null) { - sw.sendBarrierMessage(); + sw.syncSendBarrierMessage(); clearXid2Rid(swid); - return (new Status(StatusCode.SUCCESS, null)); + return (new Status(StatusCode.SUCCESS)); } else { return new Status(StatusCode.GONE, "The node does not have a valid Switch reference."); @@ -514,14 +466,37 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, return new Status(StatusCode.INTERNALERROR, "Failed to send Barrier message."); } - + + @Override + public Status asyncSendBarrierMessage(Node node) { + if (!node.getType().equals(NodeIDType.OPENFLOW)) { + return new Status(StatusCode.NOTACCEPTABLE, + "The node does not support Barrier message."); + } + + if (controller != null) { + long swid = (Long) node.getID(); + ISwitch sw = controller.getSwitch(swid); + if (sw != null) { + sw.asyncSendBarrierMessage(); + clearXid2Rid(swid); + return (new Status(StatusCode.SUCCESS)); + } else { + return new Status(StatusCode.GONE, + "The node does not have a valid Switch reference."); + } + } + return new Status(StatusCode.INTERNALERROR, + "Failed to send Barrier message."); + } + /** * This method sends the message asynchronously until the number of messages * sent reaches a threshold. Then a Barrier message is sent automatically * for sync purpose. An unique Request ID associated with the message is * passed down by the caller. The Request ID will be returned to the caller * when an error message is received from the switch. - * + * * @param node * The node * @param msg @@ -539,25 +514,25 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, xid = sw.asyncSend(msg); addXid2Rid(swid, xid, rid); - + Map swxid2rid = this.xid2rid.get(swid); if (swxid2rid == null) { return result; } - + int size = swxid2rid.size(); if (size % barrierMessagePriorCount == 0) { - result = sendBarrierMessage(node); + result = asyncSendBarrierMessage(node); } - + return result; } - + /** * A number of async messages are sent followed by a synchronous Barrier * message. This method returns the maximum async messages that can be sent * before the Barrier message. - * + * * @return The max count of async messages sent prior to Barrier message */ private int getBarrierMessagePriorCount() { @@ -573,11 +548,11 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, return rv; } - + /** * This method returns the message Request ID previously assigned by the * caller for a given OF message xid - * + * * @param swid * The switch id * @param xid @@ -601,14 +576,14 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, /** * This method returns a copy of outstanding xid to rid mappings.for a given * switch - * + * * @param swid * The switch id * @return a copy of xid2rid mappings */ public Map getSwXid2Rid(long swid) { Map swxid2rid = this.xid2rid.get(swid); - + if (swxid2rid != null) { return new HashMap(swxid2rid); } else { @@ -618,7 +593,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, /** * Adds xid to rid mapping to the local DB - * + * * @param swid * The switch id * @param xid @@ -636,7 +611,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, /** * When an Error message is received, this method will be invoked to remove * the offending xid from the local DB. - * + * * @param swid * The switch id * @param xid @@ -649,10 +624,39 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, } } + /** + * Convert various result into Status + * + * @param result + * The returned result from previous action + * @param action + * add/modify/delete flow action + * @param rid + * The Request ID associated with the flow message + * @return Status + */ + private Status getStatusInternal(Object result, String action, long rid) { + if (result instanceof Boolean) { + return ((Boolean) result == Boolean.TRUE) ? new Status( + StatusCode.SUCCESS, rid) : new Status( + StatusCode.TIMEOUT, errorString(null, action, + "Request Timed Out")); + } else if (result instanceof Status) { + return (Status) result; + } else if (result instanceof OFError) { + OFError res = (OFError) result; + return new Status(StatusCode.INTERNALERROR, errorString( + "program", action, Utils.getOFErrorString(res))); + } else { + return new Status(StatusCode.INTERNALERROR, errorString( + "send", action, "Internal Error")); + } + } + /** * When a Barrier reply is received, this method will be invoked to clear * the local DB - * + * * @param swid * The switch id */ @@ -666,7 +670,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, @Override public void updateNode(Node node, UpdateType type, Set props) { long swid = (Long)node.getID(); - + switch (type) { case ADDED: Map swxid2rid = new HashMap(); @@ -708,7 +712,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, ci.println("Please enter a valid node id"); return; } - + long sid; try { sid = HexEncode.stringToLong(st); @@ -716,7 +720,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, ci.println("Please enter a valid node id"); return; } - + Map swxid2rid = this.xid2rid.get(sid); if (swxid2rid == null) { ci.println("The node id entered does not exist"); @@ -724,7 +728,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, } ci.println("xid rid"); - + Set xidSet = swxid2rid.keySet(); if (xidSet == null) { return;