From: Jan Medved Date: Tue, 6 May 2014 17:57:57 +0000 (-0700) Subject: Added statistics for received packets in and for sent addFlows to the RPC and Data... X-Git-Tag: release/helium~194^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=94d610df726b15a143d4245f91cb3a775cca74ec;p=openflowplugin.git Added statistics for received packets in and for sent addFlows to the RPC and Data Store drop tests. BUG-991 (https://bugs.opendaylight.org/show_bug.cgi?id=991) Change-Id: I3a99bb81c8eadf87d731715b1f40f36af9734ba9 Signed-off-by: Jan Medved --- diff --git a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommandProvider.java b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommandProvider.java index a2c8d8e329..209b7ce371 100644 --- a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommandProvider.java +++ b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommandProvider.java @@ -89,6 +89,27 @@ public class DropTestCommandProvider implements CommandProvider { } } + public void _showDropStats(CommandInterpreter ci) { + if(sessionInitiated) { + ci.println("RPC Test Statistics: " + this.rpcProvider.getStats().toString()); + ci.println("FRM Test Statistics: " + this.provider.getStats().toString()); + } else { + ci.println("Session not initiated, try again in a few seconds"); + } + } + + public void _clearDropStats(CommandInterpreter ci) { + if(sessionInitiated) { + ci.print("Clearing drop statistics... "); + this.rpcProvider.clearStats(); + this.provider.clearStats(); + ci.println("Done."); + + } else { + ci.println("Session not initiated, try again in a few seconds"); + } + } + @Override public String getHelp() { String helpString = "----------------- dropAllPackets--------------\n" diff --git a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommiter.java b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommiter.java index 1726cedfb0..06b61c4ce7 100644 --- a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommiter.java +++ b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommiter.java @@ -54,6 +54,18 @@ public class DropTestCommiter implements PacketProcessingListener { private final DropTestProvider _manager; + private int _sent; + private int _rcvd; + + public DropTestStats getStats(){ + return new DropTestStats(this._sent, this._rcvd); + } + + public void clearStats(){ + this._sent = 0; + this._rcvd = 0; + } + public DropTestProvider getManager() { return this._manager; } @@ -63,9 +75,13 @@ public class DropTestCommiter implements PacketProcessingListener { } public void onPacketReceived(final PacketReceived notification) { - LOG.debug("onPacketReceived - Entering - " + notification); + // LOG.debug("onPacketReceived - Entering - " + notification); - // Get the Ingress nodeConnectorRef + synchronized(this) { + this._rcvd++; + } + + // Get the Ingress nodeConnectorRef final NodeConnectorRef ncr = notification.getIngress(); // Get the instance identifier for the nodeConnectorRef @@ -78,13 +94,13 @@ public class DropTestCommiter implements PacketProcessingListener { final NodeKey nodeKey = InstanceIdentifier.keyOf(nodeInstanceId); final byte[] rawPacket = notification.getPayload(); - LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}", - nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket)); + // LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}", + // nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket)); final byte[] srcMac = Arrays.copyOfRange(rawPacket, 6, 12); - LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}", - nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac)); + //LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}", + // nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac)); final MatchBuilder match = new MatchBuilder(); final EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder(); @@ -150,9 +166,13 @@ public class DropTestCommiter implements PacketProcessingListener { final Flow flow = fb.build(); final DataModificationTransaction transaction = this._manager.getDataService().beginTransaction(); - LOG.debug("onPacketReceived - About to write flow - " + flow); + // LOG.debug("onPacketReceived - About to write flow - " + flow); transaction.putConfigurationData(flowInstanceId, flow); transaction.commit(); - LOG.debug("onPacketReceived - About to write flow commited"); + // LOG.debug("onPacketReceived - About to write flow commited"); + synchronized(this) { + this._sent++; + } + } } diff --git a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestProvider.java b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestProvider.java index db0bcfb77c..1ec19d38cb 100644 --- a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestProvider.java +++ b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestProvider.java @@ -23,6 +23,14 @@ public class DropTestProvider implements AutoCloseable { private Registration listenerRegistration; private final DropTestCommiter commiter = new DropTestCommiter(this); + public DropTestStats getStats() { + return this.commiter.getStats(); + } + + public void clearStats() { + this.commiter.clearStats(); + } + public DataProviderService getDataService() { return this._dataService; } diff --git a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcProvider.java b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcProvider.java index 283f9c15d5..4c92012213 100644 --- a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcProvider.java +++ b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcProvider.java @@ -44,6 +44,20 @@ public class DropTestRpcProvider implements AutoCloseable { this.listenerRegistration = this.getNotificationService().registerNotificationListener(this.commiter); LOG.debug("DropTestProvider Started."); } + + public DropTestStats getStats() { + if(this.commiter != null) { + return this.commiter.getStats(); + } else { + return new DropTestStats("Not initialized yet."); + } + } + + public void clearStats() { + if(this.commiter != null) { + this.commiter.clearStats(); + } + } public void close() { try { diff --git a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcSender.java b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcSender.java index a9d8dc43a1..180c6fc638 100644 --- a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcSender.java +++ b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcSender.java @@ -7,7 +7,6 @@ */ package org.opendaylight.openflowplugin.droptest; -import org.apache.commons.codec.binary.Hex; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction; @@ -49,6 +48,20 @@ public class DropTestRpcSender implements PacketProcessingListener { private final DropTestRpcProvider _manager; private final SalFlowService _flowService; + + private int _sent; + private int _rcvd; + private int _excs; + + public DropTestStats getStats(){ + return new DropTestStats(this._sent, this._rcvd, this._excs); + } + + public void clearStats(){ + this._sent = 0; + this._rcvd = 0; + this._excs = 0; + } public DropTestRpcProvider getManager() { return this._manager; @@ -63,85 +76,103 @@ public class DropTestRpcSender implements PacketProcessingListener { this._flowService = flowService; } - public void onPacketReceived(final PacketReceived notification) { - LOG.debug("onPacketReceived - Entering - " + notification); - - // Get the Ingress nodeConnectorRef - final NodeConnectorRef ncr = notification.getIngress(); - - // Get the instance identifier for the nodeConnectorRef - final InstanceIdentifier ncri = (InstanceIdentifier) ncr.getValue(); - final NodeConnectorKey ncKey = InstanceIdentifier.keyOf(ncri); - - // Get the instanceID for the Node in the tree above us - final InstanceIdentifier nodeInstanceId = ncri.firstIdentifierOf(Node.class); - final NodeKey nodeKey = InstanceIdentifier.keyOf(nodeInstanceId); - final byte[] rawPacket = notification.getPayload(); - - LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}", - nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket)); - - final byte[] srcMac = Arrays.copyOfRange(rawPacket, 6, 12); - - LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}", - nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac)); - - final MatchBuilder match = new MatchBuilder(); - final EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder(); - final EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder(); - - //TODO: use HEX, use binary form - //Hex.decodeHex("000000000001".toCharArray()); - - ethSourceBuilder.setAddress(new MacAddress(DropTestUtils.macToString(srcMac))); - ethernetMatch.setEthernetSource(ethSourceBuilder.build()); - match.setEthernetMatch(ethernetMatch.build()); - final DropActionBuilder dab = new DropActionBuilder(); - final DropAction dropAction = dab.build(); - final ActionBuilder ab = new ActionBuilder(); - ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build()); - - // Add our drop action to a list - final ArrayList actionList = new ArrayList(); - actionList.add(ab.build()); - - // Create an Apply Action - final ApplyActionsBuilder aab = new ApplyActionsBuilder(); - aab.setAction(actionList); - - // Wrap our Apply Action in an Instruction - final InstructionBuilder ib = new InstructionBuilder(); - ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build()); - - // Put our Instruction in a list of Instructions - final InstructionsBuilder isb = new InstructionsBuilder();; - final ArrayList instructions = new ArrayList(); - instructions.add(ib.build()); - isb.setInstruction(instructions); - - // Finally build our flow - final AddFlowInputBuilder fb = new AddFlowInputBuilder(); - fb.setMatch(match.build()); - fb.setInstructions(isb.build()); - //fb.setId(new FlowId(Long.toString(fb.hashCode))); - - // Construct the flow instance id - final InstanceIdentifier flowInstanceId = InstanceIdentifier - .builder(Nodes.class) // File under nodes - .child(Node.class, nodeKey).toInstance(); // A particular node indentified by nodeKey - fb.setNode(new NodeRef(flowInstanceId)); - - fb.setPriority(4); - fb.setBufferId(0L); - final BigInteger value = new BigInteger("10", 10); - fb.setCookie(new FlowCookie(value)); - fb.setCookieMask(new FlowCookie(value)); - fb.setTableId(Short.valueOf(((short) 0))); - fb.setHardTimeout(300); - fb.setIdleTimeout(240); - fb.setFlags(new FlowModFlags(false, false, false, false, false)); - - // Add flow - this.getFlowService().addFlow(fb.build()); + @Override + public void onPacketReceived(final PacketReceived notification) { + // LOG.debug("onPacketReceived - Entering - " + notification); + + synchronized(this) { + this._rcvd++; + } + + try { + // Get the Ingress nodeConnectorRef + final NodeConnectorRef ncr = notification.getIngress(); + + // Get the instance identifier for the nodeConnectorRef + final InstanceIdentifier ncri = (InstanceIdentifier) ncr.getValue(); + final NodeConnectorKey ncKey = InstanceIdentifier.keyOf(ncri); + + // Get the instanceID for the Node in the tree above us + final InstanceIdentifier nodeInstanceId = ncri.firstIdentifierOf(Node.class); + final NodeKey nodeKey = InstanceIdentifier.keyOf(nodeInstanceId); + final byte[] rawPacket = notification.getPayload(); + + // LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}", + // nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket)); + + final byte[] srcMac = Arrays.copyOfRange(rawPacket, 6, 12); + + //LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}", + // nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac)); + + + final MatchBuilder match = new MatchBuilder(); + final EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder(); + final EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder(); + + //TODO: use HEX, use binary form + //Hex.decodeHex("000000000001".toCharArray()); + + ethSourceBuilder.setAddress(new MacAddress(DropTestUtils.macToString(srcMac))); + ethernetMatch.setEthernetSource(ethSourceBuilder.build()); + match.setEthernetMatch(ethernetMatch.build()); + final DropActionBuilder dab = new DropActionBuilder(); + final DropAction dropAction = dab.build(); + final ActionBuilder ab = new ActionBuilder(); + ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build()); + + // Add our drop action to a list + final ArrayList actionList = new ArrayList(); + actionList.add(ab.build()); + + // Create an Apply Action + final ApplyActionsBuilder aab = new ApplyActionsBuilder(); + aab.setAction(actionList); + + // Wrap our Apply Action in an Instruction + final InstructionBuilder ib = new InstructionBuilder(); + ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build()); + + // Put our Instruction in a list of Instructions + final InstructionsBuilder isb = new InstructionsBuilder();; + final ArrayList instructions = new ArrayList(); + instructions.add(ib.build()); + isb.setInstruction(instructions); + + // Finally build our flow + final AddFlowInputBuilder fb = new AddFlowInputBuilder(); + fb.setMatch(match.build()); + fb.setInstructions(isb.build()); + //fb.setId(new FlowId(Long.toString(fb.hashCode))); + + // Construct the flow instance id + final InstanceIdentifier flowInstanceId = InstanceIdentifier + .builder(Nodes.class) // File under nodes + .child(Node.class, nodeKey).toInstance(); // A particular node identified by nodeKey + fb.setNode(new NodeRef(flowInstanceId)); + + fb.setPriority(4); + fb.setBufferId(0L); + final BigInteger value = new BigInteger("10", 10); + fb.setCookie(new FlowCookie(value)); + fb.setCookieMask(new FlowCookie(value)); + fb.setTableId(Short.valueOf(((short) 0))); + fb.setHardTimeout(300); + fb.setIdleTimeout(240); + fb.setFlags(new FlowModFlags(false, false, false, false, false)); + + // Add flow + this.getFlowService().addFlow(fb.build()); + + synchronized (this) { + this._sent++; + } + } catch (Exception e) { + // TODO Auto-generated catch block + LOG.error("dropTestRpc exception: {}", e.toString()); + synchronized (this) { + this._excs++; + } + } } } diff --git a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestStats.java b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestStats.java new file mode 100644 index 0000000000..1e7c275702 --- /dev/null +++ b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestStats.java @@ -0,0 +1,48 @@ +package org.opendaylight.openflowplugin.droptest; + +public class DropTestStats { + private final int _rcvd; + private final int _sent; + private final int _excs; + private final String _message; + + public DropTestStats(int sent, int rcvd) { + this._sent = sent; + this._rcvd = rcvd; + this._excs = 0; + this._message = null; + } + + public DropTestStats(int sent, int rcvd, int excs) { + this._sent = sent; + this._rcvd = rcvd; + this._excs = excs; + this._message = null; + } + + public DropTestStats(String message) { + this._sent = -1; + this._rcvd = -1; + this._excs = -1; + this._message = message; + } + + public int getSent() { return this._sent; } + public int getRcvd() { return this._rcvd; } + public String getMessage() { return this._message; }; + + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + if (this._message == null) { + result.append("Rcvd: " + this._rcvd); + result.append(", Sent: " + this._sent); + result.append("; Exceptions: " + this._excs); + } else { + result.append(this._message); + } + + return result.toString(); + } + +}