From 3748b447876019681edce86942089a3652232ecc Mon Sep 17 00:00:00 2001 From: Jorge Hernandez Date: Thu, 21 Mar 2019 07:10:46 -0500 Subject: Support topic properties files. They will be loaded automatically at startup. Remove POLICY-PAP-PDP topic as is moved to a feature. Remove PDPD-CONFIGURATION topic as it is not used. Change-Id: I55629f885d61ce1cc4e3f24bcae5279e65a96f22 Issue-ID: POLICY-1610 Signed-off-by: Jorge Hernandez --- .../drools/persistence/FileSystemPersistence.java | 147 ++++++++++++++------- .../drools/persistence/SystemPersistence.java | 51 ++++++- .../java/org/onap/policy/drools/system/Main.java | 11 +- .../src/main/server/config/engine.properties | 28 +--- .../drools/persistence/SystemPersistenceTest.java | 66 +++++++-- 5 files changed, 216 insertions(+), 87 deletions(-) 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 b5c6fe94..88987eab 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 @@ -29,6 +29,7 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.List; import java.util.Properties; @@ -53,12 +54,33 @@ public class FileSystemPersistence implements SystemPersistence { */ public static final String CONTROLLER_SUFFIX_IDENTIFIER = "-controller"; + /** + * File Backup Suffix. + */ + public static final String FILE_BACKUP_SUFFIX = ".bak"; + /** * Policy controller properties file suffix. */ public static final String PROPERTIES_FILE_CONTROLLER_SUFFIX = CONTROLLER_SUFFIX_IDENTIFIER + PROPERTIES_FILE_EXTENSION; + /** + * Topic configuration suffix. + */ + public static final String TOPIC_SUFFIX_IDENTIFIER = "-topic"; + + /** + * Policy controller 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. */ @@ -228,6 +250,16 @@ public class FileSystemPersistence implements SystemPersistence { return getPropertiesList(PROPERTIES_FILE_CONTROLLER_SUFFIX, this::testControllerName); } + @Override + public Properties getTopicProperties(String topicName) { + return this.getProperties(topicName + TOPIC_SUFFIX_IDENTIFIER); + } + + @Override + public List getTopicProperties() { + return getPropertiesList(PROPERTIES_FILE_TOPIC_SUFFIX); + } + private boolean testControllerName(String controllerFilename, Properties controllerProperties) { String controllerName = controllerFilename .substring(0, controllerFilename.length() - PROPERTIES_FILE_CONTROLLER_SUFFIX.length()); @@ -245,79 +277,99 @@ public class FileSystemPersistence implements SystemPersistence { @Override public boolean backupController(String controllerName) { - final Path controllerPropertiesPath = Paths.get(this.configurationDirectory.toString(), - controllerName + PROPERTIES_FILE_CONTROLLER_SUFFIX); + return backup(controllerName, PROPERTIES_FILE_CONTROLLER_SUFFIX); + } + + @Override + public boolean backupTopic(String topicName) { + return backup(topicName, PROPERTIES_FILE_TOPIC_SUFFIX); + } - if (Files.exists(controllerPropertiesPath)) { + protected boolean backup(String name, String fileSuffix) { + Path path = Paths.get(this.configurationDirectory.toString(), name + fileSuffix); + if (Files.exists(path)) { try { - logger.info("{}: there is an existing configuration file @ {} ", this, - controllerPropertiesPath); - final Path controllerPropertiesBakPath = Paths.get(this.configurationDirectory.toString(), - controllerName + PROPERTIES_FILE_CONTROLLER_BACKUP_SUFFIX); - Files.copy(controllerPropertiesPath, controllerPropertiesBakPath, - StandardCopyOption.REPLACE_EXISTING); - } catch (final Exception e) { - logger.warn("{}: {} cannot be backed up", this, controllerName, e); + logger.info("{}: there is an existing configuration file @ {} ", this, path); + Path bakPath = Paths.get(this.configurationDirectory.toString(), + name + fileSuffix + FILE_BACKUP_SUFFIX); + Files.copy(path, bakPath, StandardCopyOption.REPLACE_EXISTING); + } catch (Exception e) { + logger.warn("{}: {} cannot be backed up", this, name, e); return false; } } - return true; } @Override public boolean storeController(String controllerName, Object configuration) { - if (!(configuration instanceof Properties)) { - throw new IllegalArgumentException( - "configuration must be of type properties to be handled by this manager"); - } + checkPropertiesParam(configuration); + return store(controllerName, (Properties) configuration, PROPERTIES_FILE_CONTROLLER_SUFFIX); + } - final Properties properties = (Properties) configuration; + @Override + public boolean storeTopic(String topicName, Object configuration) { + checkPropertiesParam(configuration); + return store(topicName, (Properties) configuration, PROPERTIES_FILE_TOPIC_SUFFIX); + } - final Path controllerPropertiesPath = Paths.get(this.configurationDirectory.toString(), - controllerName + PROPERTIES_FILE_CONTROLLER_SUFFIX); - if (Files.exists(controllerPropertiesPath)) { + private boolean store(String name, Properties properties, String fileSuffix) { + Path path = Paths.get(this.configurationDirectory.toString(), name + fileSuffix); + if (Files.exists(path)) { try { - final Properties oldProperties = - PropertyUtil.getProperties(controllerPropertiesPath.toFile()); + Properties oldProperties = PropertyUtil.getProperties(path.toFile()); if (oldProperties.equals(properties)) { - logger.info( - "{}: noop: a properties file with the same contents exists for controller {}.", this, - controllerName); + logger.info("{}: noop: a properties file with the same contents exists for controller {}.", this, + name); return true; } else { - this.backupController(controllerName); + this.backupController(name); } - } catch (final Exception e) { - logger.info("{}: no existing {} properties {}", this, controllerName, e); + } catch (Exception e) { + logger.info("{}: no existing {} properties {}", this, name, e); // continue } } - final File controllerPropertiesFile = controllerPropertiesPath.toFile(); - try (FileWriter writer = new FileWriter(controllerPropertiesFile)) { + File file = path.toFile(); + try (FileWriter writer = new FileWriter(file)) { properties.store(writer, "Machine created Policy Controller Configuration"); - } catch (final Exception e) { - logger.warn("{}: {} cannot be saved", this, controllerName, e); + } catch (Exception e) { + logger.warn("{}: {} cannot be saved", this, name, e); return false; } return true; } + private void checkPropertiesParam(Object configuration) { + if (!(configuration instanceof Properties)) { + throw new IllegalArgumentException( + "configuration must be of type properties to be handled by this manager"); + } + } + + @Override public boolean deleteController(String controllerName) { - final Path controllerPropertiesPath = Paths.get(this.configurationDirectory.toString(), - controllerName + PROPERTIES_FILE_CONTROLLER_SUFFIX); + return delete(controllerName, PROPERTIES_FILE_CONTROLLER_SUFFIX); + } - if (Files.exists(controllerPropertiesPath)) { + @Override + public boolean deleteTopic(String topicName) { + return delete(topicName, PROPERTIES_FILE_TOPIC_SUFFIX); + } + + protected boolean delete(String name, String fileSuffix) { + Path path = Paths.get(this.configurationDirectory.toString(), name + fileSuffix); + + if (Files.exists(path)) { try { - final Path controllerPropertiesBakPath = Paths.get(this.configurationDirectory.toString(), - controllerName + PROPERTIES_FILE_CONTROLLER_BACKUP_SUFFIX); - Files.move(controllerPropertiesPath, controllerPropertiesBakPath, - StandardCopyOption.REPLACE_EXISTING); + Path bakPath = Paths.get(this.configurationDirectory.toString(), + name + fileSuffix + FILE_BACKUP_SUFFIX); + Files.move(path, bakPath, StandardCopyOption.REPLACE_EXISTING); } catch (final Exception e) { - logger.warn("{}: {} cannot be deleted", this, controllerName, e); + logger.warn("{}: {} cannot be deleted", this, name, e); return false; } } @@ -328,17 +380,18 @@ public class FileSystemPersistence implements SystemPersistence { /** * provides a list of files sorted by name in ascending order in the configuration directory. */ - protected File[] sortedListFiles() { - final File[] dirFiles = this.configurationDirectory.toFile().listFiles(); - Arrays.sort(dirFiles, (e1, e2) -> e1.getName().compareTo(e2.getName())); + private File[] sortedListFiles() { + File[] dirFiles = this.configurationDirectory.toFile().listFiles(); + if (dirFiles != null) { + Arrays.sort(dirFiles, Comparator.comparing(File::getName)); + } else { + dirFiles = new File[]{}; + } return dirFiles; } @Override public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("FileSystemPersistence [configurationDirectory=") - .append(this.configurationDirectory).append("]"); - return builder.toString(); + return "FileSystemPersistence [configurationDirectory=" + this.configurationDirectory + "]"; } } 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 32852225..ee1e8b52 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 @@ -66,6 +66,14 @@ public interface SystemPersistence { */ boolean backupController(String controllerName); + /** + * backs up a topic configuration. + * + * @param topicName the controller name + * @return true if the configuration is backed up + */ + boolean backupTopic(String topicName); + /** * persists controller configuration. * @@ -78,6 +86,18 @@ public interface SystemPersistence { */ boolean storeController(String controllerName, Object configuration); + /** + * persists topic configuration. + * + * @param topicName the controller name + * @param configuration object containing the configuration + * + * @return true if storage is succesful, false otherwise + * @throws IllegalArgumentException if the configuration cannot be handled by the persistence + * manager + */ + boolean storeTopic(String topicName, Object configuration); + /** * delete controller configuration. * @@ -86,6 +106,21 @@ public interface SystemPersistence { */ boolean deleteController(String controllerName); + /** + * delete topic configuration. + * + * @param topicName the topic name + * @return true if storage is succesful, false otherwise + */ + boolean deleteTopic(String topicName); + + /** + * get controllers configuration. + * + * @return list of controllers properties + */ + List getControllerProperties(); + /** * get controller properties. * @@ -98,11 +133,21 @@ public interface SystemPersistence { Properties getControllerProperties(String controllerName); /** - * get controllers configuration. + * get topic configuration. * - * @return list of controllers properties + * @return list of topic properties */ - List getControllerProperties(); + List getTopicProperties(); + + /** + * get topic properties. + * + * @param topicName topic name + * @return properties for this topic + * + * @throws IllegalArgumentException if topicName is invalid + */ + Properties getTopicProperties(String topicName); /** * 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 5ebd0490..38af4138 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 @@ -21,6 +21,7 @@ package org.onap.policy.drools.system; import java.util.Properties; +import org.onap.policy.common.endpoints.event.comm.TopicEndpoint; import org.onap.policy.drools.persistence.SystemPersistence; import org.onap.policy.drools.properties.DroolsProperties; import org.onap.policy.drools.utils.PropertyUtil; @@ -76,7 +77,13 @@ public class Main { PolicyEngine.manager.setEnvironment(env); } - /* 2. Start the Engine with the basic services only (no Policy Controllers) */ + /* 2. Add topics */ + + for (Properties topicProperties : SystemPersistence.manager.getTopicProperties()) { + TopicEndpoint.manager.addTopics(topicProperties); + } + + /* 3. Start the Engine with the basic services only (no Policy Controllers) */ MDCTransaction trans = MDCTransaction.newTransaction(null, null) @@ -121,7 +128,7 @@ public class Main { System.exit(1); } - /* 3. Create and start the controllers */ + /* 4. Create and start the controllers */ for (final Properties controllerProperties : SystemPersistence.manager.getControllerProperties()) { diff --git a/policy-management/src/main/server/config/engine.properties b/policy-management/src/main/server/config/engine.properties index fec99b14..05f682e3 100644 --- a/policy-management/src/main/server/config/engine.properties +++ b/policy-management/src/main/server/config/engine.properties @@ -20,9 +20,7 @@ # Policy Engine Configuration Channels -dmaap.source.topics=PDPD-CONFIGURATION,POLICY-PDP-PAP - -dmaap.sink.topics=PDPD-CONFIGURATION,POLICY-PDP-PAP +dmaap.source.topics=PDPD-CONFIGURATION dmaap.source.topics.PDPD-CONFIGURATION.servers=${env:DMAAP_SERVERS} dmaap.source.topics.PDPD-CONFIGURATION.effectiveTopic=${env:PDPD_CONFIGURATION_TOPIC} @@ -33,30 +31,6 @@ dmaap.source.topics.PDPD-CONFIGURATION.consumerInstance=${env:PDPD_CONFIGURATION dmaap.source.topics.PDPD-CONFIGURATION.managed=false dmaap.source.topics.PDPD-CONFIGURATION.https=true -dmaap.sink.topics.PDPD-CONFIGURATION.servers=${env:DMAAP_SERVERS} -dmaap.sink.topics.PDPD-CONFIGURATION.effectiveTopic=${env:PDPD_CONFIGURATION_TOPIC} -dmaap.sink.topics.PDPD-CONFIGURATION.apiKey=${env:PDPD_CONFIGURATION_API_KEY} -dmaap.sink.topics.PDPD-CONFIGURATION.apiSecret=${env:PDPD_CONFIGURATION_API_SECRET} -dmaap.sink.topics.PDPD-CONFIGURATION.partitionKey=${env:PDPD_CONFIGURATION_PARTITION_KEY} -dmaap.sink.topics.PDPD-CONFIGURATION.managed=false -dmaap.sink.topics.PDPD-CONFIGURATION.https=true - -# Configuration Channel Settings: POLICY-PDP-PAP - -dmaap.source.topics.POLICY-PDP-PAP.servers=${env:DMAAP_SERVERS} -dmaap.source.topics.POLICY-PDP-PAP.effectiveTopic=${env:POLICY_PDP_PAP_TOPIC} -dmaap.source.topics.POLICY-PDP-PAP.apiKey=${env:POLICY_PDP_PAP_API_KEY} -dmaap.source.topics.POLICY-PDP-PAP.apiSecret=${env:POLICY_PDP_PAP_API_SECRET} -dmaap.source.topics.POLICY-PDP-PAP.managed=false -dmaap.source.topics.POLICY-PDP-PAP.https=true - -dmaap.sink.topics.POLICY-PDP-PAP.servers=${env:DMAAP_SERVERS} -dmaap.sink.topics.POLICY-PDP-PAP.effectiveTopic=${env:POLICY_PDP_PAP_TOPIC} -dmaap.sink.topics.POLICY-PDP-PAP.apiKey=${env:POLICY_PDP_PAP_API_KEY} -dmaap.sink.topics.POLICY-PDP-PAP.apiSecret=${env:POLICY_PDP_PAP_API_SECRET} -dmaap.sink.topics.POLICY-PDP-PAP.managed=false -dmaap.sink.topics.POLICY-PDP-PAP.https=true - http.server.services=SECURED-CONFIG http.server.services.SECURED-CONFIG.host=${env:TELEMETRY_HOST} 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 de0a7518..b2771944 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 @@ -55,15 +55,30 @@ public class SystemPersistenceTest { private static final String TEST_CONTROLLER_NAME = "foo"; /** - * Test JUnit Controller Name. + * Test JUnit Topic Name. + */ + private static final String TEST_TOPIC_NAME = TEST_CONTROLLER_NAME; + + /** + * Test JUnit Controller File. */ private static final String TEST_CONTROLLER_FILE = TEST_CONTROLLER_NAME + "-controller.properties"; /** - * Test JUnit Controller Name Backup. + * Test JUnit Controller Backup File. */ private static final String TEST_CONTROLLER_FILE_BAK = TEST_CONTROLLER_FILE + ".bak"; + /** + * Test JUnit Topic File. + */ + private static final String TEST_TOPIC_FILE = TEST_CONTROLLER_NAME + "-topic.properties"; + + /** + * Test JUnit Controller Name Backup. + */ + private static final String TEST_TOPIC_FILE_BAK = TEST_TOPIC_FILE + ".bak"; + /** * Test JUnit Environment/Engine properties. */ @@ -143,24 +158,53 @@ public class SystemPersistenceTest { } @Test - public void test3Controller() { + public void test3Topic() { + SystemPersistence.manager.setConfigurationDir(null); + + Path topicPath = Paths + .get(SystemPersistence.manager.getConfigurationPath().toString(), TEST_TOPIC_FILE); + + Path topicBakPath = Paths + .get(SystemPersistence.manager.getConfigurationPath().toString(), TEST_TOPIC_FILE_BAK); + + assertTrue(Files.notExists(topicPath)); + assertTrue(Files.notExists(topicBakPath)); + + SystemPersistence.manager.storeTopic(TEST_TOPIC_NAME, new Properties()); + + assertTrue(Files.exists(topicPath)); + + Properties properties = SystemPersistence.manager.getTopicProperties(TEST_TOPIC_NAME); + assertNotNull(properties); + + List topicPropsList = SystemPersistence.manager.getTopicProperties(); + assertEquals(1, topicPropsList.size()); + + SystemPersistence.manager.backupTopic(TEST_TOPIC_NAME); + assertTrue(Files.exists(topicBakPath)); + + SystemPersistence.manager.deleteTopic(TEST_TOPIC_NAME); + assertTrue(Files.notExists(topicPath)); + } + + @Test + public void test4Controller() { SystemPersistence.manager.setConfigurationDir(null); - final Path controllerPath = Paths + Path controllerPath = Paths .get(SystemPersistence.manager.getConfigurationPath().toString(), TEST_CONTROLLER_FILE); - final Path controllerBakPath = Paths + Path controllerBakPath = Paths .get(SystemPersistence.manager.getConfigurationPath().toString(), TEST_CONTROLLER_FILE_BAK); assertTrue(Files.notExists(controllerPath)); assertTrue(Files.notExists(controllerBakPath)); - Properties properties = new Properties(); - SystemPersistence.manager.storeController(TEST_CONTROLLER_NAME, properties); + SystemPersistence.manager.storeController(TEST_CONTROLLER_NAME, new Properties()); assertTrue(Files.exists(controllerPath)); - properties = SystemPersistence.manager.getControllerProperties(TEST_CONTROLLER_NAME); + Properties properties = SystemPersistence.manager.getControllerProperties(TEST_CONTROLLER_NAME); assertNotNull(properties); List controllerPropsList = SystemPersistence.manager.getControllerProperties(); @@ -188,14 +232,20 @@ public class SystemPersistenceTest { .getProperty(DroolsProperties.PROPERTY_CONTROLLER_NAME)); } + SystemPersistence.manager.deleteTopic(TEST_TOPIC_NAME); + final Path testControllerBakPath = Paths .get(SystemPersistence.manager.getConfigurationPath().toString(), TEST_CONTROLLER_FILE_BAK); + final Path testTopicBakPath = Paths + .get(SystemPersistence.manager.getConfigurationPath().toString(), TEST_TOPIC_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); final Path systemPath = Paths.get(OTHER_CONFIG_DIR, SYSTEM_PROPS_FILE); Files.deleteIfExists(testControllerBakPath); + Files.deleteIfExists(testTopicBakPath); Files.deleteIfExists(policyEnginePath); Files.deleteIfExists(environmentPath); Files.deleteIfExists(systemPath); -- cgit 1.2.3-korg