From 496c6a1da8ed1f4d7d59969b55e6f5d3b444f15f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominique=20Eifl=C3=A4nder?= Date: Mon, 22 Jan 2024 15:15:23 +0100 Subject: [PATCH 1/3] RED-7128: Handle delete tenant events --- .../v1/server/queue/DeleteTenantListener.java | 38 +++++++++++++++++++ .../server/queue/MessagingConfiguration.java | 27 +++++++++++++ .../v1/server/service/IndexDeleteService.java | 4 ++ .../elasticsearch/IndexDeleteServiceImpl.java | 36 ++++++++++++++---- .../opensearch/IndexDeleteServiceImpl.java | 33 ++++++++++++---- 5 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantListener.java diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantListener.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantListener.java new file mode 100644 index 0000000..d0a6555 --- /dev/null +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantListener.java @@ -0,0 +1,38 @@ +package com.iqser.red.service.search.v1.server.queue; + +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.search.v1.server.service.IndexDeleteService; +import com.knecon.fforesight.tenantcommons.model.TenantResponse; + +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class DeleteTenantListener { + + private final IndexDeleteService indexDeleteService; + + @Value("${fforesight.multitenancy.tenant-delete-queue:tenant-delete}") + private String tenantDeleteQueue; + + + @PostConstruct + public void postConstruct() { + + log.info("Listener for tenant-delete started for queue: {}", this.tenantDeleteQueue); + } + + + @RabbitListener(queues = "${fforesight.multitenancy.tenant-delete-queue:tenant-delete}") + public void deleteTenant(TenantResponse tenant) { + + indexDeleteService.dropIndex(tenant.getSearchConnection()); + } + +} \ No newline at end of file diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java index 983445c..8d861cc 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java @@ -2,6 +2,8 @@ package com.iqser.red.service.search.v1.server.queue; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -21,6 +23,13 @@ public class MessagingConfiguration { public static final String X_ERROR_INFO_TIMESTAMP_HEADER = "x-error-message-timestamp"; + + @Value("${fforesight.multitenancy.tenant-delete-queue:tenant-delete}") + private String tenantDeleteEventQueue; + @Value("${fforesight.multitenancy.tenant-delete-dlq:tenant-delete-dlq}") + private String tenantDeleteDLQ; + + @Bean public Queue indexingQueue() { @@ -52,4 +61,22 @@ public class MessagingConfiguration { return QueueBuilder.durable(DELETE_FROM_INDEX_DLQ).build(); } + + // Tentant Delete Event Queue + + TopicExchange tenantExchange(@Value("${fforesight.tenant-exchange.name}") String tenantExchangeName) { + return new TopicExchange(tenantExchangeName); + } + + + public Queue tenantDeleteQueue() { + return QueueBuilder.durable(this.tenantDeleteEventQueue).withArgument("x-dead-letter-exchange", "").withArgument("x-dead-letter-routing-key", this.tenantDeleteDLQ).build(); + } + + + @Bean + public Queue tenantDeleteDLQ() { + return QueueBuilder.durable(this.tenantDeleteDLQ).build(); + } + } diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/IndexDeleteService.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/IndexDeleteService.java index 3a6dd16..16a8cd1 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/IndexDeleteService.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/IndexDeleteService.java @@ -1,5 +1,7 @@ package com.iqser.red.service.search.v1.server.service; +import com.knecon.fforesight.tenantcommons.model.SearchConnection; + public interface IndexDeleteService { void recreateIndex(); @@ -10,4 +12,6 @@ public interface IndexDeleteService { void dropIndex(); + void dropIndex(SearchConnection searchConnection); + } \ No newline at end of file diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/IndexDeleteServiceImpl.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/IndexDeleteServiceImpl.java index 29c23d1..a5e07bc 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/IndexDeleteServiceImpl.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/IndexDeleteServiceImpl.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.search.v1.server.exception.IndexException; import com.iqser.red.service.search.v1.server.service.IndexDeleteService; import com.iqser.red.service.search.v1.server.utils.IndexNameHelper; +import com.knecon.fforesight.tenantcommons.model.SearchConnection; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -32,9 +33,31 @@ public class IndexDeleteServiceImpl implements IndexDeleteService { @SneakyThrows public void closeIndex() { - var closeIndexResponse = clientCache.getClient() - .indices() - .close(i -> i.index(IndexNameHelper.getSearchIndex(clientCache.getClient().getSearchConnection().getIndexPrefix())).timeout(t -> t.time("2m"))); + closeIndex(clientCache.getClient(), clientCache.getClient().getSearchConnection().getIndexPrefix()); + + } + + + @SneakyThrows + public void dropIndex() { + + dropIndex(clientCache.getClient(), clientCache.getClient().getSearchConnection().getIndexPrefix()); + } + + + public void dropIndex(SearchConnection searchConnection) { + + var client = new EsClient(searchConnection); + closeIndex(client, searchConnection.getIndexPrefix()); + dropIndex(client, searchConnection.getIndexPrefix()); + } + + + @SneakyThrows + private void closeIndex(EsClient client, String indexPrefix) { + + var closeIndexResponse = client.indices() + .close(i -> i.index(IndexNameHelper.getSearchIndex(indexPrefix)).timeout(t -> t.time("2m"))); if (closeIndexResponse.acknowledged()) { log.info("Index is closed"); } else { @@ -44,12 +67,11 @@ public class IndexDeleteServiceImpl implements IndexDeleteService { @SneakyThrows - public void dropIndex() { + private void dropIndex(EsClient client, String indexPrefix) { log.info("Will drop index"); - var deleteIndexResponse = clientCache.getClient() - .indices() - .delete(i -> i.index(IndexNameHelper.getSearchIndex(clientCache.getClient().getSearchConnection().getIndexPrefix())).timeout(t -> t.time("2m"))); + var deleteIndexResponse = client.indices() + .delete(i -> i.index(IndexNameHelper.getSearchIndex(indexPrefix)).timeout(t -> t.time("2m"))); if (deleteIndexResponse.acknowledged()) { log.info("Index is dropped"); diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/IndexDeleteServiceImpl.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/IndexDeleteServiceImpl.java index 377baf8..cd3832a 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/IndexDeleteServiceImpl.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/IndexDeleteServiceImpl.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.search.v1.server.exception.IndexException; import com.iqser.red.service.search.v1.server.service.IndexDeleteService; import com.iqser.red.service.search.v1.server.utils.IndexNameHelper; +import com.knecon.fforesight.tenantcommons.model.SearchConnection; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -32,9 +33,29 @@ public class IndexDeleteServiceImpl implements IndexDeleteService { @SneakyThrows public void closeIndex() { - var closeIndexResponse = clientCache.getClient() - .indices() - .close(i -> i.index(IndexNameHelper.getSearchIndex(clientCache.getClient().getSearchConnection().getIndexPrefix())).timeout(t -> t.time("2m"))); + closeIndex(clientCache.getClient(), clientCache.getClient().getSearchConnection().getIndexPrefix()); + } + + + @SneakyThrows + public void dropIndex() { + + dropIndex(clientCache.getClient(), clientCache.getClient().getSearchConnection().getIndexPrefix()); + } + + + public void dropIndex(SearchConnection searchConnection) { + + var client = new OpensearchClient(searchConnection); + closeIndex(client, searchConnection.getIndexPrefix()); + dropIndex(client, searchConnection.getIndexPrefix()); + } + + + @SneakyThrows + private void closeIndex(OpensearchClient opensearchClient, String indexPrefix) { + + var closeIndexResponse = opensearchClient.indices().close(i -> i.index(IndexNameHelper.getSearchIndex(indexPrefix)).timeout(t -> t.time("2m"))); if (closeIndexResponse.acknowledged()) { log.info("Index is closed"); } else { @@ -44,12 +65,10 @@ public class IndexDeleteServiceImpl implements IndexDeleteService { @SneakyThrows - public void dropIndex() { + private void dropIndex(OpensearchClient opensearchClient, String indexPrefix) { log.info("Will drop index"); - var deleteIndexResponse = clientCache.getClient() - .indices() - .delete(i -> i.index(IndexNameHelper.getSearchIndex(clientCache.getClient().getSearchConnection().getIndexPrefix())).timeout(t -> t.time("2m"))); + var deleteIndexResponse = opensearchClient.indices().delete(i -> i.index(IndexNameHelper.getSearchIndex(indexPrefix)).timeout(t -> t.time("2m"))); if (deleteIndexResponse.acknowledged()) { log.info("Index is dropped"); From 3f7373f55d107ab23a5bebceae5a3776a10c76ca Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 25 Jan 2024 09:51:00 +0100 Subject: [PATCH 2/3] RED-6668: introduce delete tenant endpoint: fixed topic exchange code --- ...tener.java => DeleteTenantMessageReceiver.java} | 6 +++--- .../v1/server/queue/MessagingConfiguration.java | 14 +++++++++++++- .../src/main/resources/application.yml | 5 ++++- 3 files changed, 20 insertions(+), 5 deletions(-) rename search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/{DeleteTenantListener.java => DeleteTenantMessageReceiver.java} (91%) diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantListener.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantMessageReceiver.java similarity index 91% rename from search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantListener.java rename to search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantMessageReceiver.java index d0a6555..1727dc0 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantListener.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/DeleteTenantMessageReceiver.java @@ -14,11 +14,11 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor -public class DeleteTenantListener { +public class DeleteTenantMessageReceiver { private final IndexDeleteService indexDeleteService; - @Value("${fforesight.multitenancy.tenant-delete-queue:tenant-delete}") + @Value("${fforesight.multitenancy.tenant-delete-queue:tenant-delete-queue}") private String tenantDeleteQueue; @@ -29,7 +29,7 @@ public class DeleteTenantListener { } - @RabbitListener(queues = "${fforesight.multitenancy.tenant-delete-queue:tenant-delete}") + @RabbitListener(queues = "${fforesight.multitenancy.tenant-delete-queue:tenant-delete-queue}") public void deleteTenant(TenantResponse tenant) { indexDeleteService.dropIndex(tenant.getSearchConnection()); diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java index 8d861cc..77bd640 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/MessagingConfiguration.java @@ -1,8 +1,11 @@ package com.iqser.red.service.search.v1.server.queue; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; import org.springframework.amqp.core.TopicExchange; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -24,11 +27,18 @@ public class MessagingConfiguration { - @Value("${fforesight.multitenancy.tenant-delete-queue:tenant-delete}") + @Value("${fforesight.multitenancy.tenant-delete-queue:tenant-delete-queue}") private String tenantDeleteEventQueue; @Value("${fforesight.multitenancy.tenant-delete-dlq:tenant-delete-dlq}") private String tenantDeleteDLQ; + @Bean + public Binding tenantExchangeDeleteBinding(@Qualifier("tenantUserManagementTenantDeleteQueue") Queue tenantUserManagementTenantDeleteQueue, + @Qualifier("tenantExchange") TopicExchange tenantExchange) { + + return BindingBuilder.bind(tenantUserManagementTenantDeleteQueue).to(tenantExchange).with("tenant.delete"); + } + @Bean public Queue indexingQueue() { @@ -64,11 +74,13 @@ public class MessagingConfiguration { // Tentant Delete Event Queue + @Bean(name = "tenantExchange") TopicExchange tenantExchange(@Value("${fforesight.tenant-exchange.name}") String tenantExchangeName) { return new TopicExchange(tenantExchangeName); } + @Bean("tenantUserManagementTenantDeleteQueue") public Queue tenantDeleteQueue() { return QueueBuilder.durable(this.tenantDeleteEventQueue).withArgument("x-dead-letter-exchange", "").withArgument("x-dead-letter-routing-key", this.tenantDeleteDLQ).build(); } diff --git a/search-service-v1/search-service-server-v1/src/main/resources/application.yml b/search-service-v1/search-service-server-v1/src/main/resources/application.yml index c68a48e..8a17d77 100644 --- a/search-service-v1/search-service-server-v1/src/main/resources/application.yml +++ b/search-service-v1/search-service-server-v1/src/main/resources/application.yml @@ -3,7 +3,10 @@ info: persistence-service.url: "http://persistence-service-v1:8080" tenant-user-management-service.url: "http://tenant-user-management-service:8080/internal" -fforesight.tenants.remote: true + +fforesight: + tenants.remote: true + tenant-exchange.name: 'tenants-exchange' logging.pattern.level: "%5p [${spring.application.name},%X{traceId:-},%X{spanId:-}]" From 4296abab94eca9a9b5d271c6794edbb5b3ad633b Mon Sep 17 00:00:00 2001 From: yhampe Date: Fri, 26 Jan 2024 08:51:19 +0100 Subject: [PATCH 3/3] RED-6668: introduce delete tenant endpoint: fixed missing value in test configuration --- .../src/test/resources/application.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/search-service-v1/search-service-server-v1/src/test/resources/application.yml b/search-service-v1/search-service-server-v1/src/test/resources/application.yml index a752fbd..316a912 100644 --- a/search-service-v1/search-service-server-v1/src/test/resources/application.yml +++ b/search-service-v1/search-service-server-v1/src/test/resources/application.yml @@ -7,6 +7,11 @@ logging.type: ${LOGGING_TYPE:CONSOLE} logging.level.root: INFO + +fforesight: + tenant-exchange: + name: 'tenants-exchange' + spring: main: allow-bean-definition-overriding: true