From b247b9abfcf64949563e136ca48fbfde4b059d4a Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 02:47:11 +0000 Subject: [PATCH 1/2] RSDK-10329: Apply log_configuration level on reconfigure for modular resources When a Reconfigurable resource was reconfigured, the log_configuration.level from the new config was not applied to the resource's logger. Only the non-Reconfigurable path (which re-adds the resource) applied the log level. This adds update_log_level() after reconfigure() in the Reconfigurable branch of reconfigure_resource(), so that clicking "Enable debug logs" in the UI actually takes effect. Co-Authored-By: Claude Opus 4.6 --- src/viam/module/module.py | 1 + tests/test_module.py | 51 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/viam/module/module.py b/src/viam/module/module.py index 463986c78..bf0f5fc5d 100644 --- a/src/viam/module/module.py +++ b/src/viam/module/module.py @@ -241,6 +241,7 @@ async def reconfigure_resource(self, request: ReconfigureResourceRequest): resource = self.server.get_resource(ResourceBase, rn) if isinstance(resource, Reconfigurable): resource.reconfigure(config, dependencies) + update_log_level(resource.logger, config.log_configuration.level.upper()) else: if isinstance(resource, Stoppable): if iscoroutinefunction(resource.stop): diff --git a/tests/test_module.py b/tests/test_module.py index a0c4d59db..e705bf2c4 100644 --- a/tests/test_module.py +++ b/tests/test_module.py @@ -1,4 +1,5 @@ import datetime +import logging import os import uuid from unittest import mock @@ -10,7 +11,7 @@ from viam.module import Module from viam.module.resource_data_consumer import ResourceDataConsumer from viam.module.service import ModuleRPCService -from viam.proto.app.robot import ComponentConfig +from viam.proto.app.robot import ComponentConfig, LogConfiguration from viam.proto.module import ( AddResourceRequest, ModuleServiceStub, @@ -138,6 +139,54 @@ async def test_reconfigure_resource(self, module: Module): await module.reconfigure_resource(req) assert summer.subtract is True + async def test_add_resource_applies_log_level(self, module: Module): + req = AddResourceRequest( + config=ComponentConfig( + name="gizmo_log", + namespace="acme", + type="gizmo", + model="acme:demo:mygizmo", + attributes=dict_to_struct({"arg1": "arg1", "motor": "motor1"}), + api="acme:component:gizmo", + log_configuration=LogConfiguration(level="debug"), + ) + ) + await module.add_resource(req) + gizmo = module.server.get_resource(MyGizmo, Gizmo.get_resource_name("gizmo_log")) + assert gizmo.logger.level == logging.DEBUG + + async def test_reconfigure_resource_applies_log_level(self, module: Module): + # Add a resource with default (INFO) log level + req = AddResourceRequest( + config=ComponentConfig( + name="gizmo_reconf_log", + namespace="acme", + type="gizmo", + model="acme:demo:mygizmo", + attributes=dict_to_struct({"arg1": "arg1", "motor": "motor1"}), + api="acme:component:gizmo", + ) + ) + await module.add_resource(req) + gizmo = module.server.get_resource(MyGizmo, Gizmo.get_resource_name("gizmo_reconf_log")) + assert gizmo.logger.level != logging.DEBUG + + # Reconfigure with debug log level + req = ReconfigureResourceRequest( + config=ComponentConfig( + name="gizmo_reconf_log", + namespace="acme", + type="gizmo", + model="acme:demo:mygizmo", + attributes=dict_to_struct({"arg1": "arg2", "motor": "motor1"}), + api="acme:component:gizmo", + log_configuration=LogConfiguration(level="debug"), + ) + ) + await module.reconfigure_resource(req) + assert gizmo.my_arg == "arg2" + assert gizmo.logger.level == logging.DEBUG + async def test_add_resource_with_deps(self, robot_service: RobotService, module: Module): # noqa: F811 async with ChannelFor([robot_service]) as channel: _ = mock.patch("viam.module.module.Module._connect_to_parent") From 940a13fdf48356be149175b07d7e2c4c552d6c9d Mon Sep 17 00:00:00 2001 From: Allison Chiang Date: Thu, 19 Mar 2026 17:46:09 -0400 Subject: [PATCH 2/2] Update test_module.py --- tests/test_module.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/test_module.py b/tests/test_module.py index e705bf2c4..cf420d0db 100644 --- a/tests/test_module.py +++ b/tests/test_module.py @@ -187,6 +187,20 @@ async def test_reconfigure_resource_applies_log_level(self, module: Module): assert gizmo.my_arg == "arg2" assert gizmo.logger.level == logging.DEBUG + # Reconfigure with no log_configuration + req = ReconfigureResourceRequest( + config=ComponentConfig( + name="gizmo_reconf_log", + namespace="acme", + type="gizmo", + model="acme:demo:mygizmo", + attributes=dict_to_struct({"arg1": "arg2", "motor": "motor1"}), + api="acme:component:gizmo", + ) + ) + await module.reconfigure_resource(req) + assert gizmo.logger.level == logging.INFO + async def test_add_resource_with_deps(self, robot_service: RobotService, module: Module): # noqa: F811 async with ChannelFor([robot_service]) as channel: _ = mock.patch("viam.module.module.Module._connect_to_parent")