tom

Enhanced flow list command to be more parsable and to use sorted devices list.

Fixed NPE.
...@@ -47,7 +47,7 @@ public class FlowsListCommand extends AbstractShellCommand { ...@@ -47,7 +47,7 @@ public class FlowsListCommand extends AbstractShellCommand {
47 DeviceService deviceService = get(DeviceService.class); 47 DeviceService deviceService = get(DeviceService.class);
48 FlowRuleService service = get(FlowRuleService.class); 48 FlowRuleService service = get(FlowRuleService.class);
49 Map<Device, List<FlowEntry>> flows = getSortedFlows(deviceService, service); 49 Map<Device, List<FlowEntry>> flows = getSortedFlows(deviceService, service);
50 - for (Device d : flows.keySet()) { 50 + for (Device d : getSortedDevices(deviceService)) {
51 printFlows(d, flows.get(d)); 51 printFlows(d, flows.get(d));
52 } 52 }
53 } 53 }
...@@ -58,14 +58,15 @@ public class FlowsListCommand extends AbstractShellCommand { ...@@ -58,14 +58,15 @@ public class FlowsListCommand extends AbstractShellCommand {
58 * @param service device service 58 * @param service device service
59 * @return sorted device list 59 * @return sorted device list
60 */ 60 */
61 - protected Map<Device, List<FlowEntry>> getSortedFlows(DeviceService deviceService, FlowRuleService service) { 61 + protected Map<Device, List<FlowEntry>> getSortedFlows(DeviceService deviceService,
62 + FlowRuleService service) {
62 Map<Device, List<FlowEntry>> flows = Maps.newHashMap(); 63 Map<Device, List<FlowEntry>> flows = Maps.newHashMap();
63 List<FlowEntry> rules; 64 List<FlowEntry> rules;
64 FlowEntryState s = null; 65 FlowEntryState s = null;
65 if (state != null && !state.equals("any")) { 66 if (state != null && !state.equals("any")) {
66 s = FlowEntryState.valueOf(state.toUpperCase()); 67 s = FlowEntryState.valueOf(state.toUpperCase());
67 } 68 }
68 - Iterable<Device> devices = uri == null ? getSortedDevices(deviceService) : 69 + Iterable<Device> devices = uri == null ? deviceService.getDevices() :
69 Collections.singletonList(deviceService.getDevice(DeviceId.deviceId(uri))); 70 Collections.singletonList(deviceService.getDevice(DeviceId.deviceId(uri)));
70 for (Device d : devices) { 71 for (Device d : devices) {
71 if (s == null) { 72 if (s == null) {
...@@ -90,18 +91,16 @@ public class FlowsListCommand extends AbstractShellCommand { ...@@ -90,18 +91,16 @@ public class FlowsListCommand extends AbstractShellCommand {
90 * @param flows the set of flows for that device. 91 * @param flows the set of flows for that device.
91 */ 92 */
92 protected void printFlows(Device d, List<FlowEntry> flows) { 93 protected void printFlows(Device d, List<FlowEntry> flows) {
93 - print("Device: " + d.id()); 94 + boolean empty = flows == null || flows.isEmpty();
94 - if (flows == null | flows.isEmpty()) { 95 + print("deviceId=%s, flowRuleCount=%d", d.id(), empty ? 0 : flows.size());
95 - print(" %s", "No flows."); 96 + if (!empty) {
96 - return; 97 + for (FlowEntry f : flows) {
97 - } 98 + print(FMT, Long.toHexString(f.id().value()), f.state(), f.bytes(),
98 - for (FlowEntry f : flows) { 99 + f.packets(), f.life(), f.priority());
99 - print(FMT, Long.toHexString(f.id().value()), f.state(), f.bytes(), 100 + print(SFMT, f.selector().criteria());
100 - f.packets(), f.life(), f.priority()); 101 + print(TFMT, f.treatment().instructions());
101 - print(SFMT, f.selector().criteria()); 102 + }
102 - print(TFMT, f.treatment().instructions());
103 } 103 }
104 -
105 } 104 }
106 105
107 } 106 }
......
...@@ -113,7 +113,7 @@ public class ObjectiveTracker implements ObjectiveTrackerService { ...@@ -113,7 +113,7 @@ public class ObjectiveTracker implements ObjectiveTrackerService {
113 @Override 113 @Override
114 public void run() { 114 public void run() {
115 if (event.reasons() == null) { 115 if (event.reasons() == null) {
116 - delegate.triggerCompile(null, true); 116 + delegate.triggerCompile(new HashSet<IntentId>(), true);
117 117
118 } else { 118 } else {
119 Set<IntentId> toBeRecompiled = new HashSet<>(); 119 Set<IntentId> toBeRecompiled = new HashSet<>();
......