Committed by
Gerrit Code Review
Fix GroupKey interpretation in REST
Input string from REST should not be converted into byte array directly. Before: "1" -> ascii 49 -> 0x31 After: "0x01" -> 0x01 GroupKey is a byte array with arbitrary length and represented by hex string Change-Id: If27101f0e5522212c7e434fab58b66e67e9676d7
Showing
9 changed files
with
39 additions
and
15 deletions
| ... | @@ -23,7 +23,6 @@ import java.util.Arrays; | ... | @@ -23,7 +23,6 @@ import java.util.Arrays; |
| 23 | * Default implementation of group key interface. | 23 | * Default implementation of group key interface. |
| 24 | */ | 24 | */ |
| 25 | public class DefaultGroupKey implements GroupKey { | 25 | public class DefaultGroupKey implements GroupKey { |
| 26 | - | ||
| 27 | private final byte[] key; | 26 | private final byte[] key; |
| 28 | protected static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); | 27 | protected static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); |
| 29 | 28 | ||
| ... | @@ -66,7 +65,6 @@ public class DefaultGroupKey implements GroupKey { | ... | @@ -66,7 +65,6 @@ public class DefaultGroupKey implements GroupKey { |
| 66 | hexChars[j * 2] = HEX_ARRAY[v >>> 4]; | 65 | hexChars[j * 2] = HEX_ARRAY[v >>> 4]; |
| 67 | hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; | 66 | hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; |
| 68 | } | 67 | } |
| 69 | - return "GroupKey:0x" + new String(hexChars); | 68 | + return "0x" + new String(hexChars); |
| 70 | } | 69 | } |
| 71 | - | ||
| 72 | } | 70 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -18,6 +18,7 @@ package org.onosproject.codec.impl; | ... | @@ -18,6 +18,7 @@ package org.onosproject.codec.impl; |
| 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 org.onlab.util.HexString; | ||
| 21 | import org.onosproject.codec.CodecContext; | 22 | import org.onosproject.codec.CodecContext; |
| 22 | import org.onosproject.codec.JsonCodec; | 23 | import org.onosproject.codec.JsonCodec; |
| 23 | import org.onosproject.core.ApplicationId; | 24 | import org.onosproject.core.ApplicationId; |
| ... | @@ -118,7 +119,11 @@ public final class GroupCodec extends JsonCodec<Group> { | ... | @@ -118,7 +119,11 @@ public final class GroupCodec extends JsonCodec<Group> { |
| 118 | // parse group key (appCookie) | 119 | // parse group key (appCookie) |
| 119 | String groupKeyStr = nullIsIllegal(json.get(APP_COOKIE), | 120 | String groupKeyStr = nullIsIllegal(json.get(APP_COOKIE), |
| 120 | APP_COOKIE + MISSING_MEMBER_MESSAGE).asText(); | 121 | APP_COOKIE + MISSING_MEMBER_MESSAGE).asText(); |
| 121 | - GroupKey groupKey = new DefaultGroupKey(groupKeyStr.getBytes()); | 122 | + if (!groupKeyStr.startsWith("0x")) { |
| 123 | + throw new IllegalArgumentException("APP_COOKIE must be a hex string starts with 0x"); | ||
| 124 | + } | ||
| 125 | + GroupKey groupKey = new DefaultGroupKey(HexString.fromHexString( | ||
| 126 | + groupKeyStr.split("0x")[1], "")); | ||
| 122 | 127 | ||
| 123 | // parse device id | 128 | // parse device id |
| 124 | DeviceId deviceId = DeviceId.deviceId(nullIsIllegal(json.get(DEVICE_ID), | 129 | DeviceId deviceId = DeviceId.deviceId(nullIsIllegal(json.get(DEVICE_ID), | ... | ... |
| ... | @@ -44,6 +44,7 @@ import static org.easymock.EasyMock.replay; | ... | @@ -44,6 +44,7 @@ import static org.easymock.EasyMock.replay; |
| 44 | import static org.hamcrest.MatcherAssert.assertThat; | 44 | import static org.hamcrest.MatcherAssert.assertThat; |
| 45 | import static org.hamcrest.Matchers.is; | 45 | import static org.hamcrest.Matchers.is; |
| 46 | import static org.hamcrest.Matchers.notNullValue; | 46 | import static org.hamcrest.Matchers.notNullValue; |
| 47 | +import static org.hamcrest.Matchers.equalTo; | ||
| 47 | import static org.onosproject.codec.impl.GroupJsonMatcher.matchesGroup; | 48 | import static org.onosproject.codec.impl.GroupJsonMatcher.matchesGroup; |
| 48 | import static org.onosproject.net.NetTestTools.APP_ID; | 49 | import static org.onosproject.net.NetTestTools.APP_ID; |
| 49 | 50 | ||
| ... | @@ -109,6 +110,11 @@ public class GroupCodecTest { | ... | @@ -109,6 +110,11 @@ public class GroupCodecTest { |
| 109 | assertThat(((Instructions.OutputInstruction) instruction1).port(), is(PortNumber.portNumber(2))); | 110 | assertThat(((Instructions.OutputInstruction) instruction1).port(), is(PortNumber.portNumber(2))); |
| 110 | } | 111 | } |
| 111 | 112 | ||
| 113 | + @Test(expected = IllegalArgumentException.class) | ||
| 114 | + public void invalidGroupTest() throws IOException { | ||
| 115 | + Group group = getGroup("invalid-group.json"); | ||
| 116 | + } | ||
| 117 | + | ||
| 112 | /** | 118 | /** |
| 113 | * Checks that the data shared by all the resource is correct for a given group. | 119 | * Checks that the data shared by all the resource is correct for a given group. |
| 114 | * | 120 | * |
| ... | @@ -118,7 +124,8 @@ public class GroupCodecTest { | ... | @@ -118,7 +124,8 @@ public class GroupCodecTest { |
| 118 | assertThat(group.appId(), is(APP_ID)); | 124 | assertThat(group.appId(), is(APP_ID)); |
| 119 | assertThat(group.deviceId().toString(), is("of:0000000000000001")); | 125 | assertThat(group.deviceId().toString(), is("of:0000000000000001")); |
| 120 | assertThat(group.type().toString(), is("ALL")); | 126 | assertThat(group.type().toString(), is("ALL")); |
| 121 | - assertThat(group.appCookie().key(), is("1".getBytes())); | 127 | + assertThat(group.appCookie().key(), |
| 128 | + equalTo(new byte[]{(byte) 0x12, (byte) 0x34, (byte) 0xAB, (byte) 0xCD})); | ||
| 122 | assertThat(group.id().id(), is(1)); | 129 | assertThat(group.id().id(), is(1)); |
| 123 | } | 130 | } |
| 124 | 131 | ... | ... |
| 1 | +{ | ||
| 2 | + "type": "ALL", | ||
| 3 | + "deviceId": "of:0000000000000001", | ||
| 4 | + "appCookie": "1234abCD", | ||
| 5 | + "groupId": "1", | ||
| 6 | + "buckets": [ | ||
| 7 | + { | ||
| 8 | + "treatment": { | ||
| 9 | + "instructions": [ | ||
| 10 | + { | ||
| 11 | + "type": "OUTPUT", | ||
| 12 | + "port": 2 | ||
| 13 | + } | ||
| 14 | + ] | ||
| 15 | + } | ||
| 16 | + } | ||
| 17 | + ] | ||
| 18 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -67,7 +67,7 @@ | ... | @@ -67,7 +67,7 @@ |
| 67 | "appCookie": { | 67 | "appCookie": { |
| 68 | "type": "string", | 68 | "type": "string", |
| 69 | "description": "application cookie", | 69 | "description": "application cookie", |
| 70 | - "example": "1" | 70 | + "example": "0x1234abcd" |
| 71 | }, | 71 | }, |
| 72 | "buckets": { | 72 | "buckets": { |
| 73 | "type": "array", | 73 | "type": "array", | ... | ... |
| ... | @@ -67,11 +67,6 @@ | ... | @@ -67,11 +67,6 @@ |
| 67 | "description": "types of the group", | 67 | "description": "types of the group", |
| 68 | "example": "ALL" | 68 | "example": "ALL" |
| 69 | }, | 69 | }, |
| 70 | - "deviceId": { | ||
| 71 | - "type": "string", | ||
| 72 | - "description": "device identifier", | ||
| 73 | - "example": "of:0000000000000003" | ||
| 74 | - }, | ||
| 75 | "appId": { | 70 | "appId": { |
| 76 | "type": "string", | 71 | "type": "string", |
| 77 | "description": "application identifier", | 72 | "description": "application identifier", |
| ... | @@ -80,7 +75,7 @@ | ... | @@ -80,7 +75,7 @@ |
| 80 | "appCookie": { | 75 | "appCookie": { |
| 81 | "type": "string", | 76 | "type": "string", |
| 82 | "description": "application cookie", | 77 | "description": "application cookie", |
| 83 | - "example": "1" | 78 | + "example": "0x1234abcd" |
| 84 | }, | 79 | }, |
| 85 | "buckets": { | 80 | "buckets": { |
| 86 | "type": "array", | 81 | "type": "array", | ... | ... |
| ... | @@ -19,7 +19,8 @@ | ... | @@ -19,7 +19,8 @@ |
| 19 | }, | 19 | }, |
| 20 | "appCookie": { | 20 | "appCookie": { |
| 21 | "type": "string", | 21 | "type": "string", |
| 22 | - "example": "1" | 22 | + "description": "application cookie. Arbitrary length byte array represented in hex string", |
| 23 | + "example": "0x1234abcd" | ||
| 23 | }, | 24 | }, |
| 24 | "groupId": { | 25 | "groupId": { |
| 25 | "type": "string", | 26 | "type": "string", | ... | ... |
-
Please register or login to post a comment