Add changes to basic structure of api component 77/77677/7
authorChenfei Gao <cgao@research.att.com>
Thu, 31 Jan 2019 21:09:09 +0000 (16:09 -0500)
committerChenfei Gao <cgao@research.att.com>
Thu, 7 Feb 2019 14:19:38 +0000 (09:19 -0500)
Includes:
1) Changed logging from FlexLogger to slf4j and used the logback.xml aligned with
v1.2 logging requirements.
2) Added https as a configurable parameter of api rest server.
3) Added aaf as a condfigurable parameter of api rest server.
4) Added AafFilter classes for healthcheck and statistics.
5) Added api statistics REST entry point.
6) Created related junit tests.
7) Packaged docker

Issue-ID: POLICY-1270
Change-Id: I638f61361bb052545e8597531ba3d58019bf1f24
Signed-off-by: Chenfei Gao <cgao@research.att.com>
40 files changed:
LICENSE.txt
main/pom.xml
main/src/main/java/org/onap/policy/api/main/exception/PolicyApiException.java [moved from main/src/main/java/org/onap/policy/api/main/PolicyApiException.java with 97% similarity]
main/src/main/java/org/onap/policy/api/main/exception/PolicyApiRuntimeException.java [moved from main/src/main/java/org/onap/policy/api/main/PolicyApiRuntimeException.java with 97% similarity]
main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterHandler.java
main/src/main/java/org/onap/policy/api/main/parameters/RestServerParameters.java
main/src/main/java/org/onap/policy/api/main/rest/ApiRestController.java
main/src/main/java/org/onap/policy/api/main/rest/ApiRestServer.java
main/src/main/java/org/onap/policy/api/main/rest/ApiStatisticsManager.java [new file with mode: 0644]
main/src/main/java/org/onap/policy/api/main/rest/HealthCheckProvider.java
main/src/main/java/org/onap/policy/api/main/rest/StatisticsProvider.java [new file with mode: 0644]
main/src/main/java/org/onap/policy/api/main/rest/StatisticsReport.java [new file with mode: 0644]
main/src/main/java/org/onap/policy/api/main/rest/aaf/AafApiFilter.java [new file with mode: 0644]
main/src/main/java/org/onap/policy/api/main/startstop/ApiActivator.java
main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java
main/src/main/java/org/onap/policy/api/main/startstop/Main.java
main/src/test/java/org/onap/policy/api/main/parameters/CommonTestData.java
main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterGroup.java
main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java
main/src/test/java/org/onap/policy/api/main/rest/TestApiRestServer.java
main/src/test/java/org/onap/policy/api/main/rest/TestApiStatistics.java [new file with mode: 0644]
main/src/test/java/org/onap/policy/api/main/rest/TestHttpsApiRestServer.java [new file with mode: 0644]
main/src/test/java/org/onap/policy/api/main/rest/TestHttpsStatisticApiRestServer.java [new file with mode: 0644]
main/src/test/java/org/onap/policy/api/main/rest/TestStatisticsReport.java [new file with mode: 0644]
main/src/test/java/org/onap/policy/api/main/startstop/TestApiActivator.java
main/src/test/java/org/onap/policy/api/main/startstop/TestMain.java
main/src/test/resources/parameters/ApiConfigParameters_Https.json [new file with mode: 0644]
main/src/test/resources/ssl/policy-keystore [new file with mode: 0644]
packages/policy-api-docker/pom.xml [new file with mode: 0644]
packages/policy-api-docker/src/main/docker/Dockerfile [new file with mode: 0644]
packages/policy-api-docker/src/main/docker/policy-api.sh [new file with mode: 0644]
packages/policy-api-tarball/pom.xml [new file with mode: 0644]
packages/policy-api-tarball/src/main/package/tarball/assembly.xml [new file with mode: 0644]
packages/policy-api-tarball/src/main/resources/etc/defaultConfig.json [new file with mode: 0644]
packages/policy-api-tarball/src/main/resources/etc/logback.xml [new file with mode: 0644]
packages/policy-api-tarball/src/main/resources/etc/s3pConfig.json [new file with mode: 0644]
packages/policy-api-tarball/src/main/resources/etc/ssl/policy-keystore [new file with mode: 0644]
packages/policy-api-tarball/src/main/resources/etc/ssl/policy-truststore [new file with mode: 0644]
packages/pom.xml [new file with mode: 0644]
pom.xml

index 6ec4ee5..469b7cb 100644 (file)
@@ -1,4 +1,4 @@
-Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+Copyright � 2017-2019 AT&T Intellectual Property. All rights reserved.
 
 Licensed under the Apache License, Version 2.0 (the "License"); you may
 not use this file except in compliance with the License.
index c0a7590..1383988 100644 (file)
@@ -2,6 +2,7 @@
   ============LICENSE_START=======================================================
    Copyright (C) 2018 Ericsson. All rights reserved.
    Modified Copyright (C) 2018 Samsung Electronics Co., Ltd.
+   Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
   ================================================================================
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -18,7 +19,8 @@
   SPDX-License-Identifier: Apache-2.0
   ============LICENSE_END=========================================================
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
             <artifactId>capabilities</artifactId>
             <version>${policy.common.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.onap.policy.common</groupId>
-            <artifactId>policy-endpoints</artifactId>
-            <version>${policy.common.version}</version>
-        </dependency>
         <dependency>
             <groupId>commons-cli</groupId>
             <artifactId>commons-cli</artifactId>
             <artifactId>common-parameters</artifactId>
             <version>${policy.common.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.onap.policy.common</groupId>
-            <artifactId>ONAP-Logging</artifactId>
-            <version>${policy.common.version}</version>
-        </dependency>
     </dependencies>
 
     <build>
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.policy.api.main;
+package org.onap.policy.api.main.exception;
 
 /**
  * This exception will be called if an error occurs in policy api external service.
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.policy.api.main;
+package org.onap.policy.api.main.exception;
 
 /**
  * This runtime exception will be called if a runtime error occurs when using policy api.
index 92923d0..b660b88 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,18 +26,19 @@ package org.onap.policy.api.main.parameters;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import java.io.FileReader;
-import org.onap.policy.api.main.PolicyApiException;
+import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.startstop.ApiCommandLineArguments;
-import org.onap.policy.common.logging.flexlogger.FlexLogger;
-import org.onap.policy.common.logging.flexlogger.Logger;
 import org.onap.policy.common.parameters.GroupValidationResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This class handles reading, parsing and validating of policy api parameters from JSON files.
  */
 public class ApiParameterHandler {
-    private static final Logger LOGGER = FlexLogger.getLogger(ApiParameterHandler.class);
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApiParameterHandler.class);
+    
     /**
      * Read the parameters from the parameter file.
      *
@@ -55,7 +59,6 @@ public class ApiParameterHandler {
         } catch (final Exception e) {
             final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath()
                     + "\"\n" + "(" + e.getClass().getSimpleName() + "):" + e.getMessage();
-            LOGGER.error(errorMessage, e);
             throw new PolicyApiException(errorMessage, e);
         }
 
index 33ecff3..0a9894e 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,7 +38,9 @@ public class RestServerParameters implements ParameterGroup {
     private int port;
     private String userName;
     private String password;
-
+    private boolean https; 
+    private boolean aaf;
+    
     /**
      * Constructor for instantiating RestServerParameters.
      *
@@ -50,6 +55,29 @@ public class RestServerParameters implements ParameterGroup {
         this.port = port;
         this.userName = userName;
         this.password = password;
+        this.https = false;
+        this.aaf = false;
+    }
+    
+    /**
+     * Constructor for instantiating RestServerParameters.
+     *
+     * @param host the host name
+     * @param port the port
+     * @param userName the user name
+     * @param password the password
+     * @param https the https
+     * @param aaf the aaf
+     */
+    public RestServerParameters(final String host, final int port, final String userName, final String password, 
+                                final boolean https, final boolean aaf) {
+        super();
+        this.host = host;
+        this.port = port;
+        this.userName = userName;
+        this.password = password;
+        this.https = https;
+        this.aaf = aaf;
     }
 
     /**
@@ -97,6 +125,22 @@ public class RestServerParameters implements ParameterGroup {
     public String getPassword() {
         return password;
     }
+    
+    /**
+     * Return the https flag of this RestServerParameters instance.
+     * @return the https
+     */
+    public boolean isHttps() {
+        return https;
+    }
+    
+    /**
+     * Return the aaf flag of this RestServerParameters instance.
+     * @return the aaf
+     */
+    public boolean isAaf() {
+        return aaf;
+    } 
 
     /**
      * Set the name of this RestServerParameters instance.
index 9b4d75d..ca211b6 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,16 +36,15 @@ import javax.ws.rs.core.Response;
 import org.onap.policy.common.endpoints.report.HealthCheckReport;
 
 /**
- * Class to provide api REST services.
- *
+ * Class to provide REST API services.
  */
 @Path("/")
 @Api
 @Produces(MediaType.APPLICATION_JSON)
 @SwaggerDefinition(
-        info = @Info(description = "Policy Api Service", version = "v1.0", title = "Policy Api"),
+        info = @Info(description = "Policy Api Service", version = "v2.0", title = "Policy Api"),
         consumes = { MediaType.APPLICATION_JSON }, produces = { MediaType.APPLICATION_JSON },
-        schemes = { SwaggerDefinition.Scheme.HTTP },
+        schemes = { SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS },
         tags = { @Tag(name = "policy-api", description = "Policy Api Service Operations") })
 public class ApiRestController {
 
@@ -54,4 +56,14 @@ public class ApiRestController {
     public Response healthcheck() {
         return Response.status(Response.Status.OK).entity(new HealthCheckProvider().performHealthCheck()).build();
     }
+    
+    @GET
+    @Path("statistics")
+    @Produces(MediaType.APPLICATION_JSON)
+    @ApiOperation(value = "Fetch current statistics",
+            notes = "Provides current statistics of the Policy API component",
+            response = StatisticsReport.class)
+    public Response statistics() {
+        return Response.status(Response.Status.OK).entity(new StatisticsProvider().fetchCurrentStatistics()).build();
+    }
 }
index b6d6960..cf27bac 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,10 +27,11 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 import org.onap.policy.api.main.parameters.RestServerParameters;
+import org.onap.policy.api.main.rest.aaf.AafApiFilter;
 import org.onap.policy.common.capabilities.Startable;
 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
-import org.onap.policy.common.logging.flexlogger.FlexLogger;
-import org.onap.policy.common.logging.flexlogger.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Class to manage life cycle of api rest server.
@@ -37,7 +41,8 @@ public class ApiRestServer implements Startable {
 
     private static final String SEPARATOR = ".";
     private static final String HTTP_SERVER_SERVICES = "http.server.services";
-    private static final Logger LOGGER = FlexLogger.getLogger(ApiRestServer.class);
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApiRestServer.class);
 
     private List<HttpServletServer> servers = new ArrayList<>();
 
@@ -59,7 +64,10 @@ public class ApiRestServer implements Startable {
     public boolean start() {
         try {
             servers = HttpServletServer.factory.build(getServerProperties());
-            for (final HttpServletServer server : servers) {
+            for (HttpServletServer server : servers) {
+                if (server.isAaf()) {
+                    server.addFilterClass(null, AafApiFilter.class.getCanonicalName());
+                }
                 server.start();
             }
         } catch (final Exception exp) {
@@ -68,7 +76,7 @@ public class ApiRestServer implements Startable {
         }
         return true;
     }
-
+    
     /**
      * Creates the server properties object using restServerParameters.
      *
@@ -89,6 +97,10 @@ public class ApiRestServer implements Startable {
                 restServerParameters.getUserName());
         props.setProperty(HTTP_SERVER_SERVICES + SEPARATOR + restServerParameters.getName() + ".password",
                 restServerParameters.getPassword());
+        props.setProperty(HTTP_SERVER_SERVICES + SEPARATOR + restServerParameters.getName() + ".https",
+                String.valueOf(restServerParameters.isHttps()));
+        props.setProperty(HTTP_SERVER_SERVICES + SEPARATOR + restServerParameters.getName() + ".aaf",
+                String.valueOf(restServerParameters.isAaf()));
         return props;
     }
 
diff --git a/main/src/main/java/org/onap/policy/api/main/rest/ApiStatisticsManager.java b/main/src/main/java/org/onap/policy/api/main/rest/ApiStatisticsManager.java
new file mode 100644 (file)
index 0000000..55c8cee
--- /dev/null
@@ -0,0 +1,340 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.api.main.rest;
+
+/**
+ * Class to hold statistical data for API access.
+ */
+public class ApiStatisticsManager {
+   
+    private static long totalApiCallCount;
+    private static long apiCallSuccessCount;
+    private static long apiCallFailureCount;
+    private static long totalPolicyGetCount;
+    private static long totalPolicyPostCount;
+    private static long totalTemplateGetCount;
+    private static long totalTemplatePostCount;
+    private static long policyGetSuccessCount;
+    private static long policyGetFailureCount;
+    private static long policyPostSuccessCount;
+    private static long policyPostFailureCount;
+    private static long templateGetSuccessCount;
+    private static long templateGetFailureCount;
+    private static long templatePostSuccessCount;
+    private static long templatePostFailureCount;
+   
+    private ApiStatisticsManager() {
+        throw new IllegalStateException("Instantiation of the class is not allowed");
+    }
+    
+    /**
+     * Method to update the total api call count.
+     * 
+     * @return the updated value of totalApiCallCount
+     */
+    public static long updateTotalApiCallCount() {
+        return ++totalApiCallCount;
+    }
+    
+    /**
+     * Method to update the successful api call count.
+     * 
+     * @return the updated value of apiCallSuccessCount
+     */
+    public static long updateApiCallSuccessCount() {
+        return ++apiCallSuccessCount;
+    }
+    
+    /**
+     * Method to update the failed api call count.
+     * 
+     * @return the updated value of apiCallFailureCount
+     */
+    public static long updateApiCallFailureCount() {
+        return ++apiCallFailureCount;
+    }
+    
+    /**
+     * Method to update the total policy GET count.
+     * 
+     * @return the updated value of totalPolicyGetCount
+     */
+    public static long updateTotalPolicyGetCount() {
+        return ++totalPolicyGetCount;
+    }
+    
+    /**
+     * Method to update the total policy POST count.
+     * 
+     * @return the updated value of totalPolicyPostCount
+     */
+    public static long updateTotalPolicyPostCount() {
+        return ++totalPolicyPostCount;
+    }
+    
+    /**
+     * Method to update the total template GET count.
+     * 
+     * @return the updated value of totalTemplateGetCount
+     */
+    public static long updateTotalTemplateGetCount() {
+        return ++totalTemplateGetCount;
+    }
+    
+    /**
+     * Method to update the total template POST count.
+     * 
+     * @return the updated value of totalTemplatePostCount
+     */
+    public static long updateTotalTemplatePostCount() {
+        return ++totalTemplatePostCount;
+    }
+    
+    /**
+     * Method to update successful policy GET count.
+     * 
+     * @return the updated value of policyGetSuccessCount
+     */
+    public static long updatePolicyGetSuccessCount() {
+        return ++policyGetSuccessCount;
+    }
+    
+    /**
+     * Method to update failed policy GET count.
+     * 
+     * @return the updated value of policyGetFailureCount
+     */
+    public static long updatePolicyGetFailureCount() {
+        return ++policyGetFailureCount;
+    }
+    
+    /**
+     * Method to update successful policy POST count.
+     * 
+     * @return the updated value of policyPostSuccessCount
+     */
+    public static long updatePolicyPostSuccessCount() {
+        return ++policyPostSuccessCount;
+    }
+    
+    /**
+     * Method to update failed policy POST count.
+     * 
+     * @return the updated value of policyPostFailureCount
+     */
+    public static long updatePolicyPostFailureCount() {
+        return ++policyPostFailureCount;
+    }
+    
+    /**
+     * Method to update successful template GET count.
+     * 
+     * @return the updated value of templateGetSuccessCount
+     */
+    public static long updateTemplateGetSuccessCount() {
+        return ++templateGetSuccessCount;
+    }
+    
+    /**
+     * Method to update failed template GET count.
+     * 
+     * @return the updated value of templateGetFailureCount
+     */
+    public static long updateTemplateGetFailureCount() {
+        return ++templateGetFailureCount;
+    }
+    
+    /**
+     * Method to update successful template POST count.
+     * 
+     * @return the updated value of templatePostSuccessCount
+     */
+    public static long updateTemplatePostSuccessCount() {
+        return ++templatePostSuccessCount;
+    }
+    
+    /**
+     * Method to update failed template POST count.
+     * 
+     * @return the updated value of templatePostFailureCount
+     */
+    public static long updateTemplatePostFailureCount() {
+        return ++templatePostFailureCount;
+    }
+    
+    /**
+     * Returns the current value of totalApiCallCount.
+     * 
+     * @return the totalApiCallCount
+     */
+    public static long getTotalApiCallCount() {
+        return totalApiCallCount;
+    }
+   
+    /**
+     * Returns the current value of apiCallSuccessCount.
+     * 
+     * @return the apiCallSuccessCount
+     */
+    public static long getApiCallSuccessCount() {
+        return apiCallSuccessCount;
+    }
+    
+    /**
+     * Returns the current value of apiCallFailureCount.
+     * 
+     * @return the apiCallFailureCount
+     */
+    public static long getApiCallFailureCount() {
+        return apiCallFailureCount;
+    } 
+    
+    /**
+     * Returns the current value of totalPolicyGetCount.
+     * 
+     * @return the totalPolicyGetCount
+     */
+    public static long getTotalPolicyGetCount() {
+        return totalPolicyGetCount;
+    }
+    
+    /**
+     * Returns the current value of totalPolicyPostCount.
+     * 
+     * @return the totalPolicyPostCount
+     */
+    public static long getTotalPolicyPostCount() {
+        return totalPolicyPostCount;
+    } 
+    
+    /**
+     * Returns the current value of totalTemplateGetCount.
+     * 
+     * @return the totalTemplateGetCount
+     */
+    public static long getTotalTemplateGetCount() {
+        return totalTemplateGetCount;
+    }
+    
+    /**
+     * Returns the current value of totalTemplatePostCount.
+     * 
+     * @return the totalTemplatePostCount
+     */
+    public static long getTotalTemplatePostCount() {
+        return totalTemplatePostCount;
+    }
+    
+    /**
+     * Returns the current value of policyGetSuccessCount.
+     * 
+     * @return the policyGetSuccessCount
+     */
+    public static long getPolicyGetSuccessCount() {
+        return policyGetSuccessCount;
+    }
+    
+    /**
+     * Returns the current value of policyGetFailureCount.
+     * 
+     * @return the policyGetFailureCount 
+     */
+    public static long getPolicyGetFailureCount() {
+        return policyGetFailureCount;
+    }
+    
+    /**
+     * Returns the current value of policyPostSuccessCount.
+     * 
+     * @return the policyPostSuccessCount
+     */
+    public static long getPolicyPostSuccessCount() {
+        return policyPostSuccessCount;
+    }
+    
+    /**
+     * Returns the current value of policyPostFailureCount.
+     * 
+     * @return the policyPostFailureCount
+     */
+    public static long getPolicyPostFailureCount() {
+        return policyPostFailureCount;
+    }
+    
+    /**
+     * Returns the current value of templateGetSuccessCount.
+     * 
+     * @return the templateGetSuccessCount
+     */
+    public static long getTemplateGetSuccessCount() {
+        return templateGetSuccessCount;
+    }
+    
+    /**
+     * Returns the current value of templateGetFailureCount.
+     * 
+     * @return the templateGetFailureCount
+     */
+    public static long getTemplateGetFailureCount() {
+        return templateGetFailureCount;
+    }
+    
+    /**
+     * Returns the current value of templatePostSuccessCount.
+     * 
+     * @return the templatePostSuccessCount
+     */
+    public static long getTemplatePostSuccessCount() {
+        return templatePostSuccessCount;
+    }
+    
+    /**
+     * Returns the current value of templatePostFailureCount.
+     * 
+     * @return the templatePostFailureCount
+     */
+    public static long getTemplatePostFailureCount() {
+        return templatePostFailureCount;
+    }
+    
+    /**
+     * Reset all the statistics counts to 0.
+     */
+    public static void resetAllStatistics() {
+        totalApiCallCount = 0L;
+        apiCallSuccessCount = 0L;
+        apiCallFailureCount = 0L;
+        totalPolicyGetCount = 0L;
+        totalPolicyPostCount = 0L;
+        totalTemplateGetCount = 0L;
+        totalTemplatePostCount = 0L;
+        policyGetSuccessCount = 0L;
+        policyGetFailureCount = 0L;
+        policyPostSuccessCount = 0L;
+        policyPostFailureCount = 0L;
+        templateGetSuccessCount = 0L;
+        templateGetFailureCount = 0L;
+        templatePostSuccessCount = 0L;
+        templatePostFailureCount = 0L;
+    }
+}
index dd22338..4838733 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/main/src/main/java/org/onap/policy/api/main/rest/StatisticsProvider.java b/main/src/main/java/org/onap/policy/api/main/rest/StatisticsProvider.java
new file mode 100644 (file)
index 0000000..e8f1840
--- /dev/null
@@ -0,0 +1,59 @@
+/*-
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.api.main.rest;
+
+import org.onap.policy.api.main.startstop.ApiActivator;
+
+/**
+ * Class to fetch API statistics.
+ */
+public class StatisticsProvider {
+    
+    /**
+     * Return the current API statistics.
+     * 
+     * @return Report containing API statistics
+     */
+    public StatisticsReport fetchCurrentStatistics() {
+        final StatisticsReport report = new StatisticsReport();
+        report.setCode(ApiActivator.isAlive() ? 200 : 500);
+        report.setTotalApiCallCount(ApiStatisticsManager.getTotalApiCallCount());
+        report.setApiCallSuccessCount(ApiStatisticsManager.getApiCallSuccessCount());
+        report.setApiCallFailureCount(ApiStatisticsManager.getApiCallFailureCount());
+        report.setTotalPolicyGetCount(ApiStatisticsManager.getTotalPolicyGetCount());
+        report.setTotalPolicyPostCount(ApiStatisticsManager.getTotalPolicyPostCount());
+        report.setTotalTemplateGetCount(ApiStatisticsManager.getTotalTemplateGetCount());
+        report.setTotalTemplatePostCount(ApiStatisticsManager.getTotalTemplatePostCount());
+        report.setPolicyGetSuccessCount(ApiStatisticsManager.getPolicyGetSuccessCount());
+        report.setPolicyGetFailureCount(ApiStatisticsManager.getPolicyGetFailureCount());
+        report.setPolicyPostSuccessCount(ApiStatisticsManager.getPolicyPostSuccessCount());
+        report.setPolicyPostFailureCount(ApiStatisticsManager.getPolicyPostFailureCount());
+        report.setTemplateGetSuccessCount(ApiStatisticsManager.getTemplateGetSuccessCount());
+        report.setTemplateGetFailureCount(ApiStatisticsManager.getTemplateGetFailureCount());
+        report.setTemplatePostSuccessCount(ApiStatisticsManager.getTemplatePostSuccessCount());
+        report.setTemplatePostFailureCount(ApiStatisticsManager.getTemplatePostFailureCount());
+        return report;
+    }
+}
+
diff --git a/main/src/main/java/org/onap/policy/api/main/rest/StatisticsReport.java b/main/src/main/java/org/onap/policy/api/main/rest/StatisticsReport.java
new file mode 100644 (file)
index 0000000..03bc959
--- /dev/null
@@ -0,0 +1,376 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.api.main.rest;
+
+/**
+ * Class to represent API statistics report.
+ */
+public class StatisticsReport {
+    
+    private int code;
+    private long totalApiCallCount;
+    private long apiCallSuccessCount;
+    private long apiCallFailureCount;
+    private long totalPolicyGetCount;
+    private long totalPolicyPostCount;
+    private long totalTemplateGetCount;
+    private long totalTemplatePostCount;
+    private long policyGetSuccessCount;
+    private long policyGetFailureCount;
+    private long policyPostSuccessCount;
+    private long policyPostFailureCount;
+    private long templateGetSuccessCount;
+    private long templateGetFailureCount;
+    private long templatePostSuccessCount;
+    private long templatePostFailureCount;
+    
+    /**
+     * Returns the code of this {@link StatisticsReport} instance.
+     *
+     * @return the code
+     */
+    public int getCode() {
+        return code;
+    }
+    
+    /**
+     * Set code in this {@link StatisticsReport} instance.
+     *
+     * @param code the code to set
+     */
+    public void setCode(final int code) {
+        this.code = code;
+    }
+    
+    /**
+     * Returns the totalApiCallCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the totalApiCallCount
+     */
+    public long getTotalApiCallCount() {
+        return totalApiCallCount;
+    }
+    
+    /**
+     * Set totalApiCallCount in this {@link StatisticsReport} instance.
+     * 
+     * @param totalApiCallCount the totalApiCallCount to set
+     */
+    public void setTotalApiCallCount(final long totalApiCallCount) {
+        this.totalApiCallCount = totalApiCallCount;
+    }
+   
+    /**
+     * Returns the apiCallSuccessCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the apiCallSuccessCount
+     */
+    public long getApiCallSuccessCount() {
+        return apiCallSuccessCount;
+    }
+    
+    /**
+     * Set apiCallSuccessCount in this {@link StatisticsReport} instance.
+     * 
+     * @param apiCallSuccessCount the apiCallSuccessCount to set
+     */
+    public void setApiCallSuccessCount(final long apiCallSuccessCount) {
+        this.apiCallSuccessCount = apiCallSuccessCount;
+    }
+    
+    /**
+     * Returns the apiCallFailureCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the apiCallFailureCount
+     */
+    public long getApiCallFailureCount() {
+        return apiCallFailureCount;
+    } 
+    
+    /**
+     * Set apiCallFailureCount in this {@link StatisticsReport} instance.
+     * 
+     * @param apiCallFailureCount the apiCallFailureCount to set
+     */
+    public void setApiCallFailureCount(final long apiCallFailureCount) {
+        this.apiCallFailureCount = apiCallFailureCount;
+    }
+    
+    /**
+     * Returns the totalPolicyGetCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the totalPolicyGetCount
+     */
+    public long getTotalPolicyGetCount() {
+        return totalPolicyGetCount;
+    }
+    
+    /**
+     * Set totalPolicyGetCount in this {@link StatisticsReport} instance.
+     * 
+     * @param totalPolicyGetCount the totalPolicyGetCount to set
+     */
+    public void setTotalPolicyGetCount(final long totalPolicyGetCount) {
+        this.totalPolicyGetCount = totalPolicyGetCount;
+    }
+    
+    /**
+     * Returns the totalPolicyPostCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the totalPolicyPostCount
+     */
+    public long getTotalPolicyPostCount() {
+        return totalPolicyPostCount;
+    } 
+    
+    /**
+     * Set totalPolicyPostCount in this {@link StatisticsReport} instance.
+     * 
+     * @param totalPolicyPostCount the totalPolicyPostCount to set
+     */
+    public void setTotalPolicyPostCount(final long totalPolicyPostCount) {
+        this.totalPolicyPostCount = totalPolicyPostCount;
+    }
+    
+    /**
+     * Returns the totalTemplateGetCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the totalTemplateGetCount
+     */
+    public long getTotalTemplateGetCount() {
+        return totalTemplateGetCount;
+    }
+    
+    /**
+     * Set totalTemplateGetCount in this {@link StatisticsReport} instance.
+     * 
+     * @param totalTemplateGetCount the totalTemplateGetCount to set
+     */
+    public void setTotalTemplateGetCount(final long totalTemplateGetCount) {
+        this.totalTemplateGetCount = totalTemplateGetCount;
+    }
+    
+    /**
+     * Returns the totalTemplatePostCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the totalTemplatePostCount
+     */
+    public long getTotalTemplatePostCount() {
+        return totalTemplatePostCount;
+    }
+    
+    /**
+     * Set totalTemplatePostCount in this {@link StatisticsReport} instance.
+     * 
+     * @param totalTemplatePostCount the totalTemplatePostCount to set
+     */
+    public void setTotalTemplatePostCount(final long totalTemplatePostCount) {
+        this.totalTemplatePostCount = totalTemplatePostCount;
+    }
+    
+    /**
+     * Returns the policyGetSuccessCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the policyGetSuccessCount
+     */
+    public long getPolicyGetSuccessCount() {
+        return policyGetSuccessCount;
+    }
+    
+    /**
+     * Set policyGetSuccessCount in this {@link StatisticsReport} instance.
+     * 
+     * @param policyGetSuccessCount the policyGetSuccessCount to set
+     */
+    public void setPolicyGetSuccessCount(final long policyGetSuccessCount) {
+        this.policyGetSuccessCount = policyGetSuccessCount;
+    }
+   
+    /**
+     * Returns the policyGetFailureCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the policyGetFailureCount 
+     */
+    public long getPolicyGetFailureCount() {
+        return policyGetFailureCount;
+    }
+    
+    /**
+     * Set policyGetFailureCount in this {@link StatisticsReport} instance.
+     * 
+     * @param policyGetFailureCount the policyGetFailureCount to set
+     */
+    public void setPolicyGetFailureCount(final long policyGetFailureCount) {
+        this.policyGetFailureCount = policyGetFailureCount;
+    }
+    
+    /**
+     * Returns the policyPostSuccessCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the policyPostSuccessCount
+     */
+    public long getPolicyPostSuccessCount() {
+        return policyPostSuccessCount;
+    }
+    
+    /**
+     * Set policyPostSuccessCount in this {@link StatisticsReport} instance.
+     * 
+     * @param policyPostSuccessCount the policyPostSuccessCount to set
+     */
+    public void setPolicyPostSuccessCount(final long policyPostSuccessCount) {
+        this.policyPostSuccessCount = policyPostSuccessCount;
+    }
+    
+    /**
+     * Returns the policyPostFailureCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the policyPostFailureCount
+     */
+    public long getPolicyPostFailureCount() {
+        return policyPostFailureCount;
+    }
+    
+    /**
+     * Set policyPostFailureCount in this {@link StatisticsReport} instance.
+     * 
+     * @param policyPostFailureCount the policyPostFailureCount to set
+     */
+    public void setPolicyPostFailureCount(final long policyPostFailureCount) {
+        this.policyPostFailureCount = policyPostFailureCount;
+    }
+   
+    /**
+     * Returns the templateGetSuccessCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the templateGetSuccessCount
+     */
+    public long getTemplateGetSuccessCount() {
+        return templateGetSuccessCount;
+    }
+    
+    /**
+     * Set templateGetSuccessCount in this {@link StatisticsReport} instance.
+     *  
+     * @param templateGetSuccessCount the templateGetSuccessCount to set
+     */
+    public void setTemplateGetSuccessCount(final long templateGetSuccessCount) {
+        this.templateGetSuccessCount = templateGetSuccessCount;
+    }
+    
+    /**
+     * Returns the templateGetFailureCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the templateGetFailureCount
+     */
+    public long getTemplateGetFailureCount() {
+        return templateGetFailureCount;
+    }
+    
+    /**
+     * Set templateGetFailureCount in this {@link StatisticsReport} instance.
+     * 
+     * @param templateGetFailureCount the templateGetFailureCount to set
+     */
+    public void setTemplateGetFailureCount(final long templateGetFailureCount) {
+        this.templateGetFailureCount = templateGetFailureCount;
+    }
+    
+    /**
+     * Returns the templatePostSuccessCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the templatePostSuccessCount
+     */
+    public long getTemplatePostSuccessCount() {
+        return templatePostSuccessCount;
+    }
+    
+    /**
+     * Set templatePostSuccessCount in this {@link StatisticsReport} instance.
+     * 
+     * @param templatePostSuccessCount the templatePostSuccessCount to set
+     */
+    public void setTemplatePostSuccessCount(final long templatePostSuccessCount) {
+        this.templatePostSuccessCount = templatePostSuccessCount;
+    }
+    
+    /**
+     * Returns the templatePostFailureCount of this {@link StatisticsReport} instance.
+     * 
+     * @return the templatePostFailureCount
+     */
+    public long getTemplatePostFailureCount() {
+        return templatePostFailureCount;
+    }
+    
+    /**
+     * Set templatePostFailureCount in this {@link StatisticsReport} instance.
+     * 
+     * @param templatePostFailureCount the templatePostFailureCount to set
+     */
+    public void setTemplatePostFailureCount(final long templatePostFailureCount) {
+        this.templatePostFailureCount = templatePostFailureCount;
+    }
+   
+    /**
+     * {@inheritDoc}}.
+     */
+    @Override
+    public String toString() {
+        final StringBuilder builder = new StringBuilder();
+        builder.append("StatisticsReport [code=");
+        builder.append(getCode());
+        builder.append(", totalApiCallCount=");
+        builder.append(getTotalApiCallCount());
+        builder.append(", apiCallSuccessCount=");
+        builder.append(getApiCallSuccessCount());
+        builder.append(", apiCallFailureCount=");
+        builder.append(getApiCallFailureCount());
+        builder.append(", totalPolicyGetCount=");
+        builder.append(getTotalPolicyGetCount());
+        builder.append(", totalPolicyPostCount=");
+        builder.append(getTotalPolicyPostCount());
+        builder.append(", totalTemplateGetCount=");
+        builder.append(getTotalTemplateGetCount());
+        builder.append(", totalTemplatePostCount=");
+        builder.append(getTotalTemplatePostCount());
+        builder.append(", policyGetSuccessCount=");
+        builder.append(getPolicyGetSuccessCount());
+        builder.append(", policyGetFailureCount=");
+        builder.append(getPolicyGetFailureCount());
+        builder.append(", policyPostSuccessCount=");
+        builder.append(getPolicyPostSuccessCount());
+        builder.append(", policyPostFailureCount=");
+        builder.append(getPolicyPostFailureCount());
+        builder.append(", templateGetSuccessCount=");
+        builder.append(getTemplateGetSuccessCount());
+        builder.append(", templateGetFailureCount=");
+        builder.append(getTemplateGetFailureCount());
+        builder.append(", templatePostSuccessCount=");
+        builder.append(getTemplatePostSuccessCount());
+        builder.append(", templatePostFailureCount=");
+        builder.append(getTemplatePostFailureCount());
+        builder.append("]");
+        return builder.toString();
+    }
+}
diff --git a/main/src/main/java/org/onap/policy/api/main/rest/aaf/AafApiFilter.java b/main/src/main/java/org/onap/policy/api/main/rest/aaf/AafApiFilter.java
new file mode 100644 (file)
index 0000000..dea12ee
--- /dev/null
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.api.main.rest.aaf;
+
+import org.onap.policy.common.endpoints.http.server.aaf.AafGranularAuthFilter;
+
+/**
+ * Api AAF authorization filter.
+ */
+public class AafApiFilter extends AafGranularAuthFilter {
+   
+    public static final String AAF_NODETYPE = "policy-api";
+    public static final String AAF_ROOT_PERMISSION = DEFAULT_NAMESPACE + "." + AAF_NODETYPE;
+    
+    @Override
+    public String getPermissionTypeRoot() {
+        return AAF_ROOT_PERMISSION;
+    }
+}
index 1f7b05a..4cd9884 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.onap.policy.api.main.startstop;
 
-import org.onap.policy.api.main.PolicyApiException;
+import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.parameters.ApiParameterGroup;
 import org.onap.policy.api.main.rest.ApiRestServer;
-import org.onap.policy.common.logging.flexlogger.FlexLogger;
-import org.onap.policy.common.logging.flexlogger.Logger;
 import org.onap.policy.common.parameters.ParameterService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This class wraps a distributor so that it can be activated as a complete service together with all its api
  * and forwarding handlers.
  */
 public class ApiActivator {
-    // The logger for this class
-    private static final Logger LOGGER = FlexLogger.getLogger(ApiActivator.class);
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApiActivator.class);
 
-    // The parameters of this policy api activator
     private final ApiParameterGroup apiParameterGroup;
 
     private static boolean alive = false;
@@ -91,8 +93,7 @@ public class ApiActivator {
             // Stop the api rest server
             restServer.stop();
         } catch (final Exception exp) {
-            LOGGER.error("Policy api service termination failed", exp);
-            throw new PolicyApiException(exp.getMessage(), exp);
+            throw new PolicyApiException("Policy api service termination failed", exp);
         }
     }
 
index f165b16..f6c1c78 100644 (file)
@@ -31,11 +31,10 @@ import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
-import org.onap.policy.api.main.PolicyApiException;
-import org.onap.policy.api.main.PolicyApiRuntimeException;
+import org.onap.policy.api.main.exception.PolicyApiException;
+import org.onap.policy.api.main.exception.PolicyApiRuntimeException;
 import org.onap.policy.common.utils.resources.ResourceUtils;
 
-
 /**
  * This class reads and handles command line parameters for the policy api main program.
  */
index 00d3687..97d53ad 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 package org.onap.policy.api.main.startstop;
 
 import java.util.Arrays;
-import org.onap.policy.api.main.PolicyApiException;
+import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.parameters.ApiParameterGroup;
 import org.onap.policy.api.main.parameters.ApiParameterHandler;
-import org.onap.policy.common.logging.flexlogger.FlexLogger;
-import org.onap.policy.common.logging.flexlogger.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This class initiates ONAP Policy Framework policy api.
  *
  */
 public class Main {
-    private static final Logger LOGGER = FlexLogger.getLogger(Main.class);
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
 
     // The policy api Activator that activates the policy api service
     private ApiActivator activator;
@@ -47,7 +51,7 @@ public class Main {
      */
     public Main(final String[] args) {
         final String argumentString = Arrays.toString(args);
-        LOGGER.info("Starting policy api service with arguments - " + argumentString);
+        LOGGER.info("Starting policy api service with arguments - {}", argumentString);
 
         // Check the arguments
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
@@ -81,8 +85,7 @@ public class Main {
         try {
             activator.initialize();
         } catch (final PolicyApiException e) {
-            LOGGER.error("start of policy api service failed, used parameters are " + Arrays.toString(args),
-                    e);
+            LOGGER.error("start of policy api service failed, used parameters are {} ", argumentString, e);
             return;
         }
 
index f86c857..8ff2f98 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,21 +33,23 @@ public class CommonTestData {
     private static final String REST_SERVER_USER = "healthcheck";
     private static final int REST_SERVER_PORT = 6969;
     private static final String REST_SERVER_HOST = "0.0.0.0";
+    private static final boolean REST_SERVER_HTTPS = false;
+    private static final boolean REST_SERVER_AAF = false;
     public static final String API_GROUP_NAME = "ApiGroup";
 
     /**
-     * Returns an instance of ReceptionHandlerParameters for test cases.
+     * Returns an instance of RestServerParameters for test cases.
      *
      * @param isEmpty boolean value to represent that object created should be empty or not
-     * @return the restServerParameters object
+     * @return the RestServerParameters object
      */
     public RestServerParameters getRestServerParameters(final boolean isEmpty) {
         final RestServerParameters restServerParameters;
         if (!isEmpty) {
             restServerParameters = new RestServerParameters(REST_SERVER_HOST, REST_SERVER_PORT, REST_SERVER_USER,
-                    REST_SERVER_PASSWORD);
+                    REST_SERVER_PASSWORD, REST_SERVER_HTTPS, REST_SERVER_AAF);
         } else {
-            restServerParameters = new RestServerParameters(null, 0, null, null);
+            restServerParameters = new RestServerParameters(null, 0, null, null, false, false);
         }
         return restServerParameters;
     }
index 7a59dad..93fbfc6 100644 (file)
@@ -1,6 +1,9 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -47,6 +50,8 @@ public class TestApiParameterGroup {
                 apiParameters.getRestServerParameters().getUserName());
         assertEquals(restServerParameters.getPassword(),
                 apiParameters.getRestServerParameters().getPassword());
+        assertEquals(restServerParameters.isHttps(), apiParameters.getRestServerParameters().isHttps());
+        assertEquals(restServerParameters.isAaf(), apiParameters.getRestServerParameters().isAaf());
         assertEquals(CommonTestData.API_GROUP_NAME, apiParameters.getName());
     }
 
index 7a06524..71d8c35 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,7 +30,7 @@ import java.nio.file.Files;
 import java.nio.file.Paths;
 
 import org.junit.Test;
-import org.onap.policy.api.main.PolicyApiException;
+import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.startstop.ApiCommandLineArguments;
 
 /**
@@ -39,9 +40,7 @@ import org.onap.policy.api.main.startstop.ApiCommandLineArguments;
 public class TestApiParameterHandler {
     @Test
     public void testParameterHandlerNoParameterFile() throws PolicyApiException {
-        final String[] noArgumentString =
-        { "-c", "parameters/NoParameterFile.json" };
-
+        final String[] noArgumentString = { "-c", "parameters/NoParameterFile.json" };
         final ApiCommandLineArguments noArguments = new ApiCommandLineArguments();
         noArguments.parse(noArgumentString);
 
@@ -55,9 +54,7 @@ public class TestApiParameterHandler {
 
     @Test
     public void testParameterHandlerEmptyParameters() throws PolicyApiException {
-        final String[] emptyArgumentString =
-        { "-c", "parameters/EmptyParameters.json" };
-
+        final String[] emptyArgumentString = { "-c", "parameters/EmptyParameters.json" };
         final ApiCommandLineArguments emptyArguments = new ApiCommandLineArguments();
         emptyArguments.parse(emptyArgumentString);
 
@@ -71,9 +68,7 @@ public class TestApiParameterHandler {
 
     @Test
     public void testParameterHandlerBadParameters() throws PolicyApiException {
-        final String[] badArgumentString =
-        { "-c", "parameters/BadParameters.json" };
-
+        final String[] badArgumentString = { "-c", "parameters/BadParameters.json" };
         final ApiCommandLineArguments badArguments = new ApiCommandLineArguments();
         badArguments.parse(badArgumentString);
 
@@ -89,9 +84,7 @@ public class TestApiParameterHandler {
 
     @Test
     public void testParameterHandlerInvalidParameters() throws PolicyApiException {
-        final String[] invalidArgumentString =
-        { "-c", "parameters/InvalidParameters.json" };
-
+        final String[] invalidArgumentString = { "-c", "parameters/InvalidParameters.json" };
         final ApiCommandLineArguments invalidArguments = new ApiCommandLineArguments();
         invalidArguments.parse(invalidArgumentString);
 
@@ -107,9 +100,7 @@ public class TestApiParameterHandler {
 
     @Test
     public void testParameterHandlerNoParameters() throws PolicyApiException {
-        final String[] noArgumentString =
-        { "-c", "parameters/NoParameters.json" };
-
+        final String[] noArgumentString = { "-c", "parameters/NoParameters.json" };
         final ApiCommandLineArguments noArguments = new ApiCommandLineArguments();
         noArguments.parse(noArgumentString);
 
@@ -127,24 +118,18 @@ public class TestApiParameterHandler {
 
     @Test
     public void testParameterHandlerMinumumParameters() throws PolicyApiException {
-        final String[] minArgumentString =
-        { "-c", "parameters/MinimumParameters.json" };
-
+        final String[] minArgumentString = { "-c", "parameters/MinimumParameters.json" };
         final ApiCommandLineArguments minArguments = new ApiCommandLineArguments();
         minArguments.parse(minArgumentString);
-
         final ApiParameterGroup parGroup = new ApiParameterHandler().getParameters(minArguments);
         assertEquals(CommonTestData.API_GROUP_NAME, parGroup.getName());
     }
 
     @Test
     public void testApiParameterGroup() throws PolicyApiException {
-        final String[] apiConfigParameters =
-        { "-c", "parameters/ApiConfigParameters.json" };
-
+        final String[] apiConfigParameters = { "-c", "parameters/ApiConfigParameters.json" };
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         arguments.parse(apiConfigParameters);
-
         final ApiParameterGroup parGroup = new ApiParameterHandler().getParameters(arguments);
         assertTrue(arguments.checkSetConfigurationFilePath());
         assertEquals(CommonTestData.API_GROUP_NAME, parGroup.getName());
@@ -152,9 +137,7 @@ public class TestApiParameterHandler {
 
     @Test
     public void testApiParameterGroup_InvalidName() throws PolicyApiException {
-        final String[] apiConfigParameters =
-        { "-c", "parameters/ApiConfigParameters_InvalidName.json" };
-
+        final String[] apiConfigParameters = { "-c", "parameters/ApiConfigParameters_InvalidName.json" };
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         arguments.parse(apiConfigParameters);
 
@@ -170,9 +153,8 @@ public class TestApiParameterHandler {
     @Test
     public void testApiParameterGroup_InvalidRestServerParameters()
             throws PolicyApiException, IOException {
-        final String[] apiConfigParameters =
-        { "-c", "parameters/ApiConfigParameters_InvalidRestServerParameters.json" };
-
+        final String[] apiConfigParameters = 
+            { "-c", "parameters/ApiConfigParameters_InvalidRestServerParameters.json" };
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         arguments.parse(apiConfigParameters);
 
@@ -189,8 +171,7 @@ public class TestApiParameterHandler {
 
     @Test
     public void testApiVersion() throws PolicyApiException {
-        final String[] apiConfigParameters =
-        { "-v" };
+        final String[] apiConfigParameters = { "-v" };
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         final String version = arguments.parse(apiConfigParameters);
         assertTrue(version.startsWith("ONAP Policy Framework Api Service"));
@@ -198,8 +179,7 @@ public class TestApiParameterHandler {
 
     @Test
     public void testApiHelp() throws PolicyApiException {
-        final String[] apiConfigParameters =
-        { "-h" };
+        final String[] apiConfigParameters = { "-h" };
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         final String help = arguments.parse(apiConfigParameters);
         assertTrue(help.startsWith("usage:"));
@@ -207,8 +187,7 @@ public class TestApiParameterHandler {
 
     @Test
     public void testApiInvalidOption() throws PolicyApiException {
-        final String[] apiConfigParameters =
-        { "-d" };
+        final String[] apiConfigParameters = { "-d" };
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         try {
             arguments.parse(apiConfigParameters);
index ad63d0f..1ea42e0 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +23,9 @@ package org.onap.policy.api.main.rest;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
 
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
@@ -32,13 +36,14 @@ import javax.ws.rs.core.MediaType;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.junit.Test;
-import org.onap.policy.api.main.PolicyApiException;
+import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.parameters.CommonTestData;
 import org.onap.policy.api.main.parameters.RestServerParameters;
 import org.onap.policy.api.main.startstop.Main;
 import org.onap.policy.common.endpoints.report.HealthCheckReport;
-import org.onap.policy.common.logging.flexlogger.FlexLogger;
-import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Class to perform unit test of HealthCheckMonitor.
@@ -46,7 +51,7 @@ import org.onap.policy.common.logging.flexlogger.Logger;
  */
 public class TestApiRestServer {
 
-    private static final Logger LOGGER = FlexLogger.getLogger(TestApiRestServer.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(TestApiRestServer.class);
     private static final String NOT_ALIVE = "not alive";
     private static final String ALIVE = "alive";
     private static final String SELF = "self";
@@ -55,10 +60,15 @@ public class TestApiRestServer {
     @Test
     public void testHealthCheckSuccess() throws PolicyApiException, InterruptedException {
         final String reportString = "Report [name=Policy API, url=self, healthy=true, code=200, message=alive]";
-        final Main main = startApiService();
-        final HealthCheckReport report = performHealthCheck();
-        validateReport(NAME, SELF, true, 200, ALIVE, reportString, report);
-        stopApiService(main);
+        try {
+            final Main main = startApiService();
+            final HealthCheckReport report = performHealthCheck();
+            validateReport(NAME, SELF, true, 200, ALIVE, reportString, report);
+            stopApiService(main);
+        } catch (final Exception exp) {
+            LOGGER.error("testHealthCheckSuccess failed", exp);
+            fail("Test should not throw an exception");
+        }
     }
 
     @Test
@@ -67,12 +77,17 @@ public class TestApiRestServer {
         final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
         restServerParams.setName(CommonTestData.API_GROUP_NAME);
         final ApiRestServer restServer = new ApiRestServer(restServerParams);
-        restServer.start();
-        final HealthCheckReport report = performHealthCheck();
-        validateReport(NAME, SELF, false, 500, NOT_ALIVE, reportString, report);
-        assertTrue(restServer.isAlive());
-        assertTrue(restServer.toString().startsWith("ApiRestServer [servers="));
-        restServer.shutdown();
+        try {
+            restServer.start();
+            final HealthCheckReport report = performHealthCheck();
+            validateReport(NAME, SELF, false, 500, NOT_ALIVE, reportString, report);
+            assertTrue(restServer.isAlive());
+            assertTrue(restServer.toString().startsWith("ApiRestServer [servers="));
+            restServer.shutdown();
+        } catch (final Exception exp) {
+            LOGGER.error("testHealthCheckFailure failed", exp);
+            fail("Test should not throw an exception");
+        }
     }
 
     private Main startApiService() {
@@ -84,8 +99,7 @@ public class TestApiRestServer {
         main.shutdown();
     }
 
-    private HealthCheckReport performHealthCheck() throws InterruptedException {
-        HealthCheckReport response = null;
+    private HealthCheckReport performHealthCheck() throws InterruptedException, IOException {
         final ClientConfig clientConfig = new ClientConfig();
 
         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
@@ -95,14 +109,11 @@ public class TestApiRestServer {
         final WebTarget webTarget = client.target("http://localhost:6969/healthcheck");
 
         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
-        while (response == null) {
-            try {
-                response = invocationBuilder.get(HealthCheckReport.class);
-            } catch (final Exception exp) {
-                LOGGER.info("the server is not started yet. We will retry again");
-            }
+        
+        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
+            throw new IllegalStateException("cannot connect to port 6969");
         }
-        return response;
+        return invocationBuilder.get(HealthCheckReport.class);
     }
 
     private void validateReport(final String name, final String url, final boolean healthy, final int code,
diff --git a/main/src/test/java/org/onap/policy/api/main/rest/TestApiStatistics.java b/main/src/test/java/org/onap/policy/api/main/rest/TestApiStatistics.java
new file mode 100644 (file)
index 0000000..5d53567
--- /dev/null
@@ -0,0 +1,152 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.api.main.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
+import org.junit.Test;
+import org.onap.policy.api.main.exception.PolicyApiException;
+import org.onap.policy.api.main.parameters.CommonTestData;
+import org.onap.policy.api.main.parameters.RestServerParameters;
+import org.onap.policy.api.main.startstop.Main;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to perform unit test of {@link ApiRestController}.
+ */
+public class TestApiStatistics {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(TestApiStatistics.class);
+
+    @Test
+    public void testApiStatistics_200() throws PolicyApiException, InterruptedException {
+        try {
+            final Main main = startApiService();
+            StatisticsReport report = getApiStatistics();
+            validateReport(report, 0, 200);
+            updateApiStatistics();
+            report = getApiStatistics();
+            validateReport(report, 1, 200);
+            stopApiService(main);
+            ApiStatisticsManager.resetAllStatistics();
+        } catch (final Exception exp) {
+            LOGGER.error("testApiStatistics_200 failed", exp);
+            fail("Test should not throw an exception");
+        }
+    }
+
+    @Test
+    public void testApiStatistics_500() throws InterruptedException {
+        final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
+        restServerParams.setName(CommonTestData.API_GROUP_NAME);
+
+        final ApiRestServer restServer = new ApiRestServer(restServerParams);
+        try {
+            restServer.start();
+            final StatisticsReport report = getApiStatistics();
+            validateReport(report, 0, 500);
+            restServer.shutdown();
+            ApiStatisticsManager.resetAllStatistics();
+        } catch (final Exception exp) {
+            LOGGER.error("testApiStatistics_500 failed", exp);
+            fail("Test should not throw an exception");
+        }
+    }
+
+
+    private Main startApiService() {
+        final String[] distributionConfigParameters = { "-c", "parameters/ApiConfigParameters.json" };
+        return new Main(distributionConfigParameters);
+    }
+
+    private void stopApiService(final Main main) throws PolicyApiException {
+        main.shutdown();
+    }
+
+    private StatisticsReport getApiStatistics() throws InterruptedException, IOException {
+        final ClientConfig clientConfig = new ClientConfig();
+
+        final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
+        clientConfig.register(feature);
+
+        final Client client = ClientBuilder.newClient(clientConfig);
+        final WebTarget webTarget = client.target("http://localhost:6969/statistics");
+
+        final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
+        
+        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
+            throw new IllegalStateException("cannot connect to port 6969");
+        }
+        return invocationBuilder.get(StatisticsReport.class);
+    }
+
+    private void updateApiStatistics() {
+        ApiStatisticsManager.updateTotalApiCallCount();
+        ApiStatisticsManager.updateApiCallSuccessCount();
+        ApiStatisticsManager.updateApiCallFailureCount();
+        ApiStatisticsManager.updateTotalPolicyGetCount();
+        ApiStatisticsManager.updateTotalPolicyPostCount();
+        ApiStatisticsManager.updateTotalTemplateGetCount();
+        ApiStatisticsManager.updateTotalTemplatePostCount();
+        ApiStatisticsManager.updatePolicyGetSuccessCount();
+        ApiStatisticsManager.updatePolicyGetFailureCount();
+        ApiStatisticsManager.updatePolicyPostSuccessCount();
+        ApiStatisticsManager.updatePolicyPostFailureCount();
+        ApiStatisticsManager.updateTemplateGetSuccessCount();
+        ApiStatisticsManager.updateTemplateGetFailureCount();
+        ApiStatisticsManager.updateTemplatePostSuccessCount();
+        ApiStatisticsManager.updateTemplatePostFailureCount();
+    }
+
+    private void validateReport(final StatisticsReport report, final int count, final int code) {
+        assertEquals(code, report.getCode());
+        assertEquals(count, report.getTotalApiCallCount());
+        assertEquals(count, report.getApiCallSuccessCount());
+        assertEquals(count, report.getApiCallFailureCount());
+        assertEquals(count, report.getTotalPolicyGetCount());
+        assertEquals(count, report.getTotalPolicyPostCount());
+        assertEquals(count, report.getTotalTemplateGetCount());
+        assertEquals(count, report.getTotalTemplatePostCount());
+        assertEquals(count, report.getPolicyGetSuccessCount());
+        assertEquals(count, report.getPolicyGetFailureCount());
+        assertEquals(count, report.getPolicyPostSuccessCount());
+        assertEquals(count, report.getPolicyPostFailureCount());
+        assertEquals(count, report.getTemplateGetSuccessCount());
+        assertEquals(count, report.getTemplateGetFailureCount());
+        assertEquals(count, report.getTemplatePostSuccessCount());
+        assertEquals(count, report.getTemplatePostFailureCount());
+    }
+}
diff --git a/main/src/test/java/org/onap/policy/api/main/rest/TestHttpsApiRestServer.java b/main/src/test/java/org/onap/policy/api/main/rest/TestHttpsApiRestServer.java
new file mode 100644 (file)
index 0000000..d080350
--- /dev/null
@@ -0,0 +1,135 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.api.main.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.Properties;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+
+import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
+import org.junit.Test;
+import org.onap.policy.api.main.exception.PolicyApiException;
+import org.onap.policy.api.main.startstop.Main;
+import org.onap.policy.common.endpoints.report.HealthCheckReport;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to perform unit test of https set on API REST server.
+ */
+public class TestHttpsApiRestServer {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(TestHttpsApiRestServer.class);
+    private static final String ALIVE = "alive";
+    private static final String SELF = "self";
+    private static final String NAME = "Policy API";
+    private static String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
+
+    @Test
+    public void testHttpsHealthCheckSuccess() {
+        final String reportString = "Report [name=Policy API, url=self, healthy=true, code=200, message=alive]";
+        try {
+            final Main main = startApiService();
+            final HealthCheckReport report = performHealthCheck();
+            validateReport(NAME, SELF, true, 200, ALIVE, reportString, report);
+            stopApiService(main);
+        } catch (final Exception exp) {
+            LOGGER.error("testHttpsHealthCheckSuccess failed", exp);
+            fail("Test should not throw an exception");
+        }
+    }
+
+    private Main startApiService() {
+        final Properties systemProps = System.getProperties();
+        systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
+        systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
+        System.setProperties(systemProps);
+
+        final String[] apiConfigParameters = { "-c", "parameters/ApiConfigParameters_Https.json" };
+        return new Main(apiConfigParameters);
+    }
+
+    private void stopApiService(final Main main) throws PolicyApiException {
+        main.shutdown();
+    }
+
+    private HealthCheckReport performHealthCheck() throws Exception {
+
+        final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
+
+            @Override
+            public X509Certificate[] getAcceptedIssuers() {
+                return new X509Certificate[0];
+            }
+
+            @Override
+            public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
+            }
+
+            @Override
+            public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
+            }
+        } };
+
+        final SSLContext sc = SSLContext.getInstance("TLSv1.2");
+        sc.init(null, noopTrustManager, new SecureRandom());
+        final ClientBuilder clientBuilder = 
+                ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host, session) -> true);
+        final Client client = clientBuilder.build();
+        final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
+        client.register(feature);
+
+        final WebTarget webTarget = client.target("https://localhost:6969/healthcheck");
+
+        final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
+        
+        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
+            throw new IllegalStateException("cannot connect to port 6969");
+        }
+        return invocationBuilder.get(HealthCheckReport.class);
+    }
+
+    private void validateReport(final String name, final String url, final boolean healthy, final int code,
+            final String message, final String reportString, final HealthCheckReport report) {
+        assertEquals(name, report.getName());
+        assertEquals(url, report.getUrl());
+        assertEquals(healthy, report.isHealthy());
+        assertEquals(code, report.getCode());
+        assertEquals(message, report.getMessage());
+        assertEquals(reportString, report.toString());
+    }
+}
diff --git a/main/src/test/java/org/onap/policy/api/main/rest/TestHttpsStatisticApiRestServer.java b/main/src/test/java/org/onap/policy/api/main/rest/TestHttpsStatisticApiRestServer.java
new file mode 100644 (file)
index 0000000..6b99244
--- /dev/null
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.api.main.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.Properties;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+
+import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
+import org.junit.Test;
+import org.onap.policy.api.main.exception.PolicyApiException;
+import org.onap.policy.api.main.startstop.Main;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to perform unit test of API statistics via https set on API REST server.
+ */
+public class TestHttpsStatisticApiRestServer {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(TestHttpsStatisticApiRestServer.class);
+    private static String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
+
+    @Test
+    public void testHttpsApiStatistic()
+        throws PolicyApiException, InterruptedException, KeyManagementException, NoSuchAlgorithmException {
+        final String reportString = "StatisticsReport [code=200, totalApiCallCount=0, apiCallSuccessCount=0, "
+            + "apiCallFailureCount=0, " + "totalPolicyGetCount=0, totalPolicyPostCount=0, " 
+            + "totalTemplateGetCount=0, totalTemplatePostCount=0, " 
+            + "policyGetSuccessCount=0, policyGetFailureCount=0, " 
+            + "policyPostSuccessCount=0, policyPostFailureCount=0, " 
+            + "templateGetSuccessCount=0, templateGetFailureCount=0, " 
+            + "templatePostSuccessCount=0, templatePostFailureCount=0]";
+        try {
+            final Main main = startApiService();
+            final StatisticsReport report = performStatisticCheck();
+            validateReport(200, 0, reportString, report);
+            stopApiService(main);
+        } catch (final Exception exp) {
+            LOGGER.error("testHttpsApiStatistic failed", exp);
+            fail("Test should not throw an exception");
+        }
+    }
+
+    private Main startApiService() {
+        final Properties systemProps = System.getProperties();
+        systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
+        systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
+        System.setProperties(systemProps);
+
+        final String[] apiConfigParameters = { "-c", "parameters/ApiConfigParameters_Https.json" };
+        return new Main(apiConfigParameters);
+    }
+
+    private void stopApiService(final Main main) throws PolicyApiException {
+        main.shutdown();
+    }
+
+    private StatisticsReport performStatisticCheck() throws Exception {
+
+        final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
+
+            @Override
+            public X509Certificate[] getAcceptedIssuers() {
+                return new X509Certificate[0];
+            }
+
+            @Override
+            public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
+            }
+
+            @Override
+            public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
+            }
+        } };
+
+        final SSLContext sc = SSLContext.getInstance("TLSv1.2");
+        sc.init(null, noopTrustManager, new SecureRandom());
+        final ClientBuilder clientBuilder = 
+                ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host, session) -> true);
+        final Client client = clientBuilder.build();
+        final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
+        client.register(feature);
+
+        final WebTarget webTarget = client.target("https://localhost:6969/statistics");
+
+        final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
+        
+        if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
+            throw new IllegalStateException("cannot connect to port 6969");
+        }
+        return invocationBuilder.get(StatisticsReport.class);
+    }
+
+    private void validateReport(final int code, final int count, 
+            final String reportString, final StatisticsReport report) {
+        assertEquals(code, report.getCode());
+        assertEquals(count, report.getTotalApiCallCount());
+        assertEquals(count, report.getApiCallSuccessCount());
+        assertEquals(count, report.getApiCallFailureCount());
+        assertEquals(count, report.getTotalPolicyGetCount());
+        assertEquals(count, report.getTotalPolicyPostCount());
+        assertEquals(count, report.getTotalTemplateGetCount());
+        assertEquals(count, report.getTotalTemplatePostCount());
+        assertEquals(count, report.getPolicyGetSuccessCount());
+        assertEquals(count, report.getPolicyGetFailureCount());
+        assertEquals(count, report.getPolicyPostSuccessCount());
+        assertEquals(count, report.getPolicyPostFailureCount());
+        assertEquals(count, report.getTemplateGetSuccessCount());
+        assertEquals(count, report.getTemplateGetFailureCount());
+        assertEquals(count, report.getTemplatePostSuccessCount());
+        assertEquals(count, report.getTemplatePostFailureCount());
+        assertEquals(reportString, report.toString());
+    }
+}
diff --git a/main/src/test/java/org/onap/policy/api/main/rest/TestStatisticsReport.java b/main/src/test/java/org/onap/policy/api/main/rest/TestStatisticsReport.java
new file mode 100644 (file)
index 0000000..75b89c1
--- /dev/null
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy API 
+ * ================================================================================ 
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.api.main.rest;
+
+import com.openpojo.reflection.filters.FilterClassName;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+
+import org.junit.Test;
+import org.onap.policy.common.utils.validation.ToStringTester;
+
+/**
+ * Class to perform unit testing of {@link StatisticsReport}.
+ */
+public class TestStatisticsReport {
+
+    @Test
+    public void testStatisticsReport() {
+        final Validator validator = ValidatorBuilder.create().with(new ToStringTester()).with(new SetterMustExistRule())
+                .with(new SetterTester()).with(new GetterTester()).build();
+        validator.validate(StatisticsReport.class.getPackage().getName(),
+                new FilterClassName(StatisticsReport.class.getName()));
+    }
+}
index e5ab810..01cd77c 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,7 +25,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
-import org.onap.policy.api.main.PolicyApiException;
+import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.parameters.ApiParameterGroup;
 import org.onap.policy.api.main.parameters.ApiParameterHandler;
 import org.onap.policy.api.main.parameters.CommonTestData;
@@ -38,14 +39,9 @@ public class TestApiActivator {
 
     @Test
     public void testApiActivator() throws PolicyApiException {
-        final String[] apiConfigParameters =
-        { "-c", "parameters/ApiConfigParameters.json" };
-
-        final ApiCommandLineArguments arguments =
-                new ApiCommandLineArguments(apiConfigParameters);
-
+        final String[] apiConfigParameters = { "-c", "parameters/ApiConfigParameters.json" };
+        final ApiCommandLineArguments arguments = new ApiCommandLineArguments(apiConfigParameters);
         final ApiParameterGroup parGroup = new ApiParameterHandler().getParameters(arguments);
-
         final ApiActivator activator = new ApiActivator(parGroup);
         activator.initialize();
         assertTrue(activator.getParameterGroup().isValid());
index 4772534..2f68e85 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,7 +25,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
-import org.onap.policy.api.main.PolicyApiException;
+import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.parameters.CommonTestData;
 
 /**
@@ -35,8 +36,7 @@ public class TestMain {
 
     @Test
     public void testMain() throws PolicyApiException {
-        final String[] apiConfigParameters =
-        { "-c", "parameters/ApiConfigParameters.json" };
+        final String[] apiConfigParameters = { "-c", "parameters/ApiConfigParameters.json" };
         final Main main = new Main(apiConfigParameters);
         assertTrue(main.getParameters().isValid());
         assertEquals(CommonTestData.API_GROUP_NAME, main.getParameters().getName());
@@ -45,31 +45,27 @@ public class TestMain {
 
     @Test
     public void testMain_NoArguments() {
-        final String[] apiConfigParameters =
-        {};
+        final String[] apiConfigParameters = {};
         final Main main = new Main(apiConfigParameters);
         assertTrue(main.getParameters() == null);
     }
 
     @Test
     public void testMain_InvalidArguments() {
-        final String[] apiConfigParameters =
-        { "parameters/ApiConfigParameters.json" };
+        final String[] apiConfigParameters = { "parameters/ApiConfigParameters.json" };
         final Main main = new Main(apiConfigParameters);
         assertTrue(main.getParameters() == null);
     }
 
     @Test
     public void testMain_Help() {
-        final String[] apiConfigParameters =
-        { "-h" };
+        final String[] apiConfigParameters = { "-h" };
         Main.main(apiConfigParameters);
     }
 
     @Test
     public void testMain_InvalidParameters() {
-        final String[] apiConfigParameters =
-        { "-c", "parameters/ApiConfigParameters_InvalidName.json" };
+        final String[] apiConfigParameters = { "-c", "parameters/ApiConfigParameters_InvalidName.json" };
         final Main main = new Main(apiConfigParameters);
         assertTrue(main.getParameters() == null);
     }
diff --git a/main/src/test/resources/parameters/ApiConfigParameters_Https.json b/main/src/test/resources/parameters/ApiConfigParameters_Https.json
new file mode 100644 (file)
index 0000000..ec73213
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "name":"ApiGroup",
+    "restServerParameters":{
+        "host":"0.0.0.0",
+        "port":6969,
+        "userName":"healthcheck",
+        "password":"zb!XztG34",
+        "https":true
+    }
+}
diff --git a/main/src/test/resources/ssl/policy-keystore b/main/src/test/resources/ssl/policy-keystore
new file mode 100644 (file)
index 0000000..7d2b1ec
Binary files /dev/null and b/main/src/test/resources/ssl/policy-keystore differ
diff --git a/packages/policy-api-docker/pom.xml b/packages/policy-api-docker/pom.xml
new file mode 100644 (file)
index 0000000..e918513
--- /dev/null
@@ -0,0 +1,176 @@
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.policy.api</groupId>
+        <artifactId>packages</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+
+    <packaging>pom</packaging>
+    <artifactId>policy-api-docker</artifactId>
+    <name>Policy api docker image</name>
+    <description>Policy api docker image</description>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <dist.project.version>${project.version}</dist.project.version>
+        <docker.skip>false</docker.skip>
+        <docker.skip.build>false</docker.skip.build>
+        <docker.skip.push>false</docker.skip.push>
+        <docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
+        <docker.push.registry>nexus3.onap.org:10003</docker.push.registry>
+        <maven.build.timestamp.format>yyyyMMdd'T'HHmm</maven.build.timestamp.format>
+    </properties>
+
+    <build>
+        <finalName>${project.artifactId}-${project.version}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.groovy.maven</groupId>
+                <artifactId>gmaven-plugin</artifactId>
+                <version>1.0</version>
+                <executions>
+                    <execution>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>execute</goal>
+                        </goals>
+                        <configuration>
+                            <source>
+                                println 'Project version: ' + project.properties['dist.project.version'];
+                                def versionArray;
+                                if ( project.properties['dist.project.version'] != null ) {
+                                    versionArray = project.properties['dist.project.version'].split('-');
+                                }
+
+                                if ( project.properties['dist.project.version'].endsWith("-SNAPSHOT") ) {
+                                    project.properties['project.docker.latesttag.version']=versionArray[0] + "-SNAPSHOT-latest";
+                                } else {
+                                    project.properties['project.docker.latesttag.version']=versionArray[0] + "-STAGING-latest";
+                                }
+
+                                println 'New tag for docker: ' + project.properties['project.docker.latesttag.version'];
+                            </source>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>io.fabric8</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <version>0.19.1</version>
+
+                <configuration>
+                    <verbose>true</verbose>
+                    <apiVersion>1.23</apiVersion>
+                    <pullRegistry>${docker.pull.registry}</pullRegistry>
+                    <pushRegistry>${docker.push.registry}</pushRegistry>
+
+                    <images>
+                        <image>
+                            <name>onap/policy-api</name>
+                            <build>
+                                <cleanup>try</cleanup>
+                                <dockerFile>Dockerfile</dockerFile>
+                                <tags>
+                                    <tag>${project.version}</tag>
+                                    <tag>${project.version}-${maven.build.timestamp}</tag>
+                                    <tag>${project.docker.latesttag.version}</tag>
+                                </tags>
+                                <assembly>
+                                    <inline>
+                                        <dependencySets>
+                                            <dependencySet>
+                                                <includes>
+                                                    <include>org.onap.policy.api:policy-api-tarball</include>
+                                                </includes>
+                                                <outputDirectory>/lib</outputDirectory>
+                                                <outputFileNameMapping>policy-api.tar.gz</outputFileNameMapping>
+                                            </dependencySet>
+                                        </dependencySets>
+                                    </inline>
+                                </assembly>
+                            </build>
+                        </image>
+                    </images>
+                </configuration>
+
+                <executions>
+                    <execution>
+                        <id>clean-images</id>
+                        <phase>pre-clean</phase>
+                        <goals>
+                            <goal>remove</goal>
+                        </goals>
+                        <configuration>
+                            <removeAll>true</removeAll>
+                        </configuration>
+                    </execution>
+
+                    <execution>
+                        <id>generate-images</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>build</goal>
+                        </goals>
+                    </execution>
+
+                    <execution>
+                        <id>push-images</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>build</goal>
+                            <goal>push</goal>
+                        </goals>
+                        <configuration>
+                            <image>onap/policy-api</image>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.policy.api</groupId>
+            <artifactId>policy-api-tarball</artifactId>
+            <version>${project.version}</version>
+            <classifier>tarball</classifier>
+            <type>tar.gz</type>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/packages/policy-api-docker/src/main/docker/Dockerfile b/packages/policy-api-docker/src/main/docker/Dockerfile
new file mode 100644 (file)
index 0000000..0d4b3b9
--- /dev/null
@@ -0,0 +1,46 @@
+FROM ubuntu:14.04
+
+ARG HTTP_PROXY=${HTTP_PROXY}
+ARG HTTPS_PROXY=${HTTPS_PROXY}
+ARG BUILD_VERSION=${BUILD_VERSION}
+ARG POLICY_LOGS=/var/log/onap/policy/api
+
+ENV http_proxy $HTTP_PROXY
+ENV https_proxy $HTTPS_PROXY
+ENV BUILD_VERSION ${BUILD_VERSION}
+ENV POLICY_LOGS ${POLICY_LOGS}
+
+ENV POLICY_HOME=/opt/app/policy
+ENV POLICY_API_HOME=${POLICY_HOME}/api
+
+RUN \
+        apt-get clean && \
+        apt-get update && \
+        apt-get install -y zip unzip curl wget ssh telnet maven && \
+        apt-get install -y software-properties-common && \
+        apt-get install -y jq httpie && \
+        apt-get install -y python-pip && \
+        add-apt-repository ppa:openjdk-r/ppa && \
+        apt-get clean && \
+        apt-get update && \
+        apt-get install -y openjdk-8-jdk
+
+RUN groupadd policy 
+RUN useradd --create-home --shell /bin/bash -g policy policy
+
+RUN mkdir -p ${POLICY_API_HOME} ${POLICY_LOGS} ${POLICY_HOME}/etc/ssl ${POLICY_API_HOME}/bin && \
+    chown  -R policy:policy ${POLICY_HOME} ${POLICY_API_HOME} ${POLICY_LOGS}
+
+RUN mkdir /packages
+COPY /maven/* /packages
+RUN tar xvfz /packages/policy-api.tar.gz --directory ${POLICY_API_HOME}
+RUN rm /packages/policy-api.tar.gz
+
+WORKDIR ${POLICY_API_HOME}
+COPY policy-api.sh  bin/.
+RUN chown -R policy:policy * && chmod +x bin/*.sh
+RUN cp ${POLICY_API_HOME}/etc/ssl/* ${POLICY_HOME}/etc/ssl && chown policy:policy ${POLICY_HOME}/etc/ssl/*
+
+USER policy
+WORKDIR ${POLICY_API_HOME}/bin
+ENTRYPOINT [ "bash", "./policy-api.sh" ]
diff --git a/packages/policy-api-docker/src/main/docker/policy-api.sh b/packages/policy-api-docker/src/main/docker/policy-api.sh
new file mode 100644 (file)
index 0000000..21d8326
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+#  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+#
+
+JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
+POLICY_API_HOME=/opt/app/policy/api
+KEYSTORE="${POLICY_HOME}/etc/ssl/policy-keystore"
+KEYSTORE_PASSWD="Pol1cy_0nap"
+TRUSTSTORE="${POLICY_HOME}/etc/ssl/policy-truststore"
+TRUSTSTORE_PASSWD="Pol1cy_0nap"
+
+
+if [ "$#" -eq 1 ]; then
+    CONFIG_FILE=$1
+else
+    CONFIG_FILE=${CONFIG_FILE}
+fi
+
+if [ -z "$CONFIG_FILE" ]
+  then
+    CONFIG_FILE="$POLICY_API_HOME/etc/defaultConfig.json"
+fi
+
+echo "Policy api config file: $CONFIG_FILE"
+
+$JAVA_HOME/bin/java -cp "$POLICY_API_HOME/etc:$POLICY_API_HOME/lib/*" -Djavax.net.ssl.keyStore="$KEYSTORE" -Djavax.net.ssl.keyStorePassword="$KEYSTORE_PASSWD" -Djavax.net.ssl.trustStore="$TRUSTSTORE" -Djavax.net.ssl.trustStorePassword="$TRUSTSTORE_PASSWD" org.onap.policy.api.main.startstop.Main -c $CONFIG_FILE
diff --git a/packages/policy-api-tarball/pom.xml b/packages/policy-api-tarball/pom.xml
new file mode 100644 (file)
index 0000000..cdb68c2
--- /dev/null
@@ -0,0 +1,65 @@
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.policy.api</groupId>
+        <artifactId>packages</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>policy-api-tarball</artifactId>
+    <name>${project.artifactId}</name>
+    <description>[${project.parent.artifactId}]</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.policy.api</groupId>
+            <artifactId>main</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate-complete-tar</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/package/tarball/assembly.xml</descriptor>
+                            </descriptors>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/packages/policy-api-tarball/src/main/package/tarball/assembly.xml b/packages/policy-api-tarball/src/main/package/tarball/assembly.xml
new file mode 100644 (file)
index 0000000..e08be24
--- /dev/null
@@ -0,0 +1,62 @@
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<assembly>
+    <id>tarball</id>
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <dependencySets>
+        <dependencySet>
+            <useProjectArtifact>true</useProjectArtifact>
+            <outputDirectory>/lib</outputDirectory>
+            <unpack>false</unpack>
+            <scope>runtime</scope>
+            <includes>
+                <include>*:jar</include>
+            </includes>
+        </dependencySet>
+    </dependencySets>
+    <fileSets>
+        <fileSet>
+            <directory>${project.basedir}/src/main/resources/etc
+            </directory>
+            <includes>
+                <include>*.json</include>
+                <include>*.xml</include>
+            </includes>
+            <outputDirectory>/etc</outputDirectory>
+            <lineEnding>unix</lineEnding>
+            <excludes>
+                <exclude>*.formatted</exclude>
+            </excludes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.basedir}/src/main/resources/etc/ssl
+            </directory>
+            <includes>
+                <include>policy*</include>
+            </includes>
+            <outputDirectory>/etc/ssl</outputDirectory>
+            <lineEnding>keep</lineEnding>
+        </fileSet>
+    </fileSets>
+</assembly>
diff --git a/packages/policy-api-tarball/src/main/resources/etc/defaultConfig.json b/packages/policy-api-tarball/src/main/resources/etc/defaultConfig.json
new file mode 100644 (file)
index 0000000..f7aaf39
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "name": "ApiGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": true,
+        "aaf": false 
+    }
+}
diff --git a/packages/policy-api-tarball/src/main/resources/etc/logback.xml b/packages/policy-api-tarball/src/main/resources/etc/logback.xml
new file mode 100644 (file)
index 0000000..234695e
--- /dev/null
@@ -0,0 +1,166 @@
+<!--
+  ============LICENSE_START=======================================================
+  policy-api
+  ================================================================================
+  Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+
+<configuration scan="true" scanPeriod="30 seconds" debug="false">
+
+    <property name="logDir" value="${POLICY_LOGS}" />
+
+    <property name="errorLog" value="error" />
+    <property name="debugLog" value="debug" />
+    <property name="networkLog" value="network" />
+
+    <property name="metricLog" value="metric" />
+    <property name="transactionLog" value="audit" />
+
+    <property name="debugPattern"
+        value="[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n" />
+    <property name="errorPattern" value="${debugPattern}" />
+    <property name="networkPattern"
+        value="[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%t]%m%n" />
+
+    <property name="metricPattern"
+        value="%X{RequestID}|%X{InvocationID}|%X{ServiceName}|%X{PartnerName}|%X{BeginTimestamp}|%X{EndTimestamp}|%X{ElapsedTime}|%X{ServiceInstanceID}|%X{VirtualServerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%X{Severity}|%X{TargetEntity}|%X{TargetServiceName}|%X{Server}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ProcessKey}|%X{RemoteHost}|%X{AlertSeverity}|%X{TargetVirtualEntity}|%level|%thread| %msg%n" />
+    <property name="transactionPattern" value="${metricPattern}" />
+
+    <appender name="ErrorOut"
+        class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${logDir}/${errorLog}.log</file>
+        <rollingPolicy
+            class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip
+            </fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+        </rollingPolicy>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>WARN</level>
+        </filter>
+        <encoder>
+            <pattern>${errorPattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="AsyncErrorOut"
+        class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="ErrorOut" />
+    </appender>
+
+    <appender name="DebugOut"
+        class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${logDir}/${debugLog}.log</file>
+        <rollingPolicy
+            class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip
+            </fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${debugPattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="AsyncDebugOut"
+        class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="DebugOut" />
+    </appender>
+
+    <appender name="NetworkOut"
+        class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${logDir}/${networkLog}.log</file>
+        <rollingPolicy
+            class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip
+            </fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${networkPattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="AsyncNetworkOut"
+        class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="NetworkOut" />
+    </appender>
+
+    <appender name="MetricOut"
+        class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${logDir}/${metricLog}.log</file>
+        <rollingPolicy
+            class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${logDir}/${metricLog}.%d{yyyy-MM-dd}.%i.log.zip
+            </fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${metricPattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="AsyncMetricOut"
+        class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="MetricOut" />
+    </appender>
+
+    <appender name="TransactionOut"
+        class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${logDir}/${transactionLog}.log</file>
+        <rollingPolicy
+            class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${logDir}/${transactionLog}.%d{yyyy-MM-dd}.%i.log.zip
+            </fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${transactionPattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="AsyncTransactionOut"
+        class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="TransactionOut" />
+    </appender>
+
+    <logger name="network" level="INFO" additivity="false">
+        <appender-ref ref="AsyncNetworkOut" />
+    </logger>
+
+    <logger name="org.eclipse.jetty.server.RequestLog" level="info"
+        additivity="false">
+        <appender-ref ref="AsyncNetworkOut" />
+    </logger>
+
+    <root level="INFO">
+        <appender-ref ref="AsyncDebugOut" />
+        <appender-ref ref="AsyncErrorOut" />
+        <appender-ref ref="AsyncMetricOut" />
+        <appender-ref ref="AsyncTransactionOut" />
+    </root>
+
+</configuration>
diff --git a/packages/policy-api-tarball/src/main/resources/etc/s3pConfig.json b/packages/policy-api-tarball/src/main/resources/etc/s3pConfig.json
new file mode 100644 (file)
index 0000000..6df43f7
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "name": "ApiGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": true,
+        "aaf": false 
+    }
+}
\ No newline at end of file
diff --git a/packages/policy-api-tarball/src/main/resources/etc/ssl/policy-keystore b/packages/policy-api-tarball/src/main/resources/etc/ssl/policy-keystore
new file mode 100644 (file)
index 0000000..7d2b1ec
Binary files /dev/null and b/packages/policy-api-tarball/src/main/resources/etc/ssl/policy-keystore differ
diff --git a/packages/policy-api-tarball/src/main/resources/etc/ssl/policy-truststore b/packages/policy-api-tarball/src/main/resources/etc/ssl/policy-truststore
new file mode 100644 (file)
index 0000000..8834ac2
Binary files /dev/null and b/packages/policy-api-tarball/src/main/resources/etc/ssl/policy-truststore differ
diff --git a/packages/pom.xml b/packages/pom.xml
new file mode 100644 (file)
index 0000000..8efc1cc
--- /dev/null
@@ -0,0 +1,52 @@
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.policy.api</groupId>
+        <artifactId>policy-api</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>packages</artifactId>
+    <packaging>pom</packaging>
+    <name>Policy api packages</name>
+
+
+    <profiles>
+        <profile>
+            <id>default</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>docker</id>
+            <modules>
+                <module>policy-api-tarball</module>
+                <module>policy-api-docker</module>
+            </modules>
+            <properties>
+                <docker.skip.push>false</docker.skip.push>
+            </properties>
+        </profile>
+    </profiles>
+</project>
diff --git a/pom.xml b/pom.xml
index 791c363..671df21 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -2,8 +2,8 @@
   ============LICENSE_START=======================================================
   ONAP Policy API
   ================================================================================
-  Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
-  Modified Copyright (C) 2018 Samsung Electronics Co., Ltd.
+  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+  Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
   ================================================================================
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
         <sonar.jacoco.itReportPath>${project.basedir}/../target/code-coverage/jacoco-it.exec</sonar.jacoco.itReportPath>
         <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
 
-        <policy.common.version>1.3.1</policy.common.version>
+        <policy.common.version>1.4.0-SNAPSHOT</policy.common.version>
     </properties>
 
     <modules>
         <module>main</module>
+        <module>packages</module>
     </modules>
 
     <dependencies>
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-ext</artifactId>
-            <version>1.8.0-beta2</version>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
+        <dependency>    
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>policy-endpoints</artifactId>
+            <version>${policy.common.version}</version>
         </dependency>
     </dependencies>