diff --git a/publish-custom-image.sh b/publish-custom-image.sh
new file mode 100755
index 0000000..89b9f8d
--- /dev/null
+++ b/publish-custom-image.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+dir=${PWD##*/}
+gradle assemble
+
+# Get the current Git branch
+branch=$(git rev-parse --abbrev-ref HEAD)
+
+# Get the short commit hash (first 5 characters)
+commit_hash=$(git rev-parse --short=5 HEAD)
+
+# Combine branch and commit hash
+buildName="${USER}-${branch}-${commit_hash}"
+
+gradle bootBuildImage --cleanCache --publishImage -PbuildbootDockerHostNetwork=true -Pversion=$buildName
+echo "nexus.knecon.com:5001/red/${dir}-server-v1:$buildName"
diff --git a/search-service-v1/search-service-server-v1/build.gradle.kts b/search-service-v1/search-service-server-v1/build.gradle.kts
index 0baf570..f322c60 100644
--- a/search-service-v1/search-service-server-v1/build.gradle.kts
+++ b/search-service-v1/search-service-server-v1/build.gradle.kts
@@ -3,7 +3,7 @@ import org.springframework.boot.gradle.tasks.bundling.BootBuildImage
plugins {
application
id("com.iqser.red.service.java-conventions")
- id("org.springframework.boot") version "3.0.4"
+ id("org.springframework.boot") version "3.1.5"
id("io.spring.dependency-management") version "1.1.3"
id("org.sonarqube") version "4.4.1.3373"
id("io.freefair.lombok") version "8.4"
@@ -13,28 +13,34 @@ description = "search-service-server-v1"
configurations {
all {
- exclude(group = "org.springframework.boot", module = "spring-boot-starter-logging")
+ exclude(group = "commons-logging", module = "commons-logging")
+ exclude(group = "org.springframework.boot", module = "spring-boot-starter-log4j2")
+ exclude(group = "com.iqser.red.commons", module = "logging-commons")
}
}
+val springBootStarterVersion = "3.1.5"
+
dependencies {
- api("com.knecon.fforesight:tenant-commons:0.13.0")
+ api("com.knecon.fforesight:tenant-commons:0.14.0")
+ api("com.knecon.fforesight:tracing:0.5.0")
api("com.google.guava:guava:31.1-jre")
- api("com.iqser.red.commons:storage-commons:2.27.0")
+ api("com.iqser.red.commons:storage-commons:2.45.0")
api(project(":search-service-api-v1"))
api("com.iqser.red.service:persistence-service-internal-api-v1:2.93.0")
api("com.iqser.red.commons:spring-commons:2.1.0")
- api("com.iqser.red.commons:logging-commons:2.1.0")
api("com.iqser.red.commons:metric-commons:2.1.0")
api("com.iqser.red.commons:jackson-commons:2.1.0")
api("co.elastic.clients:elasticsearch-java:8.6.2")
api("org.opensearch.client:opensearch-rest-client:2.6.0")
api("org.opensearch.client:opensearch-java:2.3.0")
api("jakarta.json:jakarta.json-api:2.1.1")
- api("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.1")
- api("org.springframework.boot:spring-boot-starter-aop:3.0.4")
- api("org.springframework.boot:spring-boot-starter-amqp:3.0.4")
- testImplementation("org.springframework.boot:spring-boot-starter-test:3.0.4")
+ api("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.4")
+ api("org.springframework.boot:spring-boot-starter-aop:${springBootStarterVersion}")
+ api("org.springframework.boot:spring-boot-starter-amqp:${springBootStarterVersion}")
+ api("net.logstash.logback:logstash-logback-encoder:7.4")
+ api("ch.qos.logback:logback-classic")
+ testImplementation("org.springframework.boot:spring-boot-starter-test:${springBootStarterVersion}")
testImplementation("com.iqser.red.commons:test-commons:2.1.0")
testImplementation("org.testcontainers:elasticsearch:1.17.6")
testImplementation("org.opensearch:opensearch-testcontainers:2.0.0")
diff --git a/search-service-v1/search-service-server-v1/src/main/resources/application-dev.yaml b/search-service-v1/search-service-server-v1/src/main/resources/application-dev.yml
similarity index 100%
rename from search-service-v1/search-service-server-v1/src/main/resources/application-dev.yaml
rename to search-service-v1/search-service-server-v1/src/main/resources/application-dev.yml
diff --git a/search-service-v1/search-service-server-v1/src/main/resources/application.yaml b/search-service-v1/search-service-server-v1/src/main/resources/application.yml
similarity index 67%
rename from search-service-v1/search-service-server-v1/src/main/resources/application.yaml
rename to search-service-v1/search-service-server-v1/src/main/resources/application.yml
index 22c1f6d..c68a48e 100644
--- a/search-service-v1/search-service-server-v1/src/main/resources/application.yaml
+++ b/search-service-v1/search-service-server-v1/src/main/resources/application.yml
@@ -5,10 +5,19 @@ persistence-service.url: "http://persistence-service-v1:8080"
tenant-user-management-service.url: "http://tenant-user-management-service:8080/internal"
fforesight.tenants.remote: true
+logging.pattern.level: "%5p [${spring.application.name},%X{traceId:-},%X{spanId:-}]"
+
+logging.type: ${LOGGING_TYPE:CONSOLE}
+kubernetes.namespace: ${NAMESPACE:default}
+project.version: 1.0-SNAPSHOT
+
+
server:
port: 8080
spring:
+ application:
+ name: search-service
main:
allow-circular-references: true # FIXME
profiles:
@@ -35,9 +44,11 @@ management:
health.enabled: true
endpoints.web.exposure.include: prometheus, health
metrics.export.prometheus.enabled: ${monitoring.enabled:false}
+ tracing:
+ enabled: ${TRACING_ENABLED:false}
+ sampling:
+ probability: ${TRACING_PROBABILITY:1.0}
+ otlp:
+ tracing:
+ endpoint: ${OTLP_ENDPOINT:http://otel-collector-opentelemetry-collector.otel-collector:4318/v1/traces}
-search:
- backend: elasticsearch
-
-storage:
- backend: 's3'
diff --git a/search-service-v1/search-service-server-v1/src/main/resources/log4j2.xml b/search-service-v1/search-service-server-v1/src/main/resources/log4j2.xml
deleted file mode 100644
index c36f74e..0000000
--- a/search-service-v1/search-service-server-v1/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- ${env:LOGGING_TYPE}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/search-service-v1/search-service-server-v1/src/main/resources/logback-spring.xml b/search-service-v1/search-service-server-v1/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..33b2cef
--- /dev/null
+++ b/search-service-v1/search-service-server-v1/src/main/resources/logback-spring.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java
index b1f9c2c..f2315a7 100644
--- a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java
+++ b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java
@@ -26,9 +26,11 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.testcontainers.elasticsearch.ElasticsearchContainer;
import org.testcontainers.utility.DockerImageName;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.iqser.red.service.search.v1.server.Application;
import com.iqser.red.storage.commons.StorageAutoConfiguration;
import com.iqser.red.storage.commons.service.StorageService;
+import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.tenantcommons.TenantsClient;
import com.knecon.fforesight.tenantcommons.model.SearchConnection;
@@ -58,7 +60,14 @@ public abstract class AbstractElasticsearchIntegrationTest {
TenantContext.setTenantId("redaction");
when(tenantsClient.getTenant("redaction")).thenReturn(TenantResponse.builder()
- .searchConnection(SearchConnection.builder().hosts(Set.of("localhost")).port(port).scheme("http").numberOfShards("1").numberOfReplicas("5").indexPrefix("indexprefix").build())
+ .searchConnection(SearchConnection.builder()
+ .hosts(Set.of("localhost"))
+ .port(port)
+ .scheme("http")
+ .numberOfShards("1")
+ .numberOfReplicas("5")
+ .indexPrefix("indexprefix")
+ .build())
.build());
}
@@ -82,14 +91,14 @@ public abstract class AbstractElasticsearchIntegrationTest {
@Configuration
@EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class})
- @ComponentScan(excludeFilters={@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE, value=StorageAutoConfiguration.class)})
+ @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)})
public static class TestConfiguration {
@Bean
@Primary
- public StorageService inmemoryStorage() {
+ public StorageService inmemoryStorage(ObjectMapper objectMapper) {
- return new FileSystemBackedStorageService();
+ return new FileSystemBackedStorageService(objectMapper);
}
}
diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractOpensearchIntegrationTest.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractOpensearchIntegrationTest.java
index 8b018c5..3ca3f5d 100644
--- a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractOpensearchIntegrationTest.java
+++ b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractOpensearchIntegrationTest.java
@@ -25,9 +25,11 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.testcontainers.utility.DockerImageName;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.iqser.red.service.search.v1.server.Application;
import com.iqser.red.storage.commons.StorageAutoConfiguration;
import com.iqser.red.storage.commons.service.StorageService;
+import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.tenantcommons.TenantsClient;
import com.knecon.fforesight.tenantcommons.model.SearchConnection;
@@ -56,7 +58,14 @@ public abstract class AbstractOpensearchIntegrationTest {
TenantContext.setTenantId("redaction");
when(tenantsClient.getTenant("redaction")).thenReturn(TenantResponse.builder()
- .searchConnection(SearchConnection.builder().hosts(Set.of("localhost")).port(port).scheme("http").numberOfShards("1").numberOfReplicas("5").indexPrefix("indexprefix").build())
+ .searchConnection(SearchConnection.builder()
+ .hosts(Set.of("localhost"))
+ .port(port)
+ .scheme("http")
+ .numberOfShards("1")
+ .numberOfReplicas("5")
+ .indexPrefix("indexprefix")
+ .build())
.build());
}
@@ -80,14 +89,14 @@ public abstract class AbstractOpensearchIntegrationTest {
@Configuration
@EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class})
- @ComponentScan(excludeFilters={@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE, value=StorageAutoConfiguration.class)})
+ @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)})
public static class TestConfiguration {
@Bean
@Primary
- public StorageService inmemoryStorage() {
+ public StorageService inmemoryStorage(ObjectMapper objectMapper) {
- return new FileSystemBackedStorageService();
+ return new FileSystemBackedStorageService(objectMapper);
}
}
diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/FileSystemBackedStorageService.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/FileSystemBackedStorageService.java
deleted file mode 100644
index 48d7fd9..0000000
--- a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/FileSystemBackedStorageService.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package com.iqser.red.service.search.v1.server.service;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import org.apache.commons.io.IOUtils;
-import org.springframework.core.io.InputStreamResource;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.iqser.red.commons.jackson.ObjectMapperFactory;
-import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
-import com.iqser.red.storage.commons.service.StorageService;
-
-import lombok.SneakyThrows;
-
-public class FileSystemBackedStorageService implements StorageService {
-
- private final Map dataMap = new HashMap<>();
-
-
- public FileSystemBackedStorageService() {
-
- }
-
-
- @SneakyThrows
- @Override
- public void downloadTo(String tenantId, String objectId, File destinationFile) {
-
- var res = dataMap.get(objectId);
- if (res == null) {
- throw new StorageObjectDoesNotExist(new RuntimeException());
- }
-
- IOUtils.copy(new FileInputStream(res), new FileOutputStream(destinationFile));
- }
-
-
- @Override
- public void deleteObject(String tenantId, String objectId) {
-
- dataMap.remove(objectId);
- }
-
-
- @Override
- public boolean objectExists(String tenantId, String objectId) {
-
- return dataMap.containsKey(objectId);
- }
-
-
- @Override
- @SneakyThrows
- public void storeJSONObject(String tenantId, String objectId, T any) {
-
- File tempFile = File.createTempFile("test", ".tmp");
- getMapper().writeValue(new FileOutputStream(tempFile), any);
- dataMap.put(objectId, tempFile);
- }
-
-
- private ObjectMapper getMapper() {
-
- return ObjectMapperFactory.create();
- }
-
-
- @Override
- @SneakyThrows
- public T readJSONObject(String tenantId, String objectId, Class clazz) {
-
- if (dataMap.get(objectId) == null || !dataMap.get(objectId).exists()) {
- throw new StorageObjectDoesNotExist("Stored object not found");
- }
- return getMapper().readValue(new FileInputStream(dataMap.get(objectId)), clazz);
- }
-
-
- public List listPaths() {
-
- return new ArrayList<>(dataMap.keySet());
- }
-
-
- public List listFilePaths() {
-
- return dataMap.values().stream().map(File::getAbsolutePath).collect(Collectors.toList());
- }
-
-
- @Override
- @SneakyThrows
- public void storeObject(String tenantId, String objectId, InputStream stream) {
-
- File tempFile = File.createTempFile("test", ".tmp");
-
- try (var fileOutputStream = new FileOutputStream(tempFile)) {
- IOUtils.copy(stream, fileOutputStream);
- }
-
- dataMap.put(objectId, tempFile);
- }
-
-
- public void clearStorage() {
-
- this.dataMap.forEach((k, v) -> {
- v.delete();
- });
- this.dataMap.clear();
- }
-
-}