From 68ef496cc951ae6bf56bc528ec0ffb6057485556 Mon Sep 17 00:00:00 2001 From: Deklan Dieterly Date: Tue, 10 Mar 2015 14:29:45 -0600 Subject: [PATCH] Wrap all lists in JSON object Affected resources: alarm-definition-list List alarm definitions for this tenant. alarm-history Alarm state transition history. alarm-history-list List alarms state history. alarm-list List alarms for this tenant. measurement-list List measurements for the specified metric. metric-list List metrics for this tenant. metric-statistics List measurement statistics for the specified metric. notification-list List notifications for this tenant. Change-Id: I9edc42c88c7e16a4fee8310d7dcfcf367bf2bfff --- .../main/java/monasca/api/resource/Links.java | 4 +- .../api/resource/MeasurementResource.java | 4 +- .../api/resource/StatisticResource.java | 10 +- java/src/main/resources/api-config.yml | 2 +- .../resource/AlarmDefinitionResourceTest.java | 114 +++++++++++++----- .../NotificationMethodResourceTest.java | 29 ++++- 6 files changed, 124 insertions(+), 39 deletions(-) diff --git a/java/src/main/java/monasca/api/resource/Links.java b/java/src/main/java/monasca/api/resource/Links.java index abda71dfe..e41628874 100644 --- a/java/src/main/java/monasca/api/resource/Links.java +++ b/java/src/main/java/monasca/api/resource/Links.java @@ -180,7 +180,9 @@ public final class Links { } else { - return elements; + Paged paged = new Paged(); + paged.elements = elements; + return paged; } } diff --git a/java/src/main/java/monasca/api/resource/MeasurementResource.java b/java/src/main/java/monasca/api/resource/MeasurementResource.java index 8b34a18cd..1cf0fabc3 100644 --- a/java/src/main/java/monasca/api/resource/MeasurementResource.java +++ b/java/src/main/java/monasca/api/resource/MeasurementResource.java @@ -81,7 +81,9 @@ public class MeasurementResource { paged.elements = pagedList; return paged; } else { - return pagedList; + Paged paged = new Paged(); + paged.elements = pagedList; + return paged; } } } diff --git a/java/src/main/java/monasca/api/resource/StatisticResource.java b/java/src/main/java/monasca/api/resource/StatisticResource.java index 2dd9ed5d2..b495bcfc0 100644 --- a/java/src/main/java/monasca/api/resource/StatisticResource.java +++ b/java/src/main/java/monasca/api/resource/StatisticResource.java @@ -33,6 +33,7 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import monasca.api.app.validation.Validation; +import monasca.api.domain.model.common.Paged; import monasca.api.domain.model.statistic.StatisticRepo; import monasca.api.domain.model.statistic.Statistics; @@ -55,7 +56,7 @@ public class StatisticResource { @GET @Timed @Produces(MediaType.APPLICATION_JSON) - public List get(@HeaderParam("X-Tenant-Id") String tenantId, + public Object get(@HeaderParam("X-Tenant-Id") String tenantId, @QueryParam("name") String name, @QueryParam("dimensions") String dimensionsStr, @QueryParam("start_time") String startTimeStr, @QueryParam("end_time") String endTimeStr, @QueryParam("statistics") String statisticsStr, @@ -73,6 +74,11 @@ public class StatisticResource { Strings.isNullOrEmpty(dimensionsStr) ? null : Validation.parseAndValidateNameAndDimensions( name, dimensionsStr); - return repo.find(tenantId, name, dimensions, startTime, endTime, statistics, period); + List statisticsList = + repo.find(tenantId, name, dimensions, startTime, endTime, statistics, period); + + Paged paged = new Paged(); + paged.elements = statisticsList; + return paged; } } diff --git a/java/src/main/resources/api-config.yml b/java/src/main/resources/api-config.yml index 4bede0e42..485cb0c05 100644 --- a/java/src/main/resources/api-config.yml +++ b/java/src/main/resources/api-config.yml @@ -36,7 +36,7 @@ databaseConfiguration: # Uncomment if databaseType is influxDB influxDB: # version can be (V8 | V9) - # If noversion set then defaults to V8. + # If no version set then defaults to V8. version: V8 # Used only if version is V9. maxHttpConnections: 100 diff --git a/java/src/test/java/monasca/api/resource/AlarmDefinitionResourceTest.java b/java/src/test/java/monasca/api/resource/AlarmDefinitionResourceTest.java index 571c45b15..0a45bb1e4 100644 --- a/java/src/test/java/monasca/api/resource/AlarmDefinitionResourceTest.java +++ b/java/src/test/java/monasca/api/resource/AlarmDefinitionResourceTest.java @@ -40,6 +40,7 @@ import org.testng.annotations.Test; import monasca.api.app.AlarmDefinitionService; import monasca.api.app.command.CreateAlarmDefinitionCommand; import monasca.api.app.command.UpdateAlarmDefinitionCommand; +import monasca.api.domain.model.common.Paged; import monasca.common.model.alarm.AlarmExpression; import monasca.api.domain.exception.EntityNotFoundException; import monasca.api.domain.model.alarmdefinition.AlarmDefinition; @@ -101,9 +102,9 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { assertEquals(location, "/v2.0/alarm-definitions/" + newAlarm.getId()); assertEquals(newAlarm, alarm); verify(service).create(eq("abc"), eq("Disk Exceeds 1k Operations"), any(String.class), - eq("LOW"), eq(expression), eq(AlarmExpression.of(expression)), - eq(Arrays.asList("service", "instance_id")), any(List.class), any(List.class), - any(List.class)); + eq("LOW"), eq(expression), eq(AlarmExpression.of(expression)), + eq(Arrays.asList("service", "instance_id")), any(List.class), + any(List.class), any(List.class)); } public void shouldUpdate() { @@ -115,10 +116,10 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { .resource("/v2.0/alarm-definitions/123") .header("X-Tenant-Id", "abc") .header("Content-Type", MediaType.APPLICATION_JSON) - .put( - ClientResponse.class, - new UpdateAlarmDefinitionCommand("Disk Exceeds 1k Operations", null, expression, - Arrays.asList("service", "instance_id"), "LOW", true, alarmActions, null, null)); + .put(ClientResponse.class, + new UpdateAlarmDefinitionCommand("Disk Exceeds 1k Operations", null, expression, + Arrays.asList("service", "instance_id"), "LOW", + true, alarmActions, null, null)); assertEquals(response.getStatus(), 200); verify(service).update(eq("abc"), eq("123"), any(AlarmExpression.class), @@ -153,8 +154,8 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { expression, Arrays.asList("service", "instance_id"), "LOW", alarmActions, null, null)); ErrorMessages.assertThat(response.getEntity(String.class)).matches("unprocessable_entity", 422, - "The alarm expression is invalid", - "More than one value was given for dimension instance_id"); + "The alarm expression is invalid", + "More than one value was given for dimension instance_id"); } @SuppressWarnings("unchecked") @@ -175,7 +176,8 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { createResponseFor("{\"alarmasdf\"::{\"name\":\"Disk Exceeds 1k Operations\"}}"); ErrorMessages.assertThat(response.getEntity(String.class)).matches("bad_request", 400, - "Unable to process the provided JSON", "Unexpected character (':'"); + "Unable to process the provided JSON", + "Unexpected character (':'"); } public void shouldErrorOnCreateWithInvalidOperator() { @@ -186,7 +188,8 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { expression, Arrays.asList("service", "instance_id"), "LOW", alarmActions, null, null)); ErrorMessages.assertThat(response.getEntity(String.class)).matches("unprocessable_entity", 422, - "The alarm expression is invalid", "Syntax Error"); + "The alarm expression is invalid", + "Syntax Error"); } public void shouldErrorOnCreateWith0Period() { @@ -197,7 +200,7 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { expression, Arrays.asList("service", "instance_id"), "LOW", alarmActions, null, null)); ErrorMessages.assertThat(response.getEntity(String.class)).matches("unprocessable_entity", 422, - "Period must not be 0"); + "Period must not be 0"); } public void shouldErrorOnCreateWithNonMod60Period() { @@ -208,7 +211,7 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { expression, Arrays.asList("service", "instance_id"), "LOW", alarmActions, null, null)); ErrorMessages.assertThat(response.getEntity(String.class)).matches("unprocessable_entity", 422, - "Period 61 must be a multiple of 60"); + "Period 61 must be a multiple of 60"); } public void shouldErrorOnCreateWithPeriodsLessThan1() { @@ -219,7 +222,7 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { expression, Arrays.asList("service", "instance_id"), "LOW", alarmActions, null, null)); ErrorMessages.assertThat(response.getEntity(String.class)).matches("unprocessable_entity", 422, - "Periods 0 must be greater than or equal to 1"); + "Periods 0 must be greater than or equal to 1"); } public void shouldErrorOnCreateWithPeriodTimesPeriodsGT2Weeks() { @@ -246,10 +249,8 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { ErrorMessages .assertThat(response.getEntity(String.class)) - .matches( - "unprocessable_entity", - 422, - "Name 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 must be 255 characters or less"); + .matches("unprocessable_entity", 422, + "Name 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 must be 255 characters or less"); } public void shouldErrorOnCreateWithTooLongAlarmAction() { @@ -262,14 +263,35 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { ErrorMessages .assertThat(response.getEntity(String.class)) .matches("unprocessable_entity", 422, - "Alarm action 012345678901234567890123456789012345678901234567890 must be 50 characters or less"); + "Alarm action 012345678901234567890123456789012345678901234567890 must be 50 characters or less"); } @SuppressWarnings("unchecked") public void shouldList() { - List alarms = - client().resource("/v2.0/alarm-definitions").header("X-Tenant-Id", "abc") - .get(new GenericType>() {}); + + Map + lhm = + (Map) client().resource("/v2.0/alarm-definitions").header("X-Tenant-Id", "abc") + .get(Paged.class).elements.get(0); + + AlarmDefinition + ad = + new AlarmDefinition((String) lhm.get("id"), (String) lhm.get("name"), + (String) lhm.get("description"), (String) lhm.get("severity"), + (String) lhm.get("expression"), (List) lhm.get("match_by"), + (boolean) lhm.get("actions_enabled"), + (List) lhm.get("alarm_actions"), + (List) lhm.get("ok_actions"), + (List) lhm.get("undetermined_actions")); + + List> links = (List>) lhm.get("links"); + List + linksList = + Arrays.asList(new Link(links.get(0).get("rel"), links.get(0).get("href"))); + + ad.setLinks(linksList); + + List alarms = Arrays.asList(ad); assertEquals(alarms, Arrays.asList(alarmItem)); verify(repo).find(eq("abc"), anyString(), (Map) anyMap(), anyString()); @@ -277,9 +299,31 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { @SuppressWarnings("unchecked") public void shouldListByName() throws Exception { - List alarms = - client().resource("/v2.0/alarm-definitions?name=" + URLEncoder.encode("foo bar baz", "UTF-8")) - .header("X-Tenant-Id", "abc").get(new GenericType>() {}); + + Map + lhm = + (Map) client() + .resource("/v2.0/alarm-definitions?name=" + URLEncoder.encode("foo bar baz", "UTF-8")) + .header("X-Tenant-Id", "abc").get(Paged.class).elements.get(0); + + AlarmDefinition + ad = + new AlarmDefinition((String) lhm.get("id"), (String) lhm.get("name"), + (String) lhm.get("description"), (String) lhm.get("severity"), + (String) lhm.get("expression"), (List) lhm.get("match_by"), + (boolean) lhm.get("actions_enabled"), + (List) lhm.get("alarm_actions"), + (List) lhm.get("ok_actions"), + (List) lhm.get("undetermined_actions")); + + List> links = (List>) lhm.get("links"); + List + linksList = + Arrays.asList(new Link(links.get(0).get("rel"), links.get(0).get("href"))); + + ad.setLinks(linksList); + + List alarms = Arrays.asList(ad); assertEquals(alarms, Arrays.asList(alarmItem)); verify(repo).find(eq("abc"), eq("foo bar baz"), (Map) anyMap(), anyString()); @@ -296,7 +340,8 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { doThrow(new EntityNotFoundException(null)).when(repo).findById(eq("abc"), eq("999")); try { - client().resource("/v2.0/alarm-definitions/999").header("X-Tenant-Id", "abc").get(AlarmDefinition.class); + client().resource("/v2.0/alarm-definitions/999").header("X-Tenant-Id", "abc").get( + AlarmDefinition.class); fail(); } catch (Exception e) { assertTrue(e.getMessage().contains("404")); @@ -325,7 +370,8 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { @SuppressWarnings("unchecked") public void should500OnInternalException() { doThrow(new RuntimeException("")).when(repo).find(anyString(), anyString(), - (Map) anyObject(), anyString()); + (Map) anyObject(), + anyString()); try { client().resource("/v2.0/alarm-definitions").header("X-Tenant-Id", "abc").get(List.class); @@ -338,10 +384,16 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest { public void shouldHydateLinksOnList() { List expected = Arrays.asList(new Link("self", "/v2.0/alarm-definitions/123")); - List links = - client().resource("/v2.0/alarm-definitions").header("X-Tenant-Id", "abc") - .get(new GenericType>() {}).get(0).getLinks(); - assertEquals(links, expected); + + Map + lhm = + (Map) client().resource("/v2.0/alarm-definitions").header("X-Tenant-Id", "abc") + .get(Paged.class).elements.get(0); + + List> links = (List>) lhm.get("links"); + + List actual = Arrays.asList(new Link(links.get(0).get("rel"), links.get(0).get("href"))); + assertEquals(actual, expected); } public void shouldHydateLinksOnGet() { diff --git a/java/src/test/java/monasca/api/resource/NotificationMethodResourceTest.java b/java/src/test/java/monasca/api/resource/NotificationMethodResourceTest.java index 4c72f0d8b..7f2a2578a 100644 --- a/java/src/test/java/monasca/api/resource/NotificationMethodResourceTest.java +++ b/java/src/test/java/monasca/api/resource/NotificationMethodResourceTest.java @@ -18,15 +18,20 @@ import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.GenericType; import monasca.api.app.command.CreateNotificationMethodCommand; import monasca.api.domain.exception.EntityNotFoundException; +import monasca.api.domain.model.common.Link; +import monasca.api.domain.model.common.Paged; import monasca.api.domain.model.notificationmethod.NotificationMethod; import monasca.api.domain.model.notificationmethod.NotificationMethodRepo; import monasca.api.domain.model.notificationmethod.NotificationMethodType; import monasca.api.resource.exception.ErrorMessages; + +import org.mockito.internal.matchers.Not; import org.testng.annotations.Test; import javax.ws.rs.core.MediaType; import java.util.Arrays; import java.util.List; +import java.util.Map; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; @@ -186,9 +191,27 @@ public class NotificationMethodResourceTest extends AbstractMonApiResourceTest { } public void shouldList() { - List notificationMethods = - client().resource("/v2.0/notification-methods").header("X-Tenant-Id", "abc") - .get(new GenericType>() {}); + + Map + lhm = + (Map) client().resource("/v2.0/notification-methods").header("X-Tenant-Id", "abc") + .get(Paged.class).elements.get(0); + + NotificationMethod + nm = + new NotificationMethod((String) lhm.get("id"), (String) lhm.get("name"), + NotificationMethodType.fromJson((String) lhm.get("type")), + (String) lhm.get("address")); + + List> links = (List>) lhm.get("links"); + + List + linksList = + Arrays.asList(new Link(links.get(0).get("rel"), links.get(0).get("href"))); + + nm.setLinks(linksList); + + List notificationMethods = Arrays.asList(nm); assertEquals(notificationMethods, Arrays.asList(notificationMethod)); verify(repo).find(eq("abc"), anyString());