diff --git a/caching-service-package/src/main/resources/bin/start.sh b/caching-service-package/src/main/resources/bin/start.sh index 78d414a18c..92ca4d5bbc 100755 --- a/caching-service-package/src/main/resources/bin/start.sh +++ b/caching-service-package/src/main/resources/bin/start.sh @@ -90,20 +90,6 @@ then QUICK_START=-Xquickstart fi -if [ -z "${ZWE_configs_storage_infinispan_persistence_dataLocation}" ]; then - if [ -n "${ZWE_zowe_workspaceDirectory}" ]; then - ZWE_configs_storage_infinispan_persistence_dataLocation="${ZWE_zowe_workspaceDirectory}/caching-service/${ZWE_haInstance_id:-localhost}/data" - fi -fi -if [ -z "${ZWE_configs_storage_infinispan_persistence_indexLocation}" ]; then - if [ -n "${ZWE_zowe_workspaceDirectory}" ]; then - ZWE_configs_storage_infinispan_persistence_indexLocation="${ZWE_zowe_workspaceDirectory}/caching-service/${ZWE_haInstance_id:-localhost}/index" - fi -fi -if [ -z "${ZWE_configs_storage_infinispan_initialHosts}" ]; then - ZWE_configs_storage_infinispan_initialHosts="${ZWE_haInstance_hostname:-localhost}[${ZWE_configs_storage_infinispan_jgroups_port:-7098}]" -fi - LIBPATH="$LIBPATH":"/lib" LIBPATH="$LIBPATH":"/usr/lib" LIBPATH="$LIBPATH":"${JAVA_HOME}"/bin @@ -260,8 +246,6 @@ _BPX_JOBNAME=${ZWE_zowe_job_prefix}${CACHING_CODE} ${JAVA_BIN_DIR}java \ -Djgroups.bind.address=${ZWE_configs_storage_infinispan_jgroups_host:-${ZWE_haInstance_hostname:-localhost}} \ -Djgroups.bind.port=${ZWE_configs_storage_infinispan_jgroups_port:-7098} \ -Djgroups.keyExchange.port=${ZWE_configs_storage_infinispan_jgroups_keyExchange_port:-7118} \ - -Dcaching.storage.infinispan.persistence.dataLocation=${ZWE_configs_storage_infinispan_persistence_dataLocation:-data} \ - -Dcaching.storage.infinispan.persistence.indexLocation=${ZWE_configs_storage_infinispan_persistence_indexLocation:-index} \ -Dcaching.storage.infinispan.initialHosts=${ZWE_configs_storage_infinispan_initialHosts:-localhost[7098]} \ -Dserver.address=${ZWE_configs_zowe_network_server_listenAddresses_0:-${ZWE_zowe_network_server_listenAddresses_0:-"0.0.0.0"}} \ -Dserver.ssl.enabled=${ZWE_configs_server_ssl_enabled:-true} \ diff --git a/caching-service/src/main/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfig.java b/caching-service/src/main/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfig.java index 747005de30..d6fce28f42 100644 --- a/caching-service/src/main/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfig.java +++ b/caching-service/src/main/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfig.java @@ -10,6 +10,7 @@ package org.zowe.apiml.caching.service.infinispan.config; +import jakarta.annotation.PostConstruct; import org.apache.commons.lang3.StringUtils; import org.infinispan.commons.api.CacheContainerAdmin; import org.infinispan.commons.dataconversion.MediaType; @@ -30,12 +31,13 @@ import org.zowe.apiml.caching.service.Storage; import org.zowe.apiml.caching.service.infinispan.exception.InfinispanConfigException; import org.zowe.apiml.caching.service.infinispan.storage.InfinispanStorage; -import static org.zowe.apiml.security.SecurityUtils.formatKeyringUrl; -import static org.zowe.apiml.security.SecurityUtils.isKeyring; -import jakarta.annotation.PostConstruct; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Paths; + +import static org.zowe.apiml.security.SecurityUtils.formatKeyringUrl; +import static org.zowe.apiml.security.SecurityUtils.isKeyring; @Configuration @ConfigurationProperties(value = "caching.storage.infinispan") @@ -46,10 +48,6 @@ public class InfinispanConfig { @Value("${caching.storage.infinispan.initialHosts}") private String initialHosts; - @Value("${caching.storage.infinispan.persistence.dataLocation}") - private String dataLocation; - @Value("${caching.storage.infinispan.persistence.indexLocation:index}") - private String indexLocation; @Value("${server.ssl.keyStoreType}") private String keyStoreType; @Value("${server.ssl.keyStore}") @@ -71,6 +69,21 @@ void updateKeyring() { } } + static String getRootFolder() { + // using getenv().get is because of system compatibility (see non-case sensitive on Windows) + String instanceId = System.getenv().get("ZWE_haInstance_id"); + if (StringUtils.isBlank(instanceId)) { + instanceId = "localhost"; + } + + String workspaceFolder = System.getenv().get("ZWE_zowe_workspaceDirectory"); + if (StringUtils.isBlank(workspaceFolder)) { + return Paths.get("caching-service", instanceId).toString(); + } else { + return Paths.get(workspaceFolder, "caching-service", instanceId).toString(); + } + } + @Bean DefaultCacheManager cacheManager(ResourceLoader resourceLoader) { System.setProperty("jgroups.tcpping.initial_hosts", initialHosts); @@ -88,6 +101,9 @@ DefaultCacheManager cacheManager(ResourceLoader resourceLoader) { } catch (IOException e) { throw new InfinispanConfigException("Can't read configuration file", e); } + holder.getGlobalConfigurationBuilder().globalState().persistentLocation(getRootFolder()).enable(); + holder.newConfigurationBuilder("default").persistence().passivation(true).addSoftIndexFileStore() + .shared(false); DefaultCacheManager cacheManager = new DefaultCacheManager(holder, true); @@ -97,8 +113,7 @@ DefaultCacheManager cacheManager(ResourceLoader resourceLoader) { builder.persistence().passivation(true) .addSoftIndexFileStore() - .shared(false) - .dataLocation(dataLocation).indexLocation(indexLocation); + .shared(false); cacheManager.administration() .withFlags(CacheContainerAdmin.AdminFlag.VOLATILE) .getOrCreateCache("zoweCache", builder.build()); diff --git a/caching-service/src/main/resources/infinispan.xml b/caching-service/src/main/resources/infinispan.xml index 873e25144b..718c0f891c 100644 --- a/caching-service/src/main/resources/infinispan.xml +++ b/caching-service/src/main/resources/infinispan.xml @@ -1,4 +1,11 @@ - + @@ -83,6 +90,5 @@ - diff --git a/caching-service/src/test/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfigTest.java b/caching-service/src/test/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfigTest.java index 819f299112..7e8f231f79 100644 --- a/caching-service/src/test/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfigTest.java +++ b/caching-service/src/test/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfigTest.java @@ -10,11 +10,18 @@ package org.zowe.apiml.caching.service.infinispan.config; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; +import java.io.File; +import java.lang.reflect.Field; +import java.util.Map; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; class InfinispanConfigTest { @@ -52,4 +59,58 @@ void whenKeystore_thenDontUpdate() { } -} \ No newline at end of file + @Nested + class GlobalConfiguration { + + private static final String INSTANCE = "ZWE_haInstance_id"; + private static final String WORKSPACE = "ZWE_zowe_workspaceDirectory"; + + Map getEnvMap() { + try { + Class envVarClass = System.getenv().getClass(); + Field mField = envVarClass.getDeclaredField("m"); + mField.setAccessible(true); + return (Map) mField.get(System.getenv()); + } catch (NoSuchFieldException | IllegalAccessException e) { + fail(e); + return null; + } + } + + @BeforeEach + @AfterEach + void cleanUp() { + getEnvMap().remove(INSTANCE); + getEnvMap().remove(WORKSPACE); + } + + @Test + void givenNoEnvironmentValues_whenEvaluatingRootFolder_thenUseLocalhost() { + assertEquals("caching-service" + File.separator + "localhost", InfinispanConfig.getRootFolder()); + } + + @Test + void givenOnlyInstanceIdValues_whenEvaluatingRootFolder_thenUseRelativePath() { + getEnvMap().put(INSTANCE, "myInstance"); + assertEquals("caching-service" + File.separator + "myInstance", InfinispanConfig.getRootFolder()); + + } + + @Test + void givenAllEnvironmentValues_whenEvaluatingRootFolder_thenUseExactLocation() { + getEnvMap().put(INSTANCE, "lpar1"); + getEnvMap().put(WORKSPACE, "/some/path"); + assertEquals(File.separator + "some" + File.separator + "path" + File.separator + "caching-service" + File.separator + "lpar1", InfinispanConfig.getRootFolder()); + + } + + @Test + void givenOnlyWorkspaceValues_whenEvaluatingRootFolder_thenUseExactLocationWithLocalhost() { + getEnvMap().put(WORKSPACE, "/another/path"); + assertEquals(File.separator + "another" + File.separator + "path" + File.separator + "caching-service" + File.separator + "localhost", InfinispanConfig.getRootFolder()); + + } + + } + +}