Add time ranges to PAP statistics API 21/123021/2
authorJim Hahn <jrh3@att.com>
Fri, 30 Jul 2021 18:54:35 +0000 (14:54 -0400)
committerJim Hahn <jrh3@att.com>
Fri, 30 Jul 2021 19:15:39 +0000 (15:15 -0400)
Issue-ID: POLICY-3511
Change-Id: Ifc91e4732b3574da37f55658b23faf8a9f8091f5
Signed-off-by: Jim Hahn <jrh3@att.com>
main/src/main/java/org/onap/policy/pap/main/rest/StatisticsRestControllerV1.java
main/src/test/java/org/onap/policy/pap/main/rest/e2e/StatisticsTest.java

index fb64b05..bd187dc 100644 (file)
@@ -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));
+    }
 }
index 2f6cc3a..0f1b560 100644 (file)
@@ -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");
 
 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<PdpStatistics> 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<String, Map<String, List<PdpStatistics>>> map =
+                testResponse.readEntity(new GenericType<Map<String, Map<String, List<PdpStatistics>>>>() {});
+        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();
+    }
 }