diff --git a/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/McpRouterController.java b/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/McpRouterController.java index 99773b7a..3ef467de 100644 --- a/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/McpRouterController.java +++ b/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/McpRouterController.java @@ -113,11 +113,16 @@ public class McpRouterController { } private List fetchAllActiveTools() { - List activeTools = redisRegistryService.getAllTools() - .stream() - .filter(ToolMetadata::getVisible) - .collect(Collectors.toList()); - + List activeTools = new ArrayList<>(); + try { + activeTools.addAll(redisRegistryService.getAllTools() + .stream() + .filter(ToolMetadata::getVisible) + .collect(Collectors.toList())); + } catch (org.springframework.data.redis.RedisConnectionFailureException exception) { + log.warn("Redis is unavailable. Fetching tools from configured fallback Tool Pods instead."); + } + Set knownTools = activeTools.stream() .map(ToolMetadata::getUid) .collect(Collectors.toSet()); diff --git a/dap-gateway/src/test/java/io/shinhanlife/dap/mcg/presentation/McpRouterControllerTest.java b/dap-gateway/src/test/java/io/shinhanlife/dap/mcg/presentation/McpRouterControllerTest.java new file mode 100644 index 00000000..d5a1a84f --- /dev/null +++ b/dap-gateway/src/test/java/io/shinhanlife/dap/mcg/presentation/McpRouterControllerTest.java @@ -0,0 +1,38 @@ +package io.shinhanlife.dap.mcg.presentation; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.shinhanlife.dap.lib.mcp.security.SecurityProperties; +import io.shinhanlife.dap.lib.adapter.dto.JsonRpcResponse; +import io.shinhanlife.dap.mcg.config.GatewayFallbackProperties; +import io.shinhanlife.dap.mcg.registry.RedisRegistryService; +import io.shinhanlife.dap.mcg.service.ExecuteService; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.springframework.data.redis.RedisConnectionFailureException; +import org.springframework.http.ResponseEntity; + +class McpRouterControllerTest { + + @Test + void returnsEmptyToolListWhenRedisIsUnavailableAndNoFallbackIsConfigured() { + RedisRegistryService registryService = org.mockito.Mockito.mock(RedisRegistryService.class); + when(registryService.getAllTools()).thenThrow(new RedisConnectionFailureException("Redis unavailable")); + + McpRouterController controller = new McpRouterController( + registryService, + org.mockito.Mockito.mock(ExecuteService.class), + org.mockito.Mockito.mock(SecurityProperties.class), + new ObjectMapper(), + new GatewayFallbackProperties()); + + ResponseEntity response = assertDoesNotThrow(() -> controller.listTools(null)); + Map result = (Map) response.getBody().getResult(); + + assertEquals(List.of(), result.get("tools")); + } +} \ No newline at end of file