http server/client management

This is to support the new actor architecture configuration.

Issue-ID: POLICY-1625
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Change-Id: Ieda56be38b8572d75a5fbb3775067ab537310aa1
diff --git a/policy-management/src/main/java/org/onap/policy/drools/persistence/FileSystemPersistence.java b/policy-management/src/main/java/org/onap/policy/drools/persistence/FileSystemPersistence.java
index ca1ad37..1347eb6 100644
--- a/policy-management/src/main/java/org/onap/policy/drools/persistence/FileSystemPersistence.java
+++ b/policy-management/src/main/java/org/onap/policy/drools/persistence/FileSystemPersistence.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -71,27 +71,23 @@
     public static final String TOPIC_SUFFIX_IDENTIFIER = "-topic";
 
     /**
-     * Policy controller properties file suffix.
+     * Topic properties file suffix.
      */
     public static final String PROPERTIES_FILE_TOPIC_SUFFIX = TOPIC_SUFFIX_IDENTIFIER + PROPERTIES_FILE_EXTENSION;
 
     /**
-     * Policy topic properties file suffix.
-     */
-    public static final String PROPERTIES_FILE_TOPIC_BACKUP_SUFFIX =
-        TOPIC_SUFFIX_IDENTIFIER + PROPERTIES_FILE_EXTENSION + ".bak";
-
-    /**
-     * Policy controller properties file suffix.
-     */
-    public static final String PROPERTIES_FILE_CONTROLLER_BACKUP_SUFFIX =
-            CONTROLLER_SUFFIX_IDENTIFIER + PROPERTIES_FILE_EXTENSION + ".bak";
-
-    /**
      * Policy engine properties file name.
      */
     public static final String PROPERTIES_FILE_ENGINE = "engine" + PROPERTIES_FILE_EXTENSION;
 
+    public static final String HTTP_SERVER_SUFFIX_IDENTIFIER = "-http-server";
+    public static final String PROPERTIES_FILE_HTTP_SERVER_SUFFIX =
+            HTTP_SERVER_SUFFIX_IDENTIFIER + PROPERTIES_FILE_EXTENSION;
+
+    public static final String HTTP_CLIENT_SUFFIX_IDENTIFIER = "-http-client";
+    public static final String PROPERTIES_FILE_HTTP_CLIENT_SUFFIX =
+            HTTP_CLIENT_SUFFIX_IDENTIFIER + PROPERTIES_FILE_EXTENSION;
+
     /**
      * Installation environment suffix for files.
      */
@@ -260,6 +256,26 @@
         return getPropertiesList(PROPERTIES_FILE_TOPIC_SUFFIX);
     }
 
+    @Override
+    public Properties getHttpServerProperties(String serverName) {
+        return this.getProperties(serverName + HTTP_SERVER_SUFFIX_IDENTIFIER);
+    }
+
+    @Override
+    public List<Properties> getHttpServerProperties() {
+        return getPropertiesList(PROPERTIES_FILE_HTTP_SERVER_SUFFIX);
+    }
+
+    @Override
+    public Properties getHttpClientProperties(String clientName) {
+        return this.getProperties(clientName + HTTP_CLIENT_SUFFIX_IDENTIFIER);
+    }
+
+    @Override
+    public List<Properties> getHttpClientProperties() {
+        return getPropertiesList(PROPERTIES_FILE_HTTP_CLIENT_SUFFIX);
+    }
+
     private boolean testControllerName(String controllerFilename, Properties controllerProperties) {
         String controllerName = controllerFilename
                 .substring(0, controllerFilename.length() - PROPERTIES_FILE_CONTROLLER_SUFFIX.length());
@@ -285,6 +301,16 @@
         return backup(topicName, PROPERTIES_FILE_TOPIC_SUFFIX);
     }
 
+    @Override
+    public boolean backupHttpServer(String serverName) {
+        return backup(serverName, PROPERTIES_FILE_HTTP_SERVER_SUFFIX);
+    }
+
+    @Override
+    public boolean backupHttpClient(String clientName) {
+        return backup(clientName, PROPERTIES_FILE_HTTP_CLIENT_SUFFIX);
+    }
+
     protected boolean backup(String name, String fileSuffix) {
         Path path = Paths.get(this.configurationDirectory.toString(), name + fileSuffix);
         if (Files.exists(path)) {
@@ -313,6 +339,18 @@
         return store(topicName, (Properties) configuration, PROPERTIES_FILE_TOPIC_SUFFIX);
     }
 
+    @Override
+    public boolean storeHttpServer(String serverName, Object configuration) {
+        checkPropertiesParam(configuration);
+        return store(serverName, (Properties) configuration, PROPERTIES_FILE_HTTP_SERVER_SUFFIX);
+    }
+
+    @Override
+    public boolean storeHttpClient(String clientName, Object configuration) {
+        checkPropertiesParam(configuration);
+        return store(clientName, (Properties) configuration, PROPERTIES_FILE_HTTP_CLIENT_SUFFIX);
+    }
+
     private boolean store(String name, Properties properties, String fileSuffix) {
         Path path = Paths.get(this.configurationDirectory.toString(), name + fileSuffix);
         if (Files.exists(path)) {
@@ -360,6 +398,16 @@
         return delete(topicName, PROPERTIES_FILE_TOPIC_SUFFIX);
     }
 
+    @Override
+    public boolean deleteHttpServer(String serverName) {
+        return delete(serverName, PROPERTIES_FILE_HTTP_SERVER_SUFFIX);
+    }
+
+    @Override
+    public boolean deleteHttpClient(String clientName) {
+        return delete(clientName, PROPERTIES_FILE_HTTP_CLIENT_SUFFIX);
+    }
+
     protected boolean delete(String name, String fileSuffix) {
         Path path = Paths.get(this.configurationDirectory.toString(), name + fileSuffix);
 
diff --git a/policy-management/src/main/java/org/onap/policy/drools/persistence/SystemPersistence.java b/policy-management/src/main/java/org/onap/policy/drools/persistence/SystemPersistence.java
index d5a35c3..b5fc88e 100644
--- a/policy-management/src/main/java/org/onap/policy/drools/persistence/SystemPersistence.java
+++ b/policy-management/src/main/java/org/onap/policy/drools/persistence/SystemPersistence.java
@@ -1,8 +1,8 @@
 /*
  * ============LICENSE_START=======================================================
- * policy-management
+ * ONAP
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -65,12 +65,28 @@
     boolean backupTopic(String topicName);
 
     /**
+     * backs up an http server configuration.
+     *
+     * @param serverName the HTTP server name
+     * @return true if the configuration is backed up
+     */
+    boolean backupHttpServer(String serverName);
+
+    /**
+     * backs up an http client configuration.
+     *
+     * @param clientName the HTTP client name
+     * @return true if the configuration is backed up
+     */
+    boolean backupHttpClient(String clientName);
+
+    /**
      * persists controller configuration.
      *
      * @param controllerName the controller name
      * @param configuration object containing the configuration
      *
-     * @return true if storage is succesful, false otherwise
+     * @return true if storage is successful, false otherwise
      * @throws IllegalArgumentException if the configuration cannot be handled by the persistence
      *         manager
      */
@@ -82,17 +98,41 @@
      * @param topicName the controller name
      * @param configuration object containing the configuration
      *
-     * @return true if storage is succesful, false otherwise
+     * @return true if storage is successful, false otherwise
      * @throws IllegalArgumentException if the configuration cannot be handled by the persistence
      *         manager
      */
     boolean storeTopic(String topicName, Object configuration);
 
     /**
+     * persists http server configuration.
+     *
+     * @param serverName the server name
+     * @param configuration object containing the configuration
+     *
+     * @return true if storage is successful, false otherwise
+     * @throws IllegalArgumentException if the configuration cannot be handled by the persistence
+     *         manager
+     */
+    boolean storeHttpServer(String serverName, Object configuration);
+
+    /**
+     * persists http client configuration.
+     *
+     * @param clientName the client name
+     * @param configuration object containing the configuration
+     *
+     * @return true if storage is successful, false otherwise
+     * @throws IllegalArgumentException if the configuration cannot be handled by the persistence
+     *         manager
+     */
+    boolean storeHttpClient(String clientName, Object configuration);
+
+    /**
      * delete controller configuration.
      *
      * @param controllerName the controller name
-     * @return true if storage is succesful, false otherwise
+     * @return true if storage is successful, false otherwise
      */
     boolean deleteController(String controllerName);
 
@@ -100,11 +140,27 @@
      * delete topic configuration.
      *
      * @param topicName the topic name
-     * @return true if storage is succesful, false otherwise
+     * @return true if storage is successful, false otherwise
      */
     boolean deleteTopic(String topicName);
 
     /**
+     * deletes an http server configuration.
+     *
+     * @param serverName the HTTP server name
+     * @return true if storage is successful, false otherwise
+     */
+    boolean deleteHttpServer(String serverName);
+
+    /**
+     * deletes an http client configuration.
+     *
+     * @param clientName the HTTP client name
+     * @return true if storage is successful, false otherwise
+     */
+    boolean deleteHttpClient(String clientName);
+
+    /**
      * get controllers configuration.
      *
      * @return list of controllers properties
@@ -140,6 +196,40 @@
     Properties getTopicProperties(String topicName);
 
     /**
+     * get HTTP Servers configuration.
+     *
+     * @return list of HTTP server properties
+     */
+    List<Properties> getHttpServerProperties();
+
+    /**
+     * get HTTP Server properties.
+     *
+     * @param serverName name
+     * @return properties for this server
+     *
+     * @throws IllegalArgumentException if topicName is invalid
+     */
+    Properties getHttpServerProperties(String serverName);
+
+    /**
+     * get HTTP Client configuration.
+     *
+     * @return list of HTTP client properties
+     */
+    List<Properties> getHttpClientProperties();
+
+    /**
+     * get HTTP Client properties.
+     *
+     * @param clientName name
+     * @return properties for this client
+     *
+     * @throws IllegalArgumentException if topicName is invalid
+     */
+    Properties getHttpClientProperties(String clientName);
+
+    /**
      * get environments.
      *
      */
diff --git a/policy-management/src/main/java/org/onap/policy/drools/system/Main.java b/policy-management/src/main/java/org/onap/policy/drools/system/Main.java
index da4e154..ea687e0 100644
--- a/policy-management/src/main/java/org/onap/policy/drools/system/Main.java
+++ b/policy-management/src/main/java/org/onap/policy/drools/system/Main.java
@@ -23,7 +23,11 @@
 import java.util.Properties;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
+import org.onap.policy.common.endpoints.http.client.HttpClientConfigException;
+import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
+import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance;
 import org.onap.policy.common.utils.security.CryptoUtils;
+import org.onap.policy.drools.persistence.SystemPersistence;
 import org.onap.policy.drools.persistence.SystemPersistenceConstants;
 import org.onap.policy.drools.properties.DroolsPropertyConstants;
 import org.onap.policy.drools.utils.PropertyUtil;
@@ -87,12 +91,28 @@
             PolicyEngineConstants.getManager().setEnvironment(env);
         }
 
-        /* 2. Add topics */
+        /* 2.a Add topics */
 
         for (Properties topicProperties : SystemPersistenceConstants.getManager().getTopicProperties()) {
             TopicEndpointManager.getManager().addTopics(topicProperties);
         }
 
+        /* 2.b Add HTTP Servers */
+
+        for (Properties serverProperties : SystemPersistenceConstants.getManager().getHttpServerProperties()) {
+            HttpServletServerFactoryInstance.getServerFactory().build(serverProperties);
+        }
+
+        /* 2.c Add HTTP Clients */
+
+        for (Properties clientProperties : SystemPersistenceConstants.getManager().getHttpClientProperties()) {
+            try {
+                HttpClientFactoryInstance.getClientFactory().build(clientProperties);
+            } catch (HttpClientConfigException e) {
+                logger.warn("Main: http client properties errors found.  Using default configuration.", e);
+            }
+        }
+
         /* 3. Start the Engine with the basic services only (no Policy Controllers) */
 
         MdcTransaction trans =
diff --git a/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngineManager.java b/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngineManager.java
index 0edb06f..95ee88c 100644
--- a/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngineManager.java
+++ b/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngineManager.java
@@ -36,6 +36,7 @@
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -47,6 +48,9 @@
 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 import org.onap.policy.common.endpoints.event.comm.TopicSource;
+import org.onap.policy.common.endpoints.http.client.HttpClient;
+import org.onap.policy.common.endpoints.http.client.HttpClientFactory;
+import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
 import org.onap.policy.common.endpoints.http.server.HttpServletServerFactory;
 import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance;
@@ -588,12 +592,21 @@
             success.set(false);
         }
 
-        /* Start Policy Engine exclusively-owned (unmanaged) http servers */
+        /* Start managed and unmanaged http servers */
 
-        attempt(success, this.httpServers,
+        attempt(success,
+            Stream.concat(getServletFactory().inventory().stream(), this.httpServers.stream())
+                .collect(Collectors.toList()),
             httpServer -> httpServer.waitedStart(10 * 1000L),
-            (item, ex) -> logger.error("{}: cannot start http-server {} because of {}",
-                            this, item, ex.getMessage(), ex));
+            (item, ex) -> logger.error("{}: cannot start http-server {} because of {}", this, item,
+                ex.getMessage(), ex));
+
+        /* Start managed Http Clients */
+
+        attempt(success, getHttpClientFactory().inventory(),
+            HttpClient::start,
+            (item, ex) -> logger.error("{}: cannot start http-client {} because of {}",
+                this, item, ex.getMessage(), ex));
 
         /* Start Policy Controllers */
 
@@ -615,7 +628,6 @@
             logger.warn("{}: Topic Endpoint Manager is in an invalid state because of {}", this, e.getMessage(), e);
         }
 
-
         // Start the JMX listener
 
         startPdpJmxListener();
@@ -722,11 +734,20 @@
             success.set(false);
         }
 
-        /* stop all unmanaged http servers */
-        attempt(success, this.httpServers,
+        /* stop all managed and unmanaged http servers */
+        attempt(success,
+            Stream.concat(getServletFactory().inventory().stream(), this.httpServers.stream())
+                    .collect(Collectors.toList()),
             HttpServletServer::stop,
             (item, ex) -> logger.error("{}: cannot stop http-server {} because of {}", this, item,
-                            ex.getMessage(), ex));
+                ex.getMessage(), ex));
+
+        /* stop all managed http clients */
+        attempt(success,
+            getHttpClientFactory().inventory(),
+            HttpClient::stop,
+            (item, ex) -> logger.error("{}: cannot stop http-client {} because of {}", this, item,
+                ex.getMessage(), ex));
 
         try {
             success.compareAndSet(true, this.lockManager.stop());
@@ -783,6 +804,7 @@
         getControllerFactory().shutdown();
         getTopicEndpointManager().shutdown();
         getServletFactory().destroy();
+        getHttpClientFactory().destroy();
 
         try {
             this.lockManager.shutdown();
@@ -1341,6 +1363,10 @@
         return HttpServletServerFactoryInstance.getServerFactory();
     }
 
+    protected HttpClientFactory getHttpClientFactory() {
+        return HttpClientFactoryInstance.getClientFactory();
+    }
+
     protected PolicyControllerFactory getControllerFactory() {
         return PolicyControllerConstants.getFactory();
     }
diff --git a/policy-management/src/test/java/org/onap/policy/drools/persistence/SystemPersistenceTest.java b/policy-management/src/test/java/org/onap/policy/drools/persistence/SystemPersistenceTest.java
index 8cd4ee6..15a0b18 100644
--- a/policy-management/src/test/java/org/onap/policy/drools/persistence/SystemPersistenceTest.java
+++ b/policy-management/src/test/java/org/onap/policy/drools/persistence/SystemPersistenceTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -54,12 +54,23 @@
      */
     private static final String TEST_CONTROLLER_NAME = "foo";
 
+
     /**
      * Test JUnit Topic Name.
      */
     private static final String TEST_TOPIC_NAME = TEST_CONTROLLER_NAME;
 
     /**
+     * Test JUnit HTTP Server Name.
+     */
+    private static final String TEST_HTTP_SERVER_NAME = TEST_CONTROLLER_NAME;
+
+    /**
+     * Test JUnit HTTP Client Name.
+     */
+    private static final String TEST_HTTP_CLIENT_NAME = TEST_CONTROLLER_NAME;
+
+    /**
      * Test JUnit Controller File.
      */
     private static final String TEST_CONTROLLER_FILE = TEST_CONTROLLER_NAME + "-controller.properties";
@@ -80,6 +91,28 @@
     private static final String TEST_TOPIC_FILE_BAK = TEST_TOPIC_FILE + ".bak";
 
     /**
+     * Test JUnit Http Server File.
+     */
+    private static final String TEST_HTTP_SERVER_FILE = TEST_CONTROLLER_NAME
+                            + FileSystemPersistence.PROPERTIES_FILE_HTTP_SERVER_SUFFIX;
+
+    /**
+     * Test JUnit Backup Http Server File.
+     */
+    private static final String TEST_HTTP_SERVER_FILE_BAK = TEST_HTTP_SERVER_FILE + ".bak";
+
+    /**
+     * Test JUnit Http Client File.
+     */
+    private static final String TEST_HTTP_CLIENT_FILE = TEST_CONTROLLER_NAME
+                            + FileSystemPersistence.PROPERTIES_FILE_HTTP_CLIENT_SUFFIX;
+
+    /**
+     * Test JUnit Backup Http Server File.
+     */
+    private static final String TEST_HTTP_CLIENT_FILE_BAK = TEST_HTTP_CLIENT_FILE + ".bak";
+
+    /**
      * Test JUnit Environment/Engine properties.
      */
     private static final String ENV_PROPS = TEST_CONTROLLER_NAME;
@@ -188,7 +221,67 @@
     }
 
     @Test
-    public void test4Controller() {
+    public void test4HttpServer() {
+        SystemPersistenceConstants.getManager().setConfigurationDir(null);
+
+        Path httpServerPath = Paths
+            .get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(), TEST_HTTP_SERVER_FILE);
+
+        Path httpServerBakPath = Paths
+            .get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(), TEST_HTTP_SERVER_FILE_BAK);
+
+        assertTrue(Files.notExists(httpServerPath));
+        assertTrue(Files.notExists(httpServerBakPath));
+
+        SystemPersistenceConstants.getManager().storeHttpServer(TEST_HTTP_SERVER_NAME, new Properties());
+
+        assertTrue(Files.exists(httpServerPath));
+
+        Properties properties = SystemPersistenceConstants.getManager().getHttpServerProperties(TEST_HTTP_SERVER_NAME);
+        assertNotNull(properties);
+
+        List<Properties> httpServerPropsList = SystemPersistenceConstants.getManager().getHttpServerProperties();
+        assertEquals(1,  httpServerPropsList.size());
+
+        SystemPersistenceConstants.getManager().backupHttpServer(TEST_HTTP_SERVER_NAME);
+        assertTrue(Files.exists(httpServerBakPath));
+
+        SystemPersistenceConstants.getManager().deleteHttpServer(TEST_HTTP_SERVER_NAME);
+        assertTrue(Files.notExists(httpServerPath));
+    }
+
+    @Test
+    public void test5HttpClient() {
+        SystemPersistenceConstants.getManager().setConfigurationDir(null);
+
+        Path httpClientPath = Paths
+            .get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(), TEST_HTTP_CLIENT_FILE);
+
+        Path httpClientBakPath = Paths
+            .get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(), TEST_HTTP_CLIENT_FILE_BAK);
+
+        assertTrue(Files.notExists(httpClientPath));
+        assertTrue(Files.notExists(httpClientBakPath));
+
+        SystemPersistenceConstants.getManager().storeHttpClient(TEST_HTTP_CLIENT_NAME, new Properties());
+
+        assertTrue(Files.exists(httpClientPath));
+
+        Properties properties = SystemPersistenceConstants.getManager().getHttpClientProperties(TEST_HTTP_CLIENT_NAME);
+        assertNotNull(properties);
+
+        List<Properties> httpClientPropsList = SystemPersistenceConstants.getManager().getHttpClientProperties();
+        assertEquals(1,  httpClientPropsList.size());
+
+        SystemPersistenceConstants.getManager().backupHttpClient(TEST_HTTP_CLIENT_NAME);
+        assertTrue(Files.exists(httpClientBakPath));
+
+        SystemPersistenceConstants.getManager().deleteHttpClient(TEST_HTTP_CLIENT_NAME);
+        assertTrue(Files.notExists(httpClientPath));
+    }
+
+    @Test
+    public void test6Controller() {
         SystemPersistenceConstants.getManager().setConfigurationDir(null);
 
         Path controllerPath = Paths
@@ -233,6 +326,8 @@
         }
 
         SystemPersistenceConstants.getManager().deleteTopic(TEST_TOPIC_NAME);
+        SystemPersistenceConstants.getManager().deleteHttpServer(TEST_HTTP_SERVER_NAME);
+        SystemPersistenceConstants.getManager().deleteHttpClient(TEST_HTTP_CLIENT_NAME);
 
         final Path testControllerBakPath =
                         Paths.get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(),
@@ -240,6 +335,10 @@
 
         final Path testTopicBakPath = Paths
             .get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(), TEST_TOPIC_FILE_BAK);
+        final Path testHttpServerBakPath = Paths
+            .get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(), TEST_HTTP_SERVER_FILE_BAK);
+        final Path testHttpClientBakPath = Paths
+            .get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(), TEST_HTTP_CLIENT_FILE_BAK);
 
         final Path policyEnginePath = Paths.get(OTHER_CONFIG_DIR, FileSystemPersistence.PROPERTIES_FILE_ENGINE);
         final Path environmentPath = Paths.get(OTHER_CONFIG_DIR, ENV_PROPS_FILE);
@@ -247,6 +346,8 @@
 
         Files.deleteIfExists(testControllerBakPath);
         Files.deleteIfExists(testTopicBakPath);
+        Files.deleteIfExists(testHttpServerBakPath);
+        Files.deleteIfExists(testHttpClientBakPath);
         Files.deleteIfExists(policyEnginePath);
         Files.deleteIfExists(environmentPath);
         Files.deleteIfExists(systemPath);
diff --git a/policy-management/src/test/java/org/onap/policy/drools/system/PolicyEngineManagerTest.java b/policy-management/src/test/java/org/onap/policy/drools/system/PolicyEngineManagerTest.java
index 412e704..b5c83e4 100644
--- a/policy-management/src/test/java/org/onap/policy/drools/system/PolicyEngineManagerTest.java
+++ b/policy-management/src/test/java/org/onap/policy/drools/system/PolicyEngineManagerTest.java
@@ -52,6 +52,8 @@
 import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 import org.onap.policy.common.endpoints.event.comm.TopicSource;
+import org.onap.policy.common.endpoints.http.client.HttpClient;
+import org.onap.policy.common.endpoints.http.client.HttpClientFactory;
 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
 import org.onap.policy.common.endpoints.http.server.HttpServletServerFactory;
 import org.onap.policy.common.utils.gson.GsonTestUtils;
@@ -109,6 +111,10 @@
     private HttpServletServer server2;
     private List<HttpServletServer> servers;
     private HttpServletServerFactory serverFactory;
+    private HttpClientFactory clientFactory;
+    private HttpClient client1;
+    private HttpClient client2;
+    private List<HttpClient> clients;
     private TopicEndpoint endpoint;
     private PolicyController controller;
     private PolicyController controller2;
@@ -163,6 +169,10 @@
         server2 = mock(HttpServletServer.class);
         servers = Arrays.asList(server1, server2);
         serverFactory = mock(HttpServletServerFactory.class);
+        client1 = mock(HttpClient.class);
+        client2 = mock(HttpClient.class);
+        clients = Arrays.asList(client1, client2);
+        clientFactory = mock(HttpClientFactory.class);
         endpoint = mock(TopicEndpoint.class);
         controller = mock(PolicyController.class);
         controller2 = mock(PolicyController.class);
@@ -216,6 +226,16 @@
 
         when(serverFactory.build(any())).thenReturn(servers);
 
+        when(client1.getPort()).thenReturn(2001);
+        when(client1.start()).thenReturn(true);
+        when(client1.stop()).thenReturn(true);
+
+        when(client2.getPort()).thenReturn(2002);
+        when(client2.start()).thenReturn(true);
+        when(client2.stop()).thenReturn(true);
+
+        when(clientFactory.inventory()).thenReturn(clients);
+
         when(source1.getTopic()).thenReturn("source1-topic");
         when(source1.start()).thenReturn(true);
         when(source1.stop()).thenReturn(true);
@@ -515,6 +535,7 @@
         when(endpoint.addTopicSources(properties)).thenThrow(new IllegalArgumentException(EXPECTED));
         when(endpoint.addTopicSinks(properties)).thenThrow(new IllegalArgumentException(EXPECTED));
         when(serverFactory.build(properties)).thenThrow(new IllegalArgumentException(EXPECTED));
+        when(clientFactory.build(properties)).thenThrow(new IllegalArgumentException(EXPECTED));
         mgr.configure(properties);
         verify(prov2).afterConfigure(mgr);
 
@@ -763,6 +784,7 @@
             when(prov1.beforeStart(mgr)).thenThrow(new RuntimeException(EXPECTED));
             when(prov1.afterStart(mgr)).thenThrow(new RuntimeException(EXPECTED));
             when(server1.waitedStart(anyLong())).thenThrow(new RuntimeException(EXPECTED));
+            when(client1.start()).thenThrow(new RuntimeException(EXPECTED));
             when(source1.start()).thenThrow(new RuntimeException(EXPECTED));
             when(sink1.start()).thenThrow(new RuntimeException(EXPECTED));
         });
@@ -776,6 +798,9 @@
         // servlet wait fails - still does everything
         testStart(false, () -> when(server1.waitedStart(anyLong())).thenReturn(false));
 
+        // client fails - still does everything
+        testStart(false, () -> when(client1.start()).thenReturn(false));
+
         // topic source is not started with start
         testStart(true, () -> when(source1.start()).thenReturn(false));
 
@@ -841,6 +866,9 @@
         verify(server1).waitedStart(anyLong());
         verify(server2).waitedStart(anyLong());
 
+        verify(client1).start();
+        verify(client2).start();
+
         verify(source1, never()).start();
         verify(source2, never()).start();
 
@@ -866,6 +894,7 @@
             when(prov1.beforeStop(mgr)).thenThrow(new RuntimeException(EXPECTED));
             when(prov1.afterStop(mgr)).thenThrow(new RuntimeException(EXPECTED));
             when(server1.stop()).thenThrow(new RuntimeException(EXPECTED));
+            when(client1.stop()).thenThrow(new RuntimeException(EXPECTED));
             when(source1.stop()).thenThrow(new RuntimeException(EXPECTED));
             when(sink1.stop()).thenThrow(new RuntimeException(EXPECTED));
         });
@@ -881,6 +910,7 @@
         verify(sink1, never()).stop();
         verify(endpoint, never()).stop();
         verify(server1, never()).stop();
+        verify(client1, never()).stop();
         verify(prov1, never()).afterStop(mgr);
         verify(prov2, never()).afterStop(mgr);
 
@@ -902,6 +932,9 @@
         // servlet fails to stop - still does everything
         testStop(false, () -> when(server1.stop()).thenReturn(false));
 
+        // client fails to stop - still does everything
+        testStop(false, () -> when(client1.stop()).thenReturn(false));
+
         // lock manager fails to stop - still does everything
         testStop(false, () -> when(lockmgr.stop()).thenReturn(false));
 
@@ -954,6 +987,9 @@
         verify(server1).stop();
         verify(server2).stop();
 
+        verify(client1).stop();
+        verify(client2).stop();
+
         verify(prov1).afterStop(mgr);
         verify(prov2).afterStop(mgr);
     }
@@ -1017,6 +1053,7 @@
         verify(controllerFactory).shutdown();
         verify(endpoint).shutdown();
         verify(serverFactory).destroy();
+        verify(clientFactory).destroy();
 
         assertTrue(jmxStopped);
 
@@ -1058,6 +1095,8 @@
 
         verify(server1).shutdown();
         verify(server2).shutdown();
+
+        verify(clientFactory).destroy();
     }
 
     @Test
@@ -1910,6 +1949,11 @@
         }
 
         @Override
+        protected HttpClientFactory getHttpClientFactory() {
+            return clientFactory;
+        }
+
+        @Override
         protected PolicyControllerFactory getControllerFactory() {
             return controllerFactory;
         }