Adding ability to push flow rule batches via REST API.
Change-Id: I60a9b121cd9cc35a9704e59b8f1fde413af0a72f
Showing
3 changed files
with
148 additions
and
2 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.List; | ||
| 22 | import java.util.stream.StreamSupport; | 23 | import java.util.stream.StreamSupport; |
| 23 | 24 | ||
| 24 | import javax.ws.rs.Consumes; | 25 | import javax.ws.rs.Consumes; |
| ... | @@ -50,11 +51,13 @@ import com.fasterxml.jackson.databind.node.ObjectNode; | ... | @@ -50,11 +51,13 @@ import com.fasterxml.jackson.databind.node.ObjectNode; |
| 50 | 51 | ||
| 51 | @Path("flows") | 52 | @Path("flows") |
| 52 | public class FlowsWebResource extends AbstractWebResource { | 53 | public class FlowsWebResource extends AbstractWebResource { |
| 54 | + | ||
| 53 | public static final String DEVICE_NOT_FOUND = "Device is not found"; | 55 | public static final String DEVICE_NOT_FOUND = "Device is not found"; |
| 56 | + public static final String FLOWS = "flows"; | ||
| 54 | 57 | ||
| 55 | final FlowRuleService service = get(FlowRuleService.class); | 58 | final FlowRuleService service = get(FlowRuleService.class); |
| 56 | final ObjectNode root = mapper().createObjectNode(); | 59 | final ObjectNode root = mapper().createObjectNode(); |
| 57 | - final ArrayNode flowsNode = root.putArray("flows"); | 60 | + final ArrayNode flowsNode = root.putArray(FLOWS); |
| 58 | 61 | ||
| 59 | /** | 62 | /** |
| 60 | * Get all flow entries. Returns array of all flow rules in the system. | 63 | * Get all flow entries. Returns array of all flow rules in the system. |
| ... | @@ -78,6 +81,34 @@ public class FlowsWebResource extends AbstractWebResource { | ... | @@ -78,6 +81,34 @@ public class FlowsWebResource extends AbstractWebResource { |
| 78 | } | 81 | } |
| 79 | 82 | ||
| 80 | /** | 83 | /** |
| 84 | + * Create new flow rules. Creates and installs a new flow rules.<br> | ||
| 85 | + * Instructions description: | ||
| 86 | + * https://wiki.onosproject.org/display/ONOS/Flow+Rule+Instructions | ||
| 87 | + * <br> | ||
| 88 | + * Criteria description: | ||
| 89 | + * https://wiki.onosproject.org/display/ONOS/Flow+Rule+Criteria | ||
| 90 | + * | ||
| 91 | + * @onos.rsModel FlowsBatchPost | ||
| 92 | + * @param stream flow rules JSON | ||
| 93 | + * @return status of the request - CREATED if the JSON is correct, | ||
| 94 | + * BAD_REQUEST if the JSON is invalid | ||
| 95 | + */ | ||
| 96 | + @POST | ||
| 97 | + @Consumes(MediaType.APPLICATION_JSON) | ||
| 98 | + @Produces(MediaType.APPLICATION_JSON) | ||
| 99 | + public Response createFlows(InputStream stream) { | ||
| 100 | + try { | ||
| 101 | + ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream); | ||
| 102 | + ArrayNode flowsArray = (ArrayNode) jsonTree.get(FLOWS); | ||
| 103 | + List<FlowRule> rules = codec(FlowRule.class).decode(flowsArray, this); | ||
| 104 | + service.applyFlowRules(rules.toArray(new FlowRule[rules.size()])); | ||
| 105 | + } catch (IOException ex) { | ||
| 106 | + throw new IllegalArgumentException(ex); | ||
| 107 | + } | ||
| 108 | + return Response.ok().build(); | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + /** | ||
| 81 | * Get flow entries of a device. Returns array of all flow rules for the | 112 | * Get flow entries of a device. Returns array of all flow rules for the |
| 82 | * specified device. | 113 | * specified device. |
| 83 | * @onos.rsModel Flows | 114 | * @onos.rsModel Flows | ... | ... |
| 1 | +{ | ||
| 2 | + "type": "object", | ||
| 3 | + "title": "flows", | ||
| 4 | + "required": [ | ||
| 5 | + "flows" | ||
| 6 | + ], | ||
| 7 | + "properties": { | ||
| 8 | + "flows": { | ||
| 9 | + "type": "array", | ||
| 10 | + "xml": { | ||
| 11 | + "name": "flows", | ||
| 12 | + "wrapped": true | ||
| 13 | + }, | ||
| 14 | + "items": { | ||
| 15 | + "type": "object", | ||
| 16 | + "title": "flow", | ||
| 17 | + "required": [ | ||
| 18 | + "priority", | ||
| 19 | + "timeout", | ||
| 20 | + "isPermanent", | ||
| 21 | + "deviceId" | ||
| 22 | + ], | ||
| 23 | + "properties": { | ||
| 24 | + "priority": { | ||
| 25 | + "type": "integer", | ||
| 26 | + "format": "int64", | ||
| 27 | + "example": 400000 | ||
| 28 | + }, | ||
| 29 | + "timeout": { | ||
| 30 | + "type": "integer", | ||
| 31 | + "format": "int64", | ||
| 32 | + "example": 0 | ||
| 33 | + }, | ||
| 34 | + "isPermanent": { | ||
| 35 | + "type": "boolean", | ||
| 36 | + "example": true | ||
| 37 | + }, | ||
| 38 | + "deviceId": { | ||
| 39 | + "type": "string", | ||
| 40 | + "example": "of:0000000000000001" | ||
| 41 | + }, | ||
| 42 | + "treatment": { | ||
| 43 | + "type": "object", | ||
| 44 | + "title": "treatment", | ||
| 45 | + "required": [ | ||
| 46 | + "instructions", | ||
| 47 | + "deferred" | ||
| 48 | + ], | ||
| 49 | + "properties": { | ||
| 50 | + "instructions": { | ||
| 51 | + "type": "array", | ||
| 52 | + "title": "treatment", | ||
| 53 | + "required": [ | ||
| 54 | + "properties", | ||
| 55 | + "port" | ||
| 56 | + ], | ||
| 57 | + "items": { | ||
| 58 | + "type": "object", | ||
| 59 | + "title": "instructions", | ||
| 60 | + "required": [ | ||
| 61 | + "type", | ||
| 62 | + "port" | ||
| 63 | + ], | ||
| 64 | + "properties": { | ||
| 65 | + "type": { | ||
| 66 | + "type": "string", | ||
| 67 | + "example": "OUTPUT" | ||
| 68 | + }, | ||
| 69 | + "port": { | ||
| 70 | + "type": "string", | ||
| 71 | + "example": "CONTROLLER" | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + } | ||
| 75 | + } | ||
| 76 | + } | ||
| 77 | + }, | ||
| 78 | + "selector": { | ||
| 79 | + "type": "object", | ||
| 80 | + "title": "selector", | ||
| 81 | + "required": [ | ||
| 82 | + "criteria" | ||
| 83 | + ], | ||
| 84 | + "properties": { | ||
| 85 | + "criteria": { | ||
| 86 | + "type": "array", | ||
| 87 | + "xml": { | ||
| 88 | + "name": "criteria", | ||
| 89 | + "wrapped": true | ||
| 90 | + }, | ||
| 91 | + "items": { | ||
| 92 | + "type": "object", | ||
| 93 | + "title": "criteria", | ||
| 94 | + "properties": { | ||
| 95 | + "type": { | ||
| 96 | + "type": "string", | ||
| 97 | + "description": "Ethernet field name", | ||
| 98 | + "example": "ETH_TYPE" | ||
| 99 | + }, | ||
| 100 | + "ethType": { | ||
| 101 | + "type": "int64", | ||
| 102 | + "format": "int64", | ||
| 103 | + "example": "0x88cc", | ||
| 104 | + "description": "Ethernet frame type" | ||
| 105 | + } | ||
| 106 | + } | ||
| 107 | + } | ||
| 108 | + } | ||
| 109 | + } | ||
| 110 | + } | ||
| 111 | + } | ||
| 112 | + } | ||
| 113 | + } | ||
| 114 | + } | ||
| 115 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment