Yoonseon Han
Committed by Gerrit Code Review

[ONOS-5324] Issue with Meter POST Rest API

- ConsistentMapException while POST a Meter With non existent DeviceId

Changes
1. added DeviceID check mechanism to confirm
   the requested ID refers an available device.
2. Changed MeterResourceTest to address
   a specific deviceID (of:0000000000000001)

Change-Id: I9ce70a73dc03e9e7516e8aaff3895a66f3b69b13
...@@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.JsonNode; ...@@ -19,6 +19,7 @@ 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.onosproject.net.DeviceId; 21 import org.onosproject.net.DeviceId;
22 +import org.onosproject.net.device.DeviceService;
22 import org.onosproject.net.meter.DefaultMeterRequest; 23 import org.onosproject.net.meter.DefaultMeterRequest;
23 import org.onosproject.net.meter.Meter; 24 import org.onosproject.net.meter.Meter;
24 import org.onosproject.net.meter.MeterId; 25 import org.onosproject.net.meter.MeterId;
...@@ -140,12 +141,17 @@ public class MetersWebResource extends AbstractWebResource { ...@@ -140,12 +141,17 @@ public class MetersWebResource extends AbstractWebResource {
140 ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream); 141 ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
141 JsonNode specifiedDeviceId = jsonTree.get("deviceId"); 142 JsonNode specifiedDeviceId = jsonTree.get("deviceId");
142 143
143 - if (specifiedDeviceId != null && 144 + if ((specifiedDeviceId != null &&
144 - !specifiedDeviceId.asText().equals(deviceId)) { 145 + !specifiedDeviceId.asText().equals(deviceId)) ||
146 + get(DeviceService.class).getDevice(DeviceId.deviceId(deviceId))
147 + == null) {
145 throw new IllegalArgumentException(DEVICE_INVALID); 148 throw new IllegalArgumentException(DEVICE_INVALID);
146 } 149 }
150 +
147 jsonTree.put("deviceId", deviceId); 151 jsonTree.put("deviceId", deviceId);
148 - final MeterRequest meterRequest = codec(MeterRequest.class).decode(jsonTree, this); 152 + final MeterRequest meterRequest = codec(MeterRequest.class)
153 + .decode(jsonTree, this);
154 +
149 final Meter meter = meterService.submit(meterRequest); 155 final Meter meter = meterService.submit(meterRequest);
150 156
151 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder() 157 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
......
...@@ -87,10 +87,13 @@ public class MetersResourceTest extends ResourceTest { ...@@ -87,10 +87,13 @@ public class MetersResourceTest extends ResourceTest {
87 final DeviceId deviceId1 = DeviceId.deviceId("1"); 87 final DeviceId deviceId1 = DeviceId.deviceId("1");
88 final DeviceId deviceId2 = DeviceId.deviceId("2"); 88 final DeviceId deviceId2 = DeviceId.deviceId("2");
89 final DeviceId deviceId3 = DeviceId.deviceId("3"); 89 final DeviceId deviceId3 = DeviceId.deviceId("3");
90 + final DeviceId deviceId4 = DeviceId.deviceId("of:0000000000000001");
90 final Device device1 = new DefaultDevice(null, deviceId1, Device.Type.OTHER, 91 final Device device1 = new DefaultDevice(null, deviceId1, Device.Type.OTHER,
91 "", "", "", "", null); 92 "", "", "", "", null);
92 final Device device2 = new DefaultDevice(null, deviceId2, Device.Type.OTHER, 93 final Device device2 = new DefaultDevice(null, deviceId2, Device.Type.OTHER,
93 "", "", "", "", null); 94 "", "", "", "", null);
95 + final Device device4 = new DefaultDevice(null, deviceId4, Device.Type.OTHER,
96 + "", "", "", "", null);
94 97
95 final MockMeter meter1 = new MockMeter(deviceId1, 1, 111, 1); 98 final MockMeter meter1 = new MockMeter(deviceId1, 1, 111, 1);
96 final MockMeter meter2 = new MockMeter(deviceId1, 2, 222, 2); 99 final MockMeter meter2 = new MockMeter(deviceId1, 2, 222, 2);
...@@ -214,8 +217,10 @@ public class MetersResourceTest extends ResourceTest { ...@@ -214,8 +217,10 @@ public class MetersResourceTest extends ResourceTest {
214 .andReturn(device1); 217 .andReturn(device1);
215 expect(mockDeviceService.getDevice(deviceId2)) 218 expect(mockDeviceService.getDevice(deviceId2))
216 .andReturn(device2); 219 .andReturn(device2);
220 + expect(mockDeviceService.getDevice(deviceId4))
221 + .andReturn(device4);
217 expect(mockDeviceService.getDevices()) 222 expect(mockDeviceService.getDevices())
218 - .andReturn(ImmutableSet.of(device1, device2)); 223 + .andReturn(ImmutableSet.of(device1, device2, device4));
219 224
220 // Mock Core Service 225 // Mock Core Service
221 expect(mockCoreService.getAppId(anyShort())) 226 expect(mockCoreService.getAppId(anyShort()))
...@@ -475,6 +480,7 @@ public class MetersResourceTest extends ResourceTest { ...@@ -475,6 +480,7 @@ public class MetersResourceTest extends ResourceTest {
475 mockMeterService.submit(anyObject()); 480 mockMeterService.submit(anyObject());
476 expectLastCall().andReturn(meter5).anyTimes(); 481 expectLastCall().andReturn(meter5).anyTimes();
477 replay(mockMeterService); 482 replay(mockMeterService);
483 + replay(mockDeviceService);
478 484
479 WebTarget wt = target(); 485 WebTarget wt = target();
480 InputStream jsonStream = MetersResourceTest.class 486 InputStream jsonStream = MetersResourceTest.class
...@@ -489,6 +495,26 @@ public class MetersResourceTest extends ResourceTest { ...@@ -489,6 +495,26 @@ public class MetersResourceTest extends ResourceTest {
489 } 495 }
490 496
491 /** 497 /**
498 + * Tests creating a meter with POST, but wrong deviceID.
499 + */
500 + @Test
501 + public void testPostWithWrongDevice() {
502 + mockMeterService.submit(anyObject());
503 + expectLastCall().andReturn(meter5).anyTimes();
504 + replay(mockMeterService);
505 + replay(mockDeviceService);
506 +
507 + WebTarget wt = target();
508 + InputStream jsonStream = MetersResourceTest.class
509 + .getResourceAsStream("post-meter.json");
510 +
511 + Response response = wt.path("meters/of:0000000000000002")
512 + .request(MediaType.APPLICATION_JSON_TYPE)
513 + .post(Entity.json(jsonStream));
514 + assertThat(response.getStatus(), is(HttpURLConnection.HTTP_BAD_REQUEST));
515 + }
516 +
517 + /**
492 * Tests deleting a meter. 518 * Tests deleting a meter.
493 */ 519 */
494 @Test 520 @Test
......