From 4923d498ed61f94276119ad550fd42c387c0e995 Mon Sep 17 00:00:00 2001 From: Radek Davidek Date: Tue, 17 Mar 2026 20:38:42 +0100 Subject: [PATCH] vault implemented --- .../endpoints/imq/ImqFirstVisionEndpoint.java | 335 +++++++++--------- 1 file changed, 162 insertions(+), 173 deletions(-) diff --git a/test-harness/src/main/java/cz/moneta/test/harness/endpoints/imq/ImqFirstVisionEndpoint.java b/test-harness/src/main/java/cz/moneta/test/harness/endpoints/imq/ImqFirstVisionEndpoint.java index 3ebe10f..e742ab1 100644 --- a/test-harness/src/main/java/cz/moneta/test/harness/endpoints/imq/ImqFirstVisionEndpoint.java +++ b/test-harness/src/main/java/cz/moneta/test/harness/endpoints/imq/ImqFirstVisionEndpoint.java @@ -1,210 +1,199 @@ package cz.moneta.test.harness.endpoints.imq; -import cz.moneta.test.harness.connectors.messaging.IbmMqConnector; -import cz.moneta.test.harness.context.StoreAccessor; -import cz.moneta.test.harness.endpoints.Endpoint; -import cz.moneta.test.harness.messaging.MqMessageFormat; -import cz.moneta.test.harness.messaging.ReceivedMessage; -import cz.moneta.test.harness.connectors.VaultConnector; -import cz.moneta.test.harness.support.auth.Credentials; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.time.Duration; import java.util.List; import java.util.Optional; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import cz.moneta.test.harness.connectors.VaultConnector; +import cz.moneta.test.harness.connectors.messaging.IbmMqConnector; +import cz.moneta.test.harness.context.StoreAccessor; +import cz.moneta.test.harness.endpoints.Endpoint; +import cz.moneta.test.harness.messaging.MqMessageFormat; +import cz.moneta.test.harness.messaging.ReceivedMessage; +import cz.moneta.test.harness.support.auth.Credentials; + /** - * IBM MQ First Vision endpoint. - * Provides high-level access to IBM MQ queues with configuration from StoreAccessor. + * IBM MQ First Vision endpoint. Provides high-level access to IBM MQ queues + * with configuration from StoreAccessor. *

* Credentials are loaded from HashiCorp Vault. */ public class ImqFirstVisionEndpoint implements Endpoint { - private static final Logger LOG = LogManager.getLogger(ImqFirstVisionEndpoint.class); + private static final Logger LOG = LogManager.getLogger(ImqFirstVisionEndpoint.class); - private final IbmMqConnector connector; - private final StoreAccessor store; + private final IbmMqConnector connector; + private final StoreAccessor store; - // Configuration keys - private static final String CONNECTION_NAME_LIST_KEY = "endpoints.imq-first-vision.connection-name-list"; - private static final String CHANNEL_KEY = "endpoints.imq-first-vision.channel"; - private static final String QUEUE_MANAGER_KEY = "endpoints.imq-first-vision.queue-manager"; - private static final String SSL_CIPHER_SUITE_KEY = "endpoints.imq-first-vision.ssl-cipher-suite"; - private static final String VAULT_PATH_KEY = "vault.imq-first-vision.secrets.path"; + private String username, password, keystorePassword; - /** - * Constructor that reads configuration from StoreAccessor. - */ - public ImqFirstVisionEndpoint(StoreAccessor store) { - this.store = store; + // Configuration keys + private static final String CONNECTION_NAME_LIST_KEY = "endpoints.imq-first-vision.connection-name-list"; + private static final String CHANNEL_KEY = "endpoints.imq-first-vision.channel"; + private static final String QUEUE_MANAGER_KEY = "endpoints.imq-first-vision.queue-manager"; + private static final String SSL_CIPHER_SUITE_KEY = "endpoints.imq-first-vision.ssl-cipher-suite"; + private static final String VAULT_PATH_KEY = "vault.imq-first-vision.secrets.path"; + private static final String VAULT_KEYSTORE_PASSWORD_KEY = "keystorePassword"; - // Read configuration - String connectionNameList = getConfig(CONNECTION_NAME_LIST_KEY); - String channel = getConfig(CHANNEL_KEY); - String queueManager = getConfig(QUEUE_MANAGER_KEY); - String sslCipherSuite = getConfig(SSL_CIPHER_SUITE_KEY); + /** + * Constructor that reads configuration from StoreAccessor. + */ + public ImqFirstVisionEndpoint(StoreAccessor store) { + this.store = store; - // Load credentials from Vault - String vaultPath = getVaultPath(); - Credentials credentials = loadCredentialsFromVault(vaultPath); + // Read configuration + String connectionNameList = getConfig(CONNECTION_NAME_LIST_KEY); + String channel = getConfig(CHANNEL_KEY); + String queueManager = getConfig(QUEUE_MANAGER_KEY); + String sslCipherSuite = getConfig(SSL_CIPHER_SUITE_KEY); - // SSL configuration (optional) - String keystorePath = "/home/kamma/aa/mq-docker/truststore.jks"; - String keystorePassword = "changeit"; + loadCredentialsFromVault(); - try { - this.connector = new IbmMqConnector( - connectionNameList, - channel, - queueManager, - credentials.getUsername(), - credentials.getPassword(), - keystorePath, - keystorePassword, - sslCipherSuite - ); + // SSL configuration (optional) + String keystorePath = "/home/kamma/aa/mq-docker/truststore.jks"; - LOG.info("Initialized IBM MQ First Vision endpoint for queue manager: {}", queueManager); + try { + this.connector = new IbmMqConnector(connectionNameList, channel, queueManager, username, password, + keystorePath, keystorePassword, sslCipherSuite); - } catch (Exception e) { - throw new IllegalStateException("Failed to initialize IBM MQ endpoint", e); - } - } + LOG.info("Initialized IBM MQ First Vision endpoint for queue manager: {}", queueManager); - /** - * Get a configuration value from StoreAccessor. - */ - private String getConfig(String key) { - return Optional.ofNullable(store.getConfig(key)) - .orElseThrow(() -> new IllegalStateException( - "You need to configure " + key)); - } + } catch (Exception e) { + throw new IllegalStateException("Failed to initialize IBM MQ endpoint", e); + } + } - /** - * Get vault path from configuration. - */ - private String getVaultPath() { - return Optional.ofNullable(store.getConfig(VAULT_PATH_KEY)) - .orElseThrow(() -> new IllegalStateException( - "You need to configure " + VAULT_PATH_KEY)); - } + /** + * Get a configuration value from StoreAccessor. + */ + private String getConfig(String key) { + return Optional.ofNullable(store.getConfig(key)) + .orElseThrow(() -> new IllegalStateException("You need to configure " + key)); + } - /** - * Load credentials from HashiCorp Vault. - */ - private Credentials loadCredentialsFromVault(String vaultPath) { - try { - // Get vault URL from configuration - String vaultUrl = getConfig("vault.url"); - String vaultUser = getConfig("vault.user"); - String vaultPassword = getConfig("vault.password"); + /** + * Load credentials from HashiCorp Vault. + */ + private void loadCredentialsFromVault() { + try { + // Get vault URL from configuration + String vaultPath = getConfig(VAULT_PATH_KEY); + String vaultUrl = getConfig("vault.url"); + String vaultUser = getConfig("vault.user"); + String vaultPassword = getConfig("vault.password"); - VaultConnector vaultConnector = new VaultConnector(vaultUrl, vaultUser, vaultPassword); + VaultConnector vaultConnector = new VaultConnector(vaultUrl, vaultUser, vaultPassword); - Optional credentials = vaultConnector.getUsernameAndPassword(vaultPath); + Optional credentials = vaultConnector.getUsernameAndPassword(vaultPath); - return credentials.orElseThrow(() -> new IllegalStateException( - "Credentials not found in Vault at path: " + vaultPath)); + if (credentials.isPresent()) { + this.username = credentials.get().getUsername(); + this.password = credentials.get().getPassword(); + this.keystorePassword = vaultConnector.getValue(vaultPath, VAULT_KEYSTORE_PASSWORD_KEY) + .map(Object::toString).orElse(null); + LOG.info("Successfully loaded credentials from Vault for path: {}", vaultPath); + } else { + throw new IllegalStateException("Credentials not found in Vault at path: " + vaultPath); + } + } catch (Exception e) { + throw new IllegalStateException("Failed to load credentials from Vault", e); + } + } - } catch (Exception e) { - throw new IllegalStateException("Failed to load credentials from Vault", e); - } - } + /** + * Send a message to a queue. + * + * @param queueName Physical queue name or logical name (from + * ImqFirstVisionQueue) + * @param payload Message payload + * @param format Message format + * @param properties JMS properties + */ + public void send(String queueName, String payload, MqMessageFormat format, + java.util.Map properties) { + connector.send(queueName, payload, format, properties); + } - /** - * Send a message to a queue. - * - * @param queueName Physical queue name or logical name (from ImqFirstVisionQueue) - * @param payload Message payload - * @param format Message format - * @param properties JMS properties - */ - public void send(String queueName, String payload, MqMessageFormat format, - java.util.Map properties) { - connector.send(queueName, payload, format, properties); - } + /** + * Send a message to a queue using logical queue name. + */ + public void send(ImqFirstVisionQueue queue, String payload, MqMessageFormat format, + java.util.Map properties) { + String physicalQueueName = resolveQueue(queue); + connector.send(physicalQueueName, payload, format, properties); + } - /** - * Send a message to a queue using logical queue name. - */ - public void send(ImqFirstVisionQueue queue, String payload, MqMessageFormat format, - java.util.Map properties) { - String physicalQueueName = resolveQueue(queue); - connector.send(physicalQueueName, payload, format, properties); - } + /** + * Receive a message from a queue. + * + * @param queueName Physical queue name or logical name + * @param messageSelector JMS message selector (optional) + * @param format Expected message format + * @param timeout Timeout duration + * @return Received message + */ + public ReceivedMessage receive(String queueName, String messageSelector, MqMessageFormat format, Duration timeout) { + return connector.receive(queueName, messageSelector, format, timeout); + } - /** - * Receive a message from a queue. - * - * @param queueName Physical queue name or logical name - * @param messageSelector JMS message selector (optional) - * @param format Expected message format - * @param timeout Timeout duration - * @return Received message - */ - public ReceivedMessage receive(String queueName, String messageSelector, - MqMessageFormat format, Duration timeout) { - return connector.receive(queueName, messageSelector, format, timeout); - } + /** + * Receive a message from a queue using logical queue name. + */ + public ReceivedMessage receive(ImqFirstVisionQueue queue, String messageSelector, MqMessageFormat format, + Duration timeout) { + String physicalQueueName = resolveQueue(queue); + return connector.receive(physicalQueueName, messageSelector, format, timeout); + } - /** - * Receive a message from a queue using logical queue name. - */ - public ReceivedMessage receive(ImqFirstVisionQueue queue, String messageSelector, - MqMessageFormat format, Duration timeout) { - String physicalQueueName = resolveQueue(queue); - return connector.receive(physicalQueueName, messageSelector, format, timeout); - } + /** + * Browse a queue (non-destructive read). + * + * @param queueName Physical queue name or logical name + * @param messageSelector JMS message selector (optional) + * @param format Expected message format + * @param maxMessages Maximum number of messages + * @return List of received messages + */ + public List browse(String queueName, String messageSelector, MqMessageFormat format, + int maxMessages) { + return connector.browse(queueName, messageSelector, format, maxMessages); + } - /** - * Browse a queue (non-destructive read). - * - * @param queueName Physical queue name or logical name - * @param messageSelector JMS message selector (optional) - * @param format Expected message format - * @param maxMessages Maximum number of messages - * @return List of received messages - */ - public List browse(String queueName, String messageSelector, - MqMessageFormat format, int maxMessages) { - return connector.browse(queueName, messageSelector, format, maxMessages); - } + /** + * Browse a queue using logical queue name. + */ + public List browse(ImqFirstVisionQueue queue, String messageSelector, MqMessageFormat format, + int maxMessages) { + String physicalQueueName = resolveQueue(queue); + return connector.browse(physicalQueueName, messageSelector, format, maxMessages); + } - /** - * Browse a queue using logical queue name. - */ - public List browse(ImqFirstVisionQueue queue, String messageSelector, - MqMessageFormat format, int maxMessages) { - String physicalQueueName = resolveQueue(queue); - return connector.browse(physicalQueueName, messageSelector, format, maxMessages); - } + /** + * Resolve logical queue name to physical queue name. + * + * @param logicalName Logical queue name or ImqFirstVisionQueue enum + * @return Physical queue name + */ + public String resolveQueue(String logicalName) { + String configKey = "endpoints.imq-first-vision." + logicalName + ".queue"; + return Optional.ofNullable(store.getConfig(configKey)).orElseThrow( + () -> new IllegalStateException("Queue '" + logicalName + "' is not configured in " + configKey)); + } - /** - * Resolve logical queue name to physical queue name. - * - * @param logicalName Logical queue name or ImqFirstVisionQueue enum - * @return Physical queue name - */ - public String resolveQueue(String logicalName) { - String configKey = "endpoints.imq-first-vision." + logicalName + ".queue"; - return Optional.ofNullable(store.getConfig(configKey)) - .orElseThrow(() -> new IllegalStateException( - "Queue '" + logicalName + "' is not configured in " + configKey)); - } + /** + * Resolve ImqFirstVisionQueue enum to physical queue name. + */ + public String resolveQueue(ImqFirstVisionQueue queue) { + return resolveQueue(queue.getConfigKey()); + } - /** - * Resolve ImqFirstVisionQueue enum to physical queue name. - */ - public String resolveQueue(ImqFirstVisionQueue queue) { - return resolveQueue(queue.getConfigKey()); - } - - @Override - public void close() { - if (connector != null) { - connector.close(); - } - } + @Override + public void close() { + if (connector != null) { + connector.close(); + } + } }