Add bulk delete for flows
Change-Id: I77f266c75d0f9d1e99155eb48c216bff3fab2f40
Showing
1 changed file
with
56 additions
and
1 deletions
| ... | @@ -19,6 +19,7 @@ import java.io.IOException; | ... | @@ -19,6 +19,7 @@ import java.io.IOException; |
| 19 | import java.io.InputStream; | 19 | import java.io.InputStream; |
| 20 | import java.net.URI; | 20 | import java.net.URI; |
| 21 | import java.net.URISyntaxException; | 21 | import java.net.URISyntaxException; |
| 22 | +import java.util.ArrayList; | ||
| 22 | import java.util.List; | 23 | import java.util.List; |
| 23 | import java.util.stream.StreamSupport; | 24 | import java.util.stream.StreamSupport; |
| 24 | 25 | ||
| ... | @@ -44,6 +45,10 @@ import org.onosproject.rest.AbstractWebResource; | ... | @@ -44,6 +45,10 @@ import org.onosproject.rest.AbstractWebResource; |
| 44 | import com.fasterxml.jackson.databind.JsonNode; | 45 | import com.fasterxml.jackson.databind.JsonNode; |
| 45 | import com.fasterxml.jackson.databind.node.ArrayNode; | 46 | import com.fasterxml.jackson.databind.node.ArrayNode; |
| 46 | import com.fasterxml.jackson.databind.node.ObjectNode; | 47 | import com.fasterxml.jackson.databind.node.ObjectNode; |
| 48 | +import com.google.common.collect.ArrayListMultimap; | ||
| 49 | +import com.google.common.collect.ListMultimap; | ||
| 50 | + | ||
| 51 | +import static org.onlab.util.Tools.nullIsNotFound; | ||
| 47 | 52 | ||
| 48 | /** | 53 | /** |
| 49 | * Query and program flow rules. | 54 | * Query and program flow rules. |
| ... | @@ -53,7 +58,10 @@ import com.fasterxml.jackson.databind.node.ObjectNode; | ... | @@ -53,7 +58,10 @@ import com.fasterxml.jackson.databind.node.ObjectNode; |
| 53 | public class FlowsWebResource extends AbstractWebResource { | 58 | public class FlowsWebResource extends AbstractWebResource { |
| 54 | 59 | ||
| 55 | public static final String DEVICE_NOT_FOUND = "Device is not found"; | 60 | public static final String DEVICE_NOT_FOUND = "Device is not found"; |
| 61 | + public static final String FLOW_NOT_FOUND = "Flow is not found"; | ||
| 56 | public static final String FLOWS = "flows"; | 62 | public static final String FLOWS = "flows"; |
| 63 | + public static final String DEVICE_ID = "deviceId"; | ||
| 64 | + public static final String FLOW_ID = "flowId"; | ||
| 57 | 65 | ||
| 58 | final FlowRuleService service = get(FlowRuleService.class); | 66 | final FlowRuleService service = get(FlowRuleService.class); |
| 59 | final ObjectNode root = mapper().createObjectNode(); | 67 | final ObjectNode root = mapper().createObjectNode(); |
| ... | @@ -102,10 +110,16 @@ public class FlowsWebResource extends AbstractWebResource { | ... | @@ -102,10 +110,16 @@ public class FlowsWebResource extends AbstractWebResource { |
| 102 | ArrayNode flowsArray = (ArrayNode) jsonTree.get(FLOWS); | 110 | ArrayNode flowsArray = (ArrayNode) jsonTree.get(FLOWS); |
| 103 | List<FlowRule> rules = codec(FlowRule.class).decode(flowsArray, this); | 111 | List<FlowRule> rules = codec(FlowRule.class).decode(flowsArray, this); |
| 104 | service.applyFlowRules(rules.toArray(new FlowRule[rules.size()])); | 112 | service.applyFlowRules(rules.toArray(new FlowRule[rules.size()])); |
| 113 | + rules.forEach(flowRule -> { | ||
| 114 | + ObjectNode flowNode = mapper().createObjectNode(); | ||
| 115 | + flowNode.put(DEVICE_ID, flowRule.deviceId().toString()) | ||
| 116 | + .put(FLOW_ID, flowRule.id().value()); | ||
| 117 | + flowsNode.add(flowNode); | ||
| 118 | + }); | ||
| 105 | } catch (IOException ex) { | 119 | } catch (IOException ex) { |
| 106 | throw new IllegalArgumentException(ex); | 120 | throw new IllegalArgumentException(ex); |
| 107 | } | 121 | } |
| 108 | - return Response.ok().build(); | 122 | + return Response.ok(root).build(); |
| 109 | } | 123 | } |
| 110 | 124 | ||
| 111 | /** | 125 | /** |
| ... | @@ -224,4 +238,45 @@ public class FlowsWebResource extends AbstractWebResource { | ... | @@ -224,4 +238,45 @@ public class FlowsWebResource extends AbstractWebResource { |
| 224 | .forEach(service::removeFlowRules); | 238 | .forEach(service::removeFlowRules); |
| 225 | } | 239 | } |
| 226 | 240 | ||
| 241 | + /** | ||
| 242 | + * Removes a batch of flow rules. | ||
| 243 | + */ | ||
| 244 | + @DELETE | ||
| 245 | + @Produces(MediaType.APPLICATION_JSON) | ||
| 246 | + public void deleteFlows(InputStream stream) { | ||
| 247 | + ListMultimap<DeviceId, Long> deviceMap = ArrayListMultimap.create(); | ||
| 248 | + List<FlowEntry> rulesToRemove = new ArrayList<>(); | ||
| 249 | + | ||
| 250 | + try { | ||
| 251 | + ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream); | ||
| 252 | + | ||
| 253 | + JsonNode jsonFlows = jsonTree.get("flows"); | ||
| 254 | + | ||
| 255 | + jsonFlows.forEach(node -> { | ||
| 256 | + DeviceId deviceId = | ||
| 257 | + DeviceId.deviceId( | ||
| 258 | + nullIsNotFound(node.get(DEVICE_ID), | ||
| 259 | + DEVICE_NOT_FOUND).asText()); | ||
| 260 | + long flowId = nullIsNotFound(node.get(FLOW_ID), | ||
| 261 | + FLOW_NOT_FOUND).asLong(); | ||
| 262 | + deviceMap.put(deviceId, flowId); | ||
| 263 | + | ||
| 264 | + }); | ||
| 265 | + } catch (IOException ex) { | ||
| 266 | + throw new IllegalArgumentException(ex); | ||
| 267 | + } | ||
| 268 | + | ||
| 269 | + deviceMap.keySet().forEach(deviceId -> { | ||
| 270 | + List<Long> flowIds = deviceMap.get(deviceId); | ||
| 271 | + Iterable<FlowEntry> entries = service.getFlowEntries(deviceId); | ||
| 272 | + flowIds.forEach(flowId -> { | ||
| 273 | + StreamSupport.stream(entries.spliterator(), false) | ||
| 274 | + .filter(entry -> flowId == entry.id().value()) | ||
| 275 | + .forEach(rulesToRemove::add); | ||
| 276 | + }); | ||
| 277 | + }); | ||
| 278 | + | ||
| 279 | + service.removeFlowRules(rulesToRemove.toArray(new FlowEntry[0])); | ||
| 280 | + } | ||
| 281 | + | ||
| 227 | } | 282 | } | ... | ... |
-
Please register or login to post a comment