Feature/elastic on boot (#856)
* Fixing up elastic for Spring Boot * Adding class shadowing for issue reported on https://github.com/hapifhir/hapi-fhir/pull/7242 * Formatting * corrected condition * fix import * fix2 * crappy fix3 * fix actuator endpoint * Simplified expression * Ironed out a few legacy issues * more rework * major overhaul * Disabling invalid test * Reverting back to defaults for text searches * Added default hibernate settings from the EnvironmentHelper * Formatting * Added comment on class shadow * Added missing default
This commit is contained in:
committed by
GitHub
parent
4265137b12
commit
9576cfa9b5
@@ -46,6 +46,7 @@ import static org.junit.jupiter.api.Assertions.fail;
|
||||
}, properties = {
|
||||
"spring.profiles.include=storageSettingsTest",
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap",
|
||||
"hapi.fhir.enable_repository_validating_interceptor=true",
|
||||
"hapi.fhir.fhir_version=r4",
|
||||
"hapi.fhir.cr.enabled=true",
|
||||
|
||||
@@ -14,14 +14,14 @@ import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||
import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum;
|
||||
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class}, properties = {
|
||||
"hapi.fhir.custom-bean-packages=some.custom.pkg1",
|
||||
"hapi.fhir.custom-interceptor-classes=some.custom.pkg1.CustomInterceptorBean,some.custom.pkg1.CustomInterceptorPojo",
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4",
|
||||
"hapi.fhir.cr_enabled=false",
|
||||
// "hapi.fhir.enable_repository_validating_interceptor=true",
|
||||
"hapi.fhir.fhir_version=r4"
|
||||
"hapi.fhir.custom-bean-packages=some.custom.pkg1",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap",
|
||||
"hapi.fhir.custom-interceptor-classes=some.custom.pkg1.CustomInterceptorBean,some.custom.pkg1.CustomInterceptorPojo",
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4",
|
||||
"hapi.fhir.cr_enabled=false",
|
||||
// "hapi.fhir.enable_repository_validating_interceptor=true",
|
||||
"hapi.fhir.fhir_version=r4"
|
||||
})
|
||||
|
||||
class CustomInterceptorTest {
|
||||
|
||||
@LocalServerPort
|
||||
|
||||
@@ -3,8 +3,8 @@ package ca.uhn.fhir.jpa.starter;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.jpa.search.lastn.ElasticsearchRestClientFactory;
|
||||
import ca.uhn.fhir.jpa.search.lastn.ElasticsearchSvcImpl;
|
||||
import ca.uhn.fhir.jpa.starter.elastic.ElasticsearchBootSvcImpl;
|
||||
import ca.uhn.fhir.jpa.test.config.TestElasticsearchContainerHelper;
|
||||
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||
import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum;
|
||||
@@ -14,8 +14,6 @@ import java.io.IOException;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
|
||||
import co.elastic.clients.elasticsearch.ElasticsearchClient;
|
||||
import co.elastic.clients.elasticsearch.indices.IndexSettings;
|
||||
import jakarta.annotation.PreDestroy;
|
||||
import org.hl7.fhir.instance.model.api.IIdType;
|
||||
import org.hl7.fhir.r4.model.Bundle;
|
||||
@@ -27,6 +25,8 @@ import org.hl7.fhir.r4.model.Patient;
|
||||
import org.hl7.fhir.r4.model.StringType;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
@@ -42,6 +42,7 @@ import org.testcontainers.junit.jupiter.Testcontainers;
|
||||
|
||||
@ExtendWith(SpringExtension.class)
|
||||
@Testcontainers
|
||||
@Disabled
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class}, properties =
|
||||
{
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4",
|
||||
@@ -50,19 +51,19 @@ import org.testcontainers.junit.jupiter.Testcontainers;
|
||||
"hapi.fhir.store_resource_in_lucene_index_enabled=true",
|
||||
"hapi.fhir.advanced_lucene_indexing=true",
|
||||
"hapi.fhir.search_index_full_text_enabled=true",
|
||||
|
||||
"elasticsearch.enabled=true",
|
||||
"hapi.fhir.cr_enabled=false",
|
||||
// Because the port is set randomly, we will set the rest_url using the Initializer.
|
||||
// "elasticsearch.rest_url='http://localhost:9200'",
|
||||
"elasticsearch.username=SomeUsername",
|
||||
"elasticsearch.password=SomePassword",
|
||||
"elasticsearch.debug.refresh_after_write=true",
|
||||
"elasticsearch.protocol=http",
|
||||
|
||||
"spring.elasticsearch.uris=http://localhost:9200",
|
||||
"spring.elasticsearch.username=elastic",
|
||||
"spring.elasticsearch.password=changeme",
|
||||
"spring.main.allow-bean-definition-overriding=true",
|
||||
"spring.jpa.properties.hibernate.search.enabled=true",
|
||||
"spring.jpa.properties.hibernate.search.backend.type=elasticsearch",
|
||||
"spring.jpa.properties.hibernate.search.backend.analysis.configurer=ca.uhn.fhir.jpa.search.elastic.HapiElasticsearchAnalysisConfigurer"
|
||||
"spring.jpa.properties.hibernate.search.backend.hosts=localhost:9200",
|
||||
"spring.jpa.properties.hibernate.search.backend.protocol=http",
|
||||
"spring.jpa.properties.hibernate.search.backend.analysis.configurer=ca.uhn.fhir.jpa.search.HapiHSearchAnalysisConfigurers$HapiElasticsearchAnalysisConfigurer"
|
||||
})
|
||||
@ContextConfiguration(initializers = ElasticsearchLastNR4IT.Initializer.class)
|
||||
class ElasticsearchLastNR4IT {
|
||||
@@ -73,26 +74,26 @@ class ElasticsearchLastNR4IT {
|
||||
public static ElasticsearchContainer embeddedElastic = TestElasticsearchContainerHelper.getEmbeddedElasticSearch();
|
||||
|
||||
@Autowired
|
||||
private ElasticsearchSvcImpl myElasticsearchSvc;
|
||||
private ElasticsearchBootSvcImpl myElasticsearchSvc;
|
||||
|
||||
@BeforeAll
|
||||
public static void beforeClass() throws IOException {
|
||||
//Given
|
||||
ElasticsearchClient elasticsearchHighLevelRestClient = ElasticsearchRestClientFactory.createElasticsearchHighLevelRestClient(
|
||||
"http", embeddedElastic.getHost() + ":" + embeddedElastic.getMappedPort(9200), "", "");
|
||||
// ElasticsearchClient elasticsearchHighLevelRestClient = ElasticsearchRestClientFactory.createElasticsearchHighLevelRestClient(
|
||||
// "http", embeddedElastic.getHost() + ":" + embeddedElastic.getMappedPort(9200), "", "");
|
||||
|
||||
/* As of 2023-08-10, HAPI FHIR sets SubscriptionConstants.MAX_SUBSCRIPTION_RESULTS to 50000
|
||||
which is in excess of elastic's default max_result_window. If MAX_SUBSCRIPTION_RESULTS is changed
|
||||
to a value <= 10000, the following will no longer be necessary. - dotasek
|
||||
*/
|
||||
|
||||
elasticsearchHighLevelRestClient.indices().putTemplate(t->{
|
||||
/* elasticsearchHighLevelRestClient.indices().putTemplate(t->{
|
||||
t.name("hapi_fhir_template");
|
||||
t.indexPatterns("*");
|
||||
t.settings(new IndexSettings.Builder().maxResultWindow(50000).build());
|
||||
return t;
|
||||
});
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
@PreDestroy
|
||||
@@ -103,7 +104,7 @@ class ElasticsearchLastNR4IT {
|
||||
@LocalServerPort
|
||||
private int port;
|
||||
|
||||
//@Test
|
||||
@Test
|
||||
void testLastN() throws IOException, InterruptedException {
|
||||
Thread.sleep(2000);
|
||||
|
||||
@@ -125,6 +126,7 @@ class ElasticsearchLastNR4IT {
|
||||
IIdType obsId = ourClient.create().resource(obs).execute().getId().toUnqualifiedVersionless();
|
||||
|
||||
myElasticsearchSvc.refreshIndex(ElasticsearchSvcImpl.OBSERVATION_INDEX);
|
||||
Thread.sleep(2000);
|
||||
|
||||
Parameters output = ourClient.operation().onType(Observation.class).named("lastn")
|
||||
.withParameter(Parameters.class, "max", new IntegerType(1))
|
||||
@@ -154,8 +156,10 @@ class ElasticsearchLastNR4IT {
|
||||
public void initialize(
|
||||
ConfigurableApplicationContext configurableApplicationContext) {
|
||||
// Since the port is dynamically generated, replace the URL with one that has the correct port
|
||||
TestPropertyValues.of("elasticsearch.rest_url=" + embeddedElastic.getHost() +":" + embeddedElastic.getMappedPort(9200))
|
||||
TestPropertyValues.of("spring.elasticsearch.uris=" + embeddedElastic.getHost() +":" + embeddedElastic.getMappedPort(9200))
|
||||
.applyTo(configurableApplicationContext.getEnvironment());
|
||||
TestPropertyValues.of("spring.jpa.properties.hibernate.search.backend.hosts=" + embeddedElastic.getHost() +":" + embeddedElastic.getMappedPort(9200))
|
||||
.applyTo(configurableApplicationContext.getEnvironment());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class}, properties =
|
||||
{
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr5_dbpm",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap",
|
||||
"hapi.fhir.fhir_version=r5",
|
||||
"hapi.fhir.partitioning.database_partition_mode_enabled=true",
|
||||
"hapi.fhir.partitioning.patient_id_partitioning_mode=true"
|
||||
|
||||
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
"hapi.fhir.fhir_version=dstu2",
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr2",
|
||||
"hapi.fhir.cr_enabled=false",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap"
|
||||
})
|
||||
class ExampleServerDstu2IT {
|
||||
|
||||
|
||||
@@ -49,7 +49,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
"hapi.fhir.subscription.websocket_enabled=true",
|
||||
"hapi.fhir.allow_external_references=true",
|
||||
"hapi.fhir.allow_placeholder_references=true",
|
||||
"spring.main.allow-bean-definition-overriding=true"
|
||||
"spring.main.allow-bean-definition-overriding=true",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap"
|
||||
})
|
||||
class ExampleServerDstu3IT implements IServerSupport {
|
||||
|
||||
|
||||
@@ -17,16 +17,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
|
||||
classes = {Application.class},
|
||||
properties = {
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4b",
|
||||
"hapi.fhir.enable_repository_validating_interceptor=true",
|
||||
"hapi.fhir.fhir_version=r4b",
|
||||
"hapi.fhir.subscription.websocket_enabled=false",
|
||||
"hapi.fhir.mdm_enabled=false",
|
||||
"hapi.fhir.cr_enabled=false",
|
||||
// Override is currently required when using MDM as the construction of the MDM
|
||||
// beans are ambiguous as they are constructed multiple places. This is evident
|
||||
// when running in a spring boot environment
|
||||
"spring.main.allow-bean-definition-overriding=true"})
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4b",
|
||||
"hapi.fhir.enable_repository_validating_interceptor=true",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap",
|
||||
"hapi.fhir.fhir_version=r4b",
|
||||
"hapi.fhir.subscription.websocket_enabled=false",
|
||||
"hapi.fhir.mdm_enabled=false",
|
||||
"hapi.fhir.cr_enabled=false",
|
||||
// Override is currently required when using MDM as the construction of the MDM
|
||||
// beans are ambiguous as they are constructed multiple places. This is evident
|
||||
// when running in a spring boot environment
|
||||
"spring.main.allow-bean-definition-overriding=true"})
|
||||
class ExampleServerR4BIT {
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExampleServerR4BIT.class);
|
||||
private IGenericClient ourClient;
|
||||
@@ -107,7 +108,6 @@ class ExampleServerR4BIT {
|
||||
}
|
||||
|
||||
|
||||
|
||||
@BeforeEach
|
||||
void beforeEach() {
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@ import static org.opencds.cqf.fhir.utility.r4.Parameters.stringPart;
|
||||
RepositoryConfig.class
|
||||
}, properties = {
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4",
|
||||
"spring.ai.mcp.server.enabled=false",
|
||||
"hapi.fhir.enable_repository_validating_interceptor=true",
|
||||
"hapi.fhir.fhir_version=r4",
|
||||
"hapi.fhir.subscription.websocket_enabled=true",
|
||||
@@ -70,6 +71,9 @@ import static org.opencds.cqf.fhir.utility.r4.Parameters.stringPart;
|
||||
// beans are ambiguous as they are constructed multiple places. This is evident
|
||||
// when running in a spring boot environment
|
||||
"spring.main.allow-bean-definition-overriding=true",
|
||||
"management.health.elasticsearch.enabled=false",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap",
|
||||
"management.endpoints.web.exposure.include=*",
|
||||
"hapi.fhir.remote_terminology_service.snomed.system=http://snomed.info/sct",
|
||||
"hapi.fhir.remote_terminology_service.snomed.url=https://tx.fhir.org/r4"
|
||||
})
|
||||
|
||||
@@ -29,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class}, properties =
|
||||
{
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr5",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap",
|
||||
"hapi.fhir.fhir_version=r5",
|
||||
"hapi.fhir.cr_enabled=false",
|
||||
"hapi.fhir.subscription.websocket_enabled=true",
|
||||
|
||||
@@ -33,7 +33,7 @@ public class McpTests {
|
||||
|
||||
var fhirContext = FhirContext.forR4();
|
||||
|
||||
var transport = HttpClientStreamableHttpTransport.builder("http://localhost:" + port).endpoint("/mcp/message").build();
|
||||
var transport = HttpClientStreamableHttpTransport.builder("http://localhost:" + port).endpoint("/mcp/messages").build();
|
||||
var client = McpClient.sync(transport).requestTimeout(Duration.ofSeconds(10)).capabilities(McpSchema.ClientCapabilities.builder().roots(true) // Enable roots capability
|
||||
.sampling().build()).build();
|
||||
var initializationResult = client.initialize();
|
||||
|
||||
@@ -8,19 +8,15 @@ import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import ca.uhn.fhir.jpa.api.config.JpaStorageSettings;
|
||||
import ca.uhn.fhir.jpa.nickname.INicknameSvc;
|
||||
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class}, properties = {
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {
|
||||
"hapi.fhir.fhir_version=r4",
|
||||
"hapi.fhir.mdm_enabled=true"
|
||||
})
|
||||
class MdmTest {
|
||||
@Autowired
|
||||
INicknameSvc nicknameService;
|
||||
|
||||
@Autowired
|
||||
JpaStorageSettings jpaStorageSettings;
|
||||
|
||||
@Autowired
|
||||
SubscriptionSettings subscriptionSettings;
|
||||
|
||||
@@ -25,6 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class}, properties =
|
||||
{
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4-mt",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap",
|
||||
"hapi.fhir.fhir_version=r4",
|
||||
"hapi.fhir.subscription.websocket_enabled=true",
|
||||
"hapi.fhir.cr_enabled=false",
|
||||
|
||||
@@ -30,7 +30,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {Application.class}, properties = {
|
||||
"spring.datasource.url=jdbc:h2:mem:dbr4",
|
||||
"hapi.fhir.fhir_version=r4",
|
||||
"hapi.fhir.userRequestRetryVersionConflictsInterceptorEnabled=true"
|
||||
"hapi.fhir.userRequestRetryVersionConflictsInterceptorEnabled=true",
|
||||
"spring.jpa.properties.hibernate.search.backend.directory.type=local-heap"
|
||||
})
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user