[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
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/MetersWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/MetersWebResource.java
index ffb9149..8fa660e 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/MetersWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/MetersWebResource.java
@@ -19,6 +19,7 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.meter.DefaultMeterRequest;
 import org.onosproject.net.meter.Meter;
 import org.onosproject.net.meter.MeterId;
@@ -140,12 +141,17 @@
             ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
             JsonNode specifiedDeviceId = jsonTree.get("deviceId");
 
-            if (specifiedDeviceId != null &&
-                    !specifiedDeviceId.asText().equals(deviceId)) {
+            if ((specifiedDeviceId != null &&
+                    !specifiedDeviceId.asText().equals(deviceId)) ||
+                    get(DeviceService.class).getDevice(DeviceId.deviceId(deviceId))
+                            == null) {
                 throw new IllegalArgumentException(DEVICE_INVALID);
             }
+
             jsonTree.put("deviceId", deviceId);
-            final MeterRequest meterRequest = codec(MeterRequest.class).decode(jsonTree, this);
+            final MeterRequest meterRequest = codec(MeterRequest.class)
+                    .decode(jsonTree, this);
+
             final Meter meter = meterService.submit(meterRequest);
 
             UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
diff --git a/web/api/src/test/java/org/onosproject/rest/resources/MetersResourceTest.java b/web/api/src/test/java/org/onosproject/rest/resources/MetersResourceTest.java
index a23ca8c..ee6a656 100644
--- a/web/api/src/test/java/org/onosproject/rest/resources/MetersResourceTest.java
+++ b/web/api/src/test/java/org/onosproject/rest/resources/MetersResourceTest.java
@@ -87,10 +87,13 @@
     final DeviceId deviceId1 = DeviceId.deviceId("1");
     final DeviceId deviceId2 = DeviceId.deviceId("2");
     final DeviceId deviceId3 = DeviceId.deviceId("3");
+    final DeviceId deviceId4 = DeviceId.deviceId("of:0000000000000001");
     final Device device1 = new DefaultDevice(null, deviceId1, Device.Type.OTHER,
             "", "", "", "", null);
     final Device device2 = new DefaultDevice(null, deviceId2, Device.Type.OTHER,
             "", "", "", "", null);
+    final Device device4 = new DefaultDevice(null, deviceId4, Device.Type.OTHER,
+                                             "", "", "", "", null);
 
     final MockMeter meter1 = new MockMeter(deviceId1, 1, 111, 1);
     final MockMeter meter2 = new MockMeter(deviceId1, 2, 222, 2);
@@ -214,8 +217,10 @@
                 .andReturn(device1);
         expect(mockDeviceService.getDevice(deviceId2))
                 .andReturn(device2);
+        expect(mockDeviceService.getDevice(deviceId4))
+                .andReturn(device4);
         expect(mockDeviceService.getDevices())
-                .andReturn(ImmutableSet.of(device1, device2));
+                .andReturn(ImmutableSet.of(device1, device2, device4));
 
         // Mock Core Service
         expect(mockCoreService.getAppId(anyShort()))
@@ -475,6 +480,7 @@
         mockMeterService.submit(anyObject());
         expectLastCall().andReturn(meter5).anyTimes();
         replay(mockMeterService);
+        replay(mockDeviceService);
 
         WebTarget wt = target();
         InputStream jsonStream = MetersResourceTest.class
@@ -489,6 +495,26 @@
     }
 
     /**
+     * Tests creating a meter with POST, but wrong deviceID.
+     */
+    @Test
+    public void testPostWithWrongDevice() {
+        mockMeterService.submit(anyObject());
+        expectLastCall().andReturn(meter5).anyTimes();
+        replay(mockMeterService);
+        replay(mockDeviceService);
+
+        WebTarget wt = target();
+        InputStream jsonStream = MetersResourceTest.class
+                .getResourceAsStream("post-meter.json");
+
+        Response response = wt.path("meters/of:0000000000000002")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        assertThat(response.getStatus(), is(HttpURLConnection.HTTP_BAD_REQUEST));
+    }
+
+    /**
      * Tests deleting a meter.
      */
     @Test