From 5636d8592b4c2b2190928ab7907463b099d55a7b Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Fri, 30 Jul 2021 14:54:35 -0400 Subject: Add time ranges to PAP statistics API Issue-ID: POLICY-3511 Change-Id: Ifc91e4732b3574da37f55658b23faf8a9f8091f5 Signed-off-by: Jim Hahn --- .../pap/main/rest/StatisticsRestControllerV1.java | 59 ++++++++++-- .../policy/pap/main/rest/e2e/StatisticsTest.java | 105 +++++++++++++++------ 2 files changed, 127 insertions(+), 37 deletions(-) diff --git a/main/src/main/java/org/onap/policy/pap/main/rest/StatisticsRestControllerV1.java b/main/src/main/java/org/onap/policy/pap/main/rest/StatisticsRestControllerV1.java index fb64b058..bd187dcb 100644 --- a/main/src/main/java/org/onap/policy/pap/main/rest/StatisticsRestControllerV1.java +++ b/main/src/main/java/org/onap/policy/pap/main/rest/StatisticsRestControllerV1.java @@ -29,6 +29,7 @@ import io.swagger.annotations.Authorization; import io.swagger.annotations.Extension; import io.swagger.annotations.ExtensionProperty; import io.swagger.annotations.ResponseHeader; +import java.time.Instant; import java.util.Map; import java.util.UUID; import javax.ws.rs.GET; @@ -110,11 +111,18 @@ public class StatisticsRestControllerV1 extends PapRestControllerV1 { }) public Response pdpStatistics( @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId, - @ApiParam(value = "Record Count", required = false) @QueryParam("recordCount") final int recordCount) { + @ApiParam(value = "Record Count", required = false) @QueryParam("recordCount") final int recordCount, + @ApiParam(value = "Start time in epoch timestamp", + required = false) @QueryParam("startTime") final Long startTime, + @ApiParam(value = "End time in epoch timestamp", + required = false) @QueryParam("endTime") final Long endTime) { try { return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId) - .entity(new StatisticsRestProvider().fetchDatabaseStatistics( - PdpFilterParameters.builder().recordNum(recordCount).build())) + .entity(new StatisticsRestProvider().fetchDatabaseStatistics(PdpFilterParameters.builder() + .recordNum(recordCount) + .startTime(convertEpochtoInstant(startTime)) + .endTime(convertEpochtoInstant(endTime)) + .build())) .build(); } catch (final PfModelException exp) { LOGGER.info(GET_STATISTICS_ERR_MSG, exp); @@ -160,11 +168,19 @@ public class StatisticsRestControllerV1 extends PapRestControllerV1 { public Response pdpGroupStatistics( @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId, @ApiParam(value = "PDP Group Name", required = true) @PathParam("group") final String groupName, - @ApiParam(value = "Record Count", required = false) @QueryParam("recordCount") final int recordCount) { + @ApiParam(value = "Record Count", required = false) @QueryParam("recordCount") final int recordCount, + @ApiParam(value = "Start time in epoch timestamp", + required = false) @QueryParam("startTime") final Long startTime, + @ApiParam(value = "End time in epoch timestamp", + required = false) @QueryParam("endTime") final Long endTime) { try { return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId) .entity(new StatisticsRestProvider().fetchDatabaseStatistics(PdpFilterParameters.builder() - .group(groupName).recordNum(recordCount).build())) + .group(groupName) + .recordNum(recordCount) + .startTime(convertEpochtoInstant(startTime)) + .endTime(convertEpochtoInstant(endTime)) + .build())) .build(); } catch (final PfModelException exp) { LOGGER.info(GET_STATISTICS_ERR_MSG, exp); @@ -212,11 +228,20 @@ public class StatisticsRestControllerV1 extends PapRestControllerV1 { @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId, @ApiParam(value = "PDP Group Name", required = true) @PathParam("group") final String groupName, @ApiParam(value = "PDP SubGroup type", required = true) @PathParam("type") final String subType, - @ApiParam(value = "Record Count", required = false) @QueryParam("recordCount") final int recordCount) { + @ApiParam(value = "Record Count", required = false) @QueryParam("recordCount") final int recordCount, + @ApiParam(value = "Start time in epoch timestamp", + required = false) @QueryParam("startTime") final Long startTime, + @ApiParam(value = "End time in epoch timestamp", + required = false) @QueryParam("endTime") final Long endTime) { try { return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId) .entity(new StatisticsRestProvider().fetchDatabaseStatistics(PdpFilterParameters.builder() - .group(groupName).subGroup(subType).recordNum(recordCount).build())) + .group(groupName) + .subGroup(subType) + .recordNum(recordCount) + .startTime(convertEpochtoInstant(startTime)) + .endTime(convertEpochtoInstant(endTime)) + .build())) .build(); } catch (final PfModelException exp) { LOGGER.info(GET_STATISTICS_ERR_MSG, exp); @@ -268,12 +293,22 @@ public class StatisticsRestControllerV1 extends PapRestControllerV1 { @ApiParam(value = "PDP Group Name", required = true) @PathParam("group") final String groupName, @ApiParam(value = "PDP SubGroup type", required = true) @PathParam("type") final String subType, @ApiParam(value = "PDP Instance name", required = true) @PathParam("pdp") final String pdpName, - @ApiParam(value = "Record Count", required = false) @QueryParam("recordCount") final int recordCount) { + @ApiParam(value = "Record Count", required = false) @QueryParam("recordCount") final int recordCount, + @ApiParam(value = "Start time in epoch timestamp", + required = false) @QueryParam("startTime") final Long startTime, + @ApiParam(value = "End time in epoch timestamp", + required = false) @QueryParam("endTime") final Long endTime) { try { return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId) .entity(new StatisticsRestProvider().fetchDatabaseStatistics( - PdpFilterParameters.builder().group(groupName).subGroup(subType) - .name(pdpName).recordNum(recordCount).build())) + PdpFilterParameters.builder() + .group(groupName) + .subGroup(subType) + .name(pdpName) + .recordNum(recordCount) + .startTime(convertEpochtoInstant(startTime)) + .endTime(convertEpochtoInstant(endTime)) + .build())) .build(); } catch (final PfModelException exp) { LOGGER.info(GET_STATISTICS_ERR_MSG, exp); @@ -282,4 +317,8 @@ public class StatisticsRestControllerV1 extends PapRestControllerV1 { .build(); } } + + private Instant convertEpochtoInstant(Long epochSecond) { + return (epochSecond == null ? null : Instant.ofEpochSecond(epochSecond)); + } } diff --git a/main/src/test/java/org/onap/policy/pap/main/rest/e2e/StatisticsTest.java b/main/src/test/java/org/onap/policy/pap/main/rest/e2e/StatisticsTest.java index 2f6cc3a1..0f1b560f 100644 --- a/main/src/test/java/org/onap/policy/pap/main/rest/e2e/StatisticsTest.java +++ b/main/src/test/java/org/onap/policy/pap/main/rest/e2e/StatisticsTest.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP PAP * ================================================================================ - * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2020-2021 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,16 +21,17 @@ package org.onap.policy.pap.main.rest.e2e; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import java.net.HttpURLConnection; import java.time.Instant; -import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.ws.rs.client.Invocation; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.Response; +import org.junit.BeforeClass; import org.junit.Test; import org.onap.policy.common.utils.services.Registry; import org.onap.policy.models.base.PfModelException; @@ -44,9 +45,39 @@ import org.onap.policy.pap.main.rest.StatisticsReport; public class StatisticsTest extends End2EndBase { private static final String STATISTICS_ENDPOINT = "statistics"; - private List recordList = new ArrayList<>(); + private static final String END_TIME_NAME = "endTime"; + private static final String START_TIME_NAME = "startTime"; + private static final long TIMESTAMP_SEC = 1562494272; + /** + * Adds a record to the DB. + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + End2EndBase.setUpBeforeClass(); + + PolicyModelsProviderFactoryWrapper modelProviderWrapper = + Registry.get(PapConstants.REG_PAP_DAO_FACTORY, PolicyModelsProviderFactoryWrapper.class); + + try (PolicyModelsProvider databaseProvider = modelProviderWrapper.create()) { + PdpStatistics pdpStatisticsRecord = new PdpStatistics(); + pdpStatisticsRecord.setPdpGroupName("defaultGroup"); + pdpStatisticsRecord.setPdpSubGroupName("apex"); + pdpStatisticsRecord.setPdpInstanceId("pdp1"); + pdpStatisticsRecord.setTimeStamp(Instant.ofEpochSecond(TIMESTAMP_SEC)); + pdpStatisticsRecord.setPolicyDeployCount(1); + pdpStatisticsRecord.setPolicyDeployFailCount(0); + pdpStatisticsRecord.setPolicyDeploySuccessCount(1); + pdpStatisticsRecord.setPolicyExecutedCount(1); + pdpStatisticsRecord.setPolicyExecutedFailCount(0); + pdpStatisticsRecord.setPolicyExecutedSuccessCount(1); + databaseProvider.createPdpStatistics(List.of(pdpStatisticsRecord)); + } catch (final PfModelException exp) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, exp.getMessage()); + } + } + @Test public void test() throws Exception { Invocation.Builder invocationBuilder = sendRequest(STATISTICS_ENDPOINT); @@ -108,33 +139,30 @@ public class StatisticsTest extends End2EndBase { mgr.updatePolicyDownloadFailureCount(); } - private void setupEnv() { - PolicyModelsProviderFactoryWrapper modelProviderWrapper = - Registry.get(PapConstants.REG_PAP_DAO_FACTORY, PolicyModelsProviderFactoryWrapper.class); - - try (PolicyModelsProvider databaseProvider = modelProviderWrapper.create()) { - PdpStatistics pdpStatisticsRecord = new PdpStatistics(); - pdpStatisticsRecord.setPdpGroupName("defaultGroup"); - pdpStatisticsRecord.setPdpSubGroupName("apex"); - pdpStatisticsRecord.setPdpInstanceId("pdp1"); - pdpStatisticsRecord.setTimeStamp(Instant.now()); - pdpStatisticsRecord.setPolicyDeployCount(1); - pdpStatisticsRecord.setPolicyDeployFailCount(0); - pdpStatisticsRecord.setPolicyDeploySuccessCount(1); - pdpStatisticsRecord.setPolicyExecutedCount(1); - pdpStatisticsRecord.setPolicyExecutedFailCount(0); - pdpStatisticsRecord.setPolicyExecutedSuccessCount(1); - recordList.add(pdpStatisticsRecord); - databaseProvider.createPdpStatistics(recordList); - } catch (final PfModelException exp) { - throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, exp.getMessage()); - } - } - private void verifyResponse(String endpoint) throws Exception { - setupEnv(); Invocation.Builder invocationBuilder = sendRequest(endpoint); verifyResponse(invocationBuilder.get()); + + // repeat with "start", in range + invocationBuilder = sendRequest(addTimeParam(endpoint, START_TIME_NAME, TIMESTAMP_SEC)); + verifyResponse(invocationBuilder.get()); + + // repeat with "end", in range + invocationBuilder = sendRequest(addTimeParam(endpoint, END_TIME_NAME, TIMESTAMP_SEC)); + verifyResponse(invocationBuilder.get()); + + // repeat with "start" and "end", in range + invocationBuilder = sendRequest(addTimeParam(endpoint, START_TIME_NAME, TIMESTAMP_SEC - 1) + + "&" + END_TIME_NAME + "=" + TIMESTAMP_SEC + 1); + verifyResponse(invocationBuilder.get()); + + // repeat with "start", out of range + invocationBuilder = sendRequest(addTimeParam(endpoint, START_TIME_NAME, TIMESTAMP_SEC + 1)); + verifyEmptyResponse(invocationBuilder.get()); + + // repeat with "end", out of range + invocationBuilder = sendRequest(addTimeParam(endpoint, END_TIME_NAME, TIMESTAMP_SEC - 1)); + verifyEmptyResponse(invocationBuilder.get()); } private void verifyResponse(Response testResponse) { @@ -147,4 +175,27 @@ public class StatisticsTest extends End2EndBase { assertEquals("apex", resRecord.get(0).getPdpSubGroupName()); assertEquals("defaultGroup", resRecord.get(0).getPdpGroupName()); } + + private void verifyEmptyResponse(Response testResponse) { + assertEquals(Response.Status.OK.getStatusCode(), testResponse.getStatus()); + Map>> map = + testResponse.readEntity(new GenericType>>>() {}); + assertThat(map).isEmpty(); + } + + /** + * Adds a timestamp parameter to an endpoint string. + * @param endpoint endpoint to which it should be added + * @param paramName parameter name + * @param timeSec time, in seconds + * @return the new endpoint, with the added parameter + */ + private String addTimeParam(String endpoint, String paramName, long timeSec) { + StringBuilder builder = new StringBuilder(endpoint); + builder.append(endpoint.contains("?") ? '&' : '?'); + builder.append(paramName); + builder.append('='); + builder.append(timeSec); + return builder.toString(); + } } -- cgit 1.2.3-korg