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