From 2ee566ce1f8184bfaf8b5c6fb40fabf48ee4feb3 Mon Sep 17 00:00:00 2001 From: Ramgopal Nagaboina Date: Wed, 9 Sep 2026 18:35:14 -0400 Subject: [PATCH] network: skip dhcp and dns health checks on internal LB routers An internal LB VM runs only the load balancer, but it was given the full virtual router health check set, so the dhcp and dns checks failed on every advanced health check run and flooded the event log. Exclude those checks for a router whose role is internal LB, using the existing per-router excluded-checks mechanism. Fixes: #12658 --- .../VirtualNetworkApplianceManagerImpl.java | 4 ++++ ...irtualNetworkApplianceManagerImplTest.java | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index bd73e67f10b5..5befa01bf2ed 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -276,6 +276,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V private static final String FILESYSTEM_WRITABLE_TEST = "filesystem.writable.test"; private static final String READONLY_FILESYSTEM_ERROR = "Read-only file system"; private static final String BACKUP_ROUTER_EXCLUDED_TESTS = "gateways_check.py"; + private static final String INTERNAL_LB_EXCLUDED_TESTS = "dhcp_check.py,dns_check.py"; /** * Used regex to ensure that the value that will be passed to the VR is an acceptable value */ @@ -1616,6 +1617,9 @@ private SetMonitorServiceCommand createMonitorServiceCommand(DomainRouterVO rout excludedTests = excludedTests.isEmpty() ? BACKUP_ROUTER_EXCLUDED_TESTS : excludedTests + "," + BACKUP_ROUTER_EXCLUDED_TESTS; } } + if (router.getRole() == Role.INTERNAL_LB_VM) { + excludedTests = excludedTests.isEmpty() ? INTERNAL_LB_EXCLUDED_TESTS : excludedTests + "," + INTERNAL_LB_EXCLUDED_TESTS; + } command.setAccessDetail(SetMonitorServiceCommand.ROUTER_HEALTH_CHECKS_EXCLUDED, excludedTests); command.setHealthChecksConfig(routerHealthCheckConfig); diff --git a/server/src/test/java/com/cloud/network/router/VirtualNetworkApplianceManagerImplTest.java b/server/src/test/java/com/cloud/network/router/VirtualNetworkApplianceManagerImplTest.java index 1e55f55fbd67..7ec4f47454e5 100644 --- a/server/src/test/java/com/cloud/network/router/VirtualNetworkApplianceManagerImplTest.java +++ b/server/src/test/java/com/cloud/network/router/VirtualNetworkApplianceManagerImplTest.java @@ -67,6 +67,7 @@ import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserStatisticsDao; import com.cloud.user.dao.UserStatsLogDao; +import com.cloud.agent.api.routing.SetMonitorServiceCommand; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineManager; @@ -91,6 +92,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.nullable; @@ -354,6 +356,28 @@ public void checkLogrotateTimerPatternTestMatchesWithRegex(){ Assert.assertTrue(result); } + @Test + public void testInternalLbRouterExcludesDhcpAndDnsHealthChecks() throws Exception { + DomainRouterVO router = Mockito.mock(DomainRouterVO.class); + when(router.getId()).thenReturn(1L); + when(router.getInstanceName()).thenReturn("r-1-VM"); + when(router.getDataCenterId()).thenReturn(1L); + when(router.getIsRedundantRouter()).thenReturn(false); + when(router.getRole()).thenReturn(VirtualRouter.Role.INTERNAL_LB_VM); + when(_routerControlHelper.getRouterControlIp(1L)).thenReturn("169.254.0.1"); + + java.lang.reflect.Method method = VirtualNetworkApplianceManagerImpl.class.getDeclaredMethod( + "createMonitorServiceCommand", DomainRouterVO.class, List.class, boolean.class, boolean.class, Map.class); + method.setAccessible(true); + SetMonitorServiceCommand command = (SetMonitorServiceCommand) method.invoke( + virtualNetworkApplianceManagerImpl, router, null, true, true, null); + + String excluded = command.getAccessDetail(SetMonitorServiceCommand.ROUTER_HEALTH_CHECKS_EXCLUDED); + Assert.assertNotNull(excluded); + Assert.assertTrue("Internal LB VM should exclude dhcp and dns health checks, got: " + excluded, + excluded.contains("dhcp_check.py") && excluded.contains("dns_check.py")); + } + @Test public void testFinalizeNetworkRulesForNetwork() { Long guestNetworkId = 10L;