Showing
3 changed files
with
55 additions
and
4 deletions
| 1 | +package org.onlab.onos.cli.net; | ||
| 2 | + | ||
| 3 | +import java.util.List; | ||
| 4 | +import java.util.SortedSet; | ||
| 5 | + | ||
| 6 | +import org.apache.karaf.shell.console.Completer; | ||
| 7 | +import org.apache.karaf.shell.console.completer.StringsCompleter; | ||
| 8 | +import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * Device ID completer. | ||
| 12 | + */ | ||
| 13 | +public class FlowRuleStatusCompleter implements Completer { | ||
| 14 | + @Override | ||
| 15 | + public int complete(String buffer, int cursor, List<String> candidates) { | ||
| 16 | + // Delegate string completer | ||
| 17 | + StringsCompleter delegate = new StringsCompleter(); | ||
| 18 | + | ||
| 19 | + FlowRuleState[] states = FlowRuleState.values(); | ||
| 20 | + SortedSet<String> strings = delegate.getStrings(); | ||
| 21 | + for (int i = 0; i < states.length; i++) { | ||
| 22 | + strings.add(states[i].toString().toLowerCase()); | ||
| 23 | + } | ||
| 24 | + strings.add(FlowsListCommand.ANY); | ||
| 25 | + | ||
| 26 | + // Now let the completer do the work for figuring out what to offer. | ||
| 27 | + return delegate.complete(buffer, cursor, candidates); | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | +} |
| ... | @@ -13,6 +13,7 @@ import org.onlab.onos.net.Device; | ... | @@ -13,6 +13,7 @@ import org.onlab.onos.net.Device; |
| 13 | import org.onlab.onos.net.DeviceId; | 13 | import org.onlab.onos.net.DeviceId; |
| 14 | import org.onlab.onos.net.device.DeviceService; | 14 | import org.onlab.onos.net.device.DeviceService; |
| 15 | import org.onlab.onos.net.flow.FlowRule; | 15 | import org.onlab.onos.net.flow.FlowRule; |
| 16 | +import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | ||
| 16 | import org.onlab.onos.net.flow.FlowRuleService; | 17 | import org.onlab.onos.net.flow.FlowRuleService; |
| 17 | 18 | ||
| 18 | import com.google.common.collect.Maps; | 19 | import com.google.common.collect.Maps; |
| ... | @@ -24,15 +25,20 @@ import com.google.common.collect.Maps; | ... | @@ -24,15 +25,20 @@ import com.google.common.collect.Maps; |
| 24 | description = "Lists all currently-known flows.") | 25 | description = "Lists all currently-known flows.") |
| 25 | public class FlowsListCommand extends AbstractShellCommand { | 26 | public class FlowsListCommand extends AbstractShellCommand { |
| 26 | 27 | ||
| 28 | + public static final String ANY = "any"; | ||
| 29 | + | ||
| 27 | private static final String FMT = | 30 | private static final String FMT = |
| 28 | " id=%s, state=%s, bytes=%s, packets=%s, duration=%s, priority=%s"; | 31 | " id=%s, state=%s, bytes=%s, packets=%s, duration=%s, priority=%s"; |
| 29 | private static final String TFMT = " treatment=%s"; | 32 | private static final String TFMT = " treatment=%s"; |
| 30 | private static final String SFMT = " selector=%s"; | 33 | private static final String SFMT = " selector=%s"; |
| 31 | 34 | ||
| 32 | - @Argument(index = 0, name = "uri", description = "Device ID", | 35 | + @Argument(index = 1, name = "uri", description = "Device ID", |
| 33 | required = false, multiValued = false) | 36 | required = false, multiValued = false) |
| 34 | String uri = null; | 37 | String uri = null; |
| 35 | 38 | ||
| 39 | + @Argument(index = 0, name = "state", description = "Flow Rule state", | ||
| 40 | + required = false, multiValued = false) | ||
| 41 | + String state = null; | ||
| 36 | 42 | ||
| 37 | @Override | 43 | @Override |
| 38 | protected void execute() { | 44 | protected void execute() { |
| ... | @@ -52,11 +58,24 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -52,11 +58,24 @@ public class FlowsListCommand extends AbstractShellCommand { |
| 52 | */ | 58 | */ |
| 53 | protected Map<Device, List<FlowRule>> getSortedFlows(DeviceService deviceService, FlowRuleService service) { | 59 | protected Map<Device, List<FlowRule>> getSortedFlows(DeviceService deviceService, FlowRuleService service) { |
| 54 | Map<Device, List<FlowRule>> flows = Maps.newHashMap(); | 60 | Map<Device, List<FlowRule>> flows = Maps.newHashMap(); |
| 55 | - List<FlowRule> rules = newArrayList(); | 61 | + List<FlowRule> rules; |
| 62 | + FlowRuleState s = null; | ||
| 63 | + if (state != null && !state.equals("any")) { | ||
| 64 | + s = FlowRuleState.valueOf(state.toUpperCase()); | ||
| 65 | + } | ||
| 56 | Iterable<Device> devices = uri == null ? deviceService.getDevices() : | 66 | Iterable<Device> devices = uri == null ? deviceService.getDevices() : |
| 57 | Collections.singletonList(deviceService.getDevice(DeviceId.deviceId(uri))); | 67 | Collections.singletonList(deviceService.getDevice(DeviceId.deviceId(uri))); |
| 58 | for (Device d : devices) { | 68 | for (Device d : devices) { |
| 59 | - rules = newArrayList(service.getFlowEntries(d.id())); | 69 | + if (s == null) { |
| 70 | + rules = newArrayList(service.getFlowEntries(d.id())); | ||
| 71 | + } else { | ||
| 72 | + rules = newArrayList(); | ||
| 73 | + for (FlowRule f : service.getFlowEntries(d.id())) { | ||
| 74 | + if (f.state().equals(s)) { | ||
| 75 | + rules.add(f); | ||
| 76 | + } | ||
| 77 | + } | ||
| 78 | + } | ||
| 60 | Collections.sort(rules, Comparators.FLOW_RULE_COMPARATOR); | 79 | Collections.sort(rules, Comparators.FLOW_RULE_COMPARATOR); |
| 61 | flows.put(d, rules); | 80 | flows.put(d, rules); |
| 62 | } | 81 | } |
| ... | @@ -71,7 +90,7 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -71,7 +90,7 @@ public class FlowsListCommand extends AbstractShellCommand { |
| 71 | protected void printFlows(Device d, List<FlowRule> flows) { | 90 | protected void printFlows(Device d, List<FlowRule> flows) { |
| 72 | print("Device: " + d.id()); | 91 | print("Device: " + d.id()); |
| 73 | if (flows == null | flows.isEmpty()) { | 92 | if (flows == null | flows.isEmpty()) { |
| 74 | - print(" %s", "No flows installed."); | 93 | + print(" %s", "No flows."); |
| 75 | return; | 94 | return; |
| 76 | } | 95 | } |
| 77 | for (FlowRule f : flows) { | 96 | for (FlowRule f : flows) { | ... | ... |
| ... | @@ -73,6 +73,7 @@ | ... | @@ -73,6 +73,7 @@ |
| 73 | <command> | 73 | <command> |
| 74 | <action class="org.onlab.onos.cli.net.FlowsListCommand"/> | 74 | <action class="org.onlab.onos.cli.net.FlowsListCommand"/> |
| 75 | <completers> | 75 | <completers> |
| 76 | + <ref component-id="flowRuleStatusCompleter"/> | ||
| 76 | <ref component-id="deviceIdCompleter"/> | 77 | <ref component-id="deviceIdCompleter"/> |
| 77 | </completers> | 78 | </completers> |
| 78 | </command> | 79 | </command> |
| ... | @@ -87,5 +88,6 @@ | ... | @@ -87,5 +88,6 @@ |
| 87 | <bean id="clusterIdCompleter" class="org.onlab.onos.cli.net.ClusterIdCompleter"/> | 88 | <bean id="clusterIdCompleter" class="org.onlab.onos.cli.net.ClusterIdCompleter"/> |
| 88 | <bean id="roleCompleter" class="org.onlab.onos.cli.net.RoleCompleter"/> | 89 | <bean id="roleCompleter" class="org.onlab.onos.cli.net.RoleCompleter"/> |
| 89 | <bean id="hostIdCompleter" class="org.onlab.onos.cli.net.HostIdCompleter"/> | 90 | <bean id="hostIdCompleter" class="org.onlab.onos.cli.net.HostIdCompleter"/> |
| 91 | + <bean id="flowRuleStatusCompleter" class="org.onlab.onos.cli.net.FlowRuleStatusCompleter"/> | ||
| 90 | 92 | ||
| 91 | </blueprint> | 93 | </blueprint> | ... | ... |
-
Please register or login to post a comment