)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"d973e6987c62b81a8b1a8facde933f53064ab8d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"edbf1e85_e6e30287","updated":"2025-10-24 15:45:09.000000000","message":"FYI, requirement patch here:\n\nhttps://review.opendev.org/c/openstack/requirements/+/964797","commit_id":"b1e191ab5da32d5e5442f542e78f3ef33bfae535"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"f7a51dd08063ef3df9c090e04b420569c10910e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"97d982bf_32e0e3a0","updated":"2025-10-29 10:47:13.000000000","message":"recheck","commit_id":"fa0b39fb32503a463e51e808a21252a5855a328b"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f07507de_ed466bfc","updated":"2025-11-05 11:28:56.000000000","message":"I added some comments and suggested a few changes. But I think replacing the request-aws is a good idea as well as adding the ability to chose between swift and radosgw. Thank you for working on this!","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":4264,"name":"Matthias Runge","email":"mrunge@redhat.com","username":"mrunge"},"change_message_id":"6d46d240f35059b2ec5a7edeab2dcd3c3e7bf2a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"95d0681f_c378a524","updated":"2025-11-07 09:01:00.000000000","message":"There is something broken in the CI tests, not sure if it was before, but now it is\n\n2025-11-03 10:48:29.892005 | ubuntu-jammy | {0} ceilometer.tests.unit.objectstore.test_rgw.TestRgwPollster.test_only_poll_assigned(radosgw.objects) [0.031793s] ... ok\n2025-11-03 10:48:29.920892 | ubuntu-jammy | Definitions: {\u0027archive_policy_default\u0027: \u0027ceilometer-low\u0027, \u0027archive_policies\u0027: [{\u0027name\u0027: \u0027ceilometer-low\u0027, \u0027aggregation_methods\u0027: [\u0027mean\u0027], \u0027back_window\u0027: 0, \u0027definition\u0027: [{\u0027granularity\u0027: \u00275 minutes\u0027, \u0027timespan\u0027: \u002730 days\u0027}]}, {\u0027name\u0027: \u0027ceilometer-low-rate\u0027, \u0027aggregation_methods\u0027: [\u0027mean\u0027, \u0027rate:mean\u0027], \u0027back_window\u0027: 0, \u0027definition\u0027: [{\u0027granularity\u0027: \u00275 minutes\u0027, \u0027timespan\u0027: \u002730 days\u0027}]}, {\u0027name\u0027: \u0027ceilometer-high\u0027, \u0027aggregation_methods\u0027: [\u0027mean\u0027], \u0027back_window\u0027: 0, \u0027definition\u0027: [{\u0027granularity\u0027: \u00271 second\u0027, \u0027timespan\u0027: \u00271 hour\u0027}, {\u0027granularity\u0027: \u00271 minute\u0027, \u0027timespan\u0027: \u00271 day\u0027}, {\u0027granularity\u0027: \u00271 hour\u0027, \u0027timespan\u0027: \u0027365 days\u0027}]}, {\u0027name\u0027: \u0027ceilometer-high-rate\u0027, \u0027aggregation_methods\u0027: [\u0027mean\u0027, \u0027rate:mean\u0027], \u0027back_window\u0027: 0, \u0027definition\u0027: [{\u0027granularity\u0027: \u00271 second\u0027, \u0027timespan\u0027: \u00271 hour\u0027}, {\u0027granularity\u0027: \u00271 minute\u0027, \u0027timespan\u0027: \u00271 day\u0027}, {\u0027granularity\u0027: \u00271 hour\u0027, \u0027timespan\u0027: \u0027365 days\u0027}]}], \u0027resources\u0027: [{\u0027resource_type\u0027: \u0027identity\u0027, \u0027metrics\u0027: {\u0027identity.authenticate.success\u0027: None, \u0027identity.authenticate.pending\u0027: None, \u0027identity.authenticate.failure\u0027: None, \u0027identity.user.created\u0027: None, \u0027identity.user.deleted\u0027: None, \u0027identity.user.updated\u0027: None, \u0027identity.group.created\u0027: None, \u0027identity.group.deleted\u0027: None, \u0027identity.group.updated\u0027: None, \u0027identity.role.created\u0027: None, \u0027identity.role.deleted\u0027: None, \u0027identity.role.updated\u0027: None, \u0027identity.project.created\u0027: None, \u0027identity.project.deleted\u0027: None, \u0027identity.project.updated\u0027: None, \u0027identity.trust.created\u0027: None, \u0027identity.trust.deleted\u0027: None, \u0027identity.role_assignment.created\u0027: None, \u0027identity.role_assignment.deleted\u0027: None}}, {\u0027resource_type\u0027: \u0027ceph_account\u0027, \u0027metrics\u0027: {\u0027radosgw.objects\u0027: None, \u0027radosgw.objects.size\u0027: None, \u0027radosgw.objects.containers\u0027: None, \u0027radosgw.api.request\u0027: None, \u0027radosgw.containers.objects\u0027: None, \u0027radosgw.containers.objects.size\u0027: None}}, {\u0027resource_type\u0027: \u0027instance\u0027, \u0027metrics\u0027: {\u0027memory\u0027: None, \u0027memory.available\u0027: None, \u0027memory.usage\u0027: None, \u0027memory.resident\u0027: None, \u0027memory.swap.in\u0027: None, \u0027memory.swap.out\u0027: None, \u0027vcpus\u0027: None, \u0027power.state\u0027: None, \u0027cpu\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027disk.root.size\u0027: None, \u0027disk.ephemeral.size\u0027: None, \u0027disk.latency\u0027: None, \u0027disk.iops\u0027: None, \u0027disk.capacity\u0027: None, \u0027disk.allocation\u0027: None, \u0027disk.usage\u0027: None, \u0027compute.instance.booting.time\u0027: None, \u0027perf.cpu.cycles\u0027: None, \u0027perf.instructions\u0027: None, \u0027perf.cache.references\u0027: None, \u0027perf.cache.misses\u0027: None}, \u0027attributes\u0027: {\u0027host\u0027: \u0027resource_metadata.(instance_host|host)\u0027, \u0027image_ref\u0027: \u0027resource_metadata.image_ref\u0027, \u0027launched_at\u0027: \u0027resource_metadata.launched_at\u0027, \u0027created_at\u0027: \u0027resource_metadata.created_at\u0027, \u0027deleted_at\u0027: \u0027resource_metadata.deleted_at\u0027, \u0027display_name\u0027: \u0027resource_metadata.display_name\u0027, \u0027flavor_id\u0027: \u0027resource_metadata.(instance_flavor_id|(flavor.id)|flavor_id)\u0027, \u0027flavor_name\u0027: \u0027resource_metadata.(instance_type|(flavor.name)|flavor_name)\u0027, \u0027server_group\u0027: \u0027resource_metadata.user_metadata.server_group\u0027}, \u0027event_delete\u0027: \u0027compute.instance.delete.start\u0027, \u0027event_create\u0027: \u0027compute.instance.create.end\u0027, \u0027event_attributes\u0027: {\u0027id\u0027: \u0027instance_id\u0027, \u0027display_name\u0027: \u0027display_name\u0027, \u0027host\u0027: \u0027host\u0027, \u0027availability_zone\u0027: \u0027availability_zone\u0027, \u0027flavor_id\u0027: \u0027instance_type_id\u0027, \u0027flavor_name\u0027: \u0027instance_type\u0027, \u0027user_id\u0027: \u0027user_id\u0027, \u0027project_id\u0027: \u0027project_id\u0027}, \u0027event_associated_resources\u0027: {\u0027instance_network_interface\u0027: \u0027{\"\u003d\": {\"instance_id\": \"%s\"}}\u0027, \u0027instance_disk\u0027: \u0027{\"\u003d\": {\"instance_id\": \"%s\"}}\u0027}}, {\u0027resource_type\u0027: \u0027instance_network_interface\u0027, \u0027metrics\u0027: {\u0027network.outgoing.packets\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027network.incoming.packets\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027network.outgoing.packets.drop\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027network.incoming.packets.drop\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027network.outgoing.packets.error\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027network.incoming.packets.error\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027network.outgoing.bytes\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027network.incoming.bytes\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}}, \u0027attributes\u0027: {\u0027name\u0027: \u0027resource_metadata.vnic_name\u0027, \u0027instance_id\u0027: \u0027resource_metadata.instance_id\u0027}}, {\u0027resource_type\u0027: \u0027instance_disk\u0027, \u0027metrics\u0027: {\u0027disk.device.read.requests\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027disk.device.write.requests\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027disk.device.read.bytes\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027disk.device.write.bytes\u0027: {\u0027archive_policy_name\u0027: \u0027ceilometer-low-rate\u0027}, \u0027disk.device.read.latency\u0027: None, \u0027disk.device.write.latency\u0027: None, \u0027disk.device.capacity\u0027: None, \u0027disk.device.allocation\u0027: None, \u0027disk.device.usage\u0027: None}, \u0027attributes\u0027: {\u0027name\u0027: \u0027resource_metadata.disk_name\u0027, \u0027instance_id\u0027: \u0027resource_metadata.instance_id\u0027}}, {\u0027resource_type\u0027: \u0027image\u0027, \u0027metrics\u0027: {\u0027image.size\u0027: None, \u0027image.download\u0027: None, \u0027image.serve\u0027: None}, \u0027attributes\u0027: {\u0027name\u0027: \u0027resource_metadata.name\u0027, \u0027container_format\u0027: \u0027resource_metadata.container_format\u0027, \u0027disk_format\u0027: \u0027resource_metadata.disk_format\u0027}, \u0027event_delete\u0027: \u0027image.delete\u0027, \u0027event_attributes\u0027: {\u0027id\u0027: \u0027resource_id\u0027}}, {\u0027resource_type\u0027: \u0027ipmi\u0027, \u0027metrics\u0027: {\u0027hardware.ipmi.node.power\u0027: None, \u0027hardware.ipmi.node.temperature\u0027: None, \u0027hardware.ipmi.node.inlet_temperature\u0027: None, \u0027hardware.ipmi.node.outlet_temperature\u0027: None, \u0027hardware.ipmi.node.fan\u0027: None, \u0027hardware.ipmi.node.current\u0027: None, \u0027hardware.ipmi.node.voltage\u0027: None, \u0027hardware.ipmi.node.airflow\u0027: None, \u0027hardware.ipmi.node.cups\u0027: None, \u0027hardware.ipmi.node.cpu_util\u0027: None, \u0027hardware.ipmi.node.mem_util\u0027: None, \u0027hardware.ipmi.node.io_util\u0027: None}}, {\u0027resource_type\u0027: \u0027ipmi_sensor\u0027, \u0027metrics\u0027: [\u0027hardware.ipmi.power\u0027, \u0027hardware.ipmi.temperature\u0027, \u0027hardware.ipmi.current\u0027, \u0027hardware.ipmi.voltage\u0027, \u0027hardware.ipmi.fan\u0027], \u0027attributes\u0027: {\u0027node\u0027: \u0027resource_metadata.node\u0027}}, {\u0027resource_type\u0027: \u0027network\u0027, \u0027metrics\u0027: {\u0027bandwidth\u0027: None, \u0027ip.floating\u0027: None}, \u0027event_delete\u0027: \u0027floatingip.delete.end\u0027, \u0027event_attributes\u0027: {\u0027id\u0027: \u0027resource_id\u0027}}, {\u0027resource_type\u0027: \u0027stack\u0027, \u0027metrics\u0027: {\u0027stack.create\u0027: None, \u0027stack.update\u0027: None, \u0027stack.delete\u0027: None, \u0027stack.resume\u0027: None, \u0027stack.suspend\u0027: None}}, {\u0027resource_type\u0027: \u0027swift_account\u0027, \u0027metrics\u0027: {\u0027storage.objects.incoming.bytes\u0027: None, \u0027storage.objects.outgoing.bytes\u0027: None, \u0027storage.objects.size\u0027: None, \u0027storage.objects\u0027: None, \u0027storage.objects.containers\u0027: None, \u0027storage.containers.objects\u0027: None, \u0027storage.containers.objects.size\u0027: None}, \u0027attributes\u0027: {\u0027storage_policy\u0027: \u0027resource_metadata.storage_policy\u0027}}, {\u0027resource_type\u0027: \u0027volume\u0027, \u0027metrics\u0027: {\u0027volume\u0027: None, \u0027volume.size\u0027: None, \u0027snapshot.size\u0027: None, \u0027volume.snapshot.size\u0027: None, \u0027volume.backup.size\u0027: None, \u0027backup.size\u0027: None, \u0027volume.manage_existing.start\u0027: None, \u0027volume.manage_existing.end\u0027: None, \u0027volume.manage_existing_snapshot.start\u0027: None, \u0027volume.manage_existing_snapshot.end\u0027: None}, \u0027attributes\u0027: {\u0027display_name\u0027: \u0027resource_metadata.(display_name|name)\u0027, \u0027volume_type\u0027: \u0027resource_metadata.volume_type\u0027, \u0027volume_type_id\u0027: \u0027resource_metadata.volume_type_id\u0027, \u0027image_id\u0027: \u0027resource_metadata.image_id\u0027, \u0027instance_id\u0027: \u0027resource_metadata.instance_id\u0027}, \u0027event_delete\u0027: [\u0027volume.delete.end\u0027, \u0027snapshot.delete.end\u0027], \u0027event_update\u0027: [\u0027volume.transfer.accept.end\u0027, \u0027snapshot.transfer.accept.end\u0027], \u0027event_attributes\u0027: {\u0027id\u0027: \u0027resource_id\u0027, \u0027project_id\u0027: \u0027project_id\u0027}}, {\u0027resource_type\u0027: \u0027volume_provider\u0027, \u0027metrics\u0027: {\u0027volume.provider.capacity.total\u0027: None, \u0027volume.provider.capacity.free\u0027: None, \u0027volume.provider.capacity.allocated\u0027: None, \u0027volume.provider.capacity.provisioned\u0027: None, \u0027volume.provider.capacity.virtual_free\u0027: None}}, {\u0027resource_type\u0027: \u0027volume_provider_pool\u0027, \u0027metrics\u0027: {\u0027volume.provider.pool.capacity.total\u0027: None, \u0027volume.provider.pool.capacity.free\u0027: None, \u0027volume.provider.pool.capacity.allocated\u0027: None, \u0027volume.provider.pool.capacity.provisioned\u0027: None, \u0027volume.provider.pool.capacity.virtual_free\u0027: None}, \u0027attributes\u0027: {\u0027provider\u0027: \u0027resource_metadata.provider\u0027}}, {\u0027resource_type\u0027: \u0027nova_compute\u0027, \u0027metrics\u0027: {\u0027compute.node.cpu.frequency\u0027: None, \u0027compute.node.cpu.idle.percent\u0027: None, \u0027compute.node.cpu.idle.time\u0027: None, \u0027compute.node.cpu.iowait.percent\u0027: None, \u0027compute.node.cpu.iowait.time\u0027: None, \u0027compute.node.cpu.kernel.percent\u0027: None, \u0027compute.node.cpu.kernel.time\u0027: None, \u0027compute.node.cpu.percent\u0027: None, \u0027compute.node.cpu.user.percent\u0027: None, \u0027compute.node.cpu.user.time\u0027: None}, \u0027attributes\u0027: {\u0027host_name\u0027: \u0027resource_metadata.host\u0027}}, {\u0027resource_type\u0027: \u0027manila_share\u0027, \u0027metrics\u0027: {\u0027manila.share.size\u0027: None}, \u0027attributes\u0027: {\u0027name\u0027: \u0027resource_metadata.name\u0027, \u0027host\u0027: \u0027resource_metadata.host\u0027, \u0027status\u0027: \u0027resource_metadata.status\u0027, \u0027availability_zone\u0027: \u0027resource_metadata.availability_zone\u0027, \u0027protocol\u0027: \u0027resource_metadata.protocol\u0027}}]}\n2025-11-03 10:48:29.926652 | ubuntu-jammy | Exception in thread Thread-1 (start):\n2025-11-03 10:48:29.927515 | ubuntu-jammy | Traceback (most recent call last):\n2025-11-03 10:48:29.937656 | ubuntu-jammy |   File \"/usr/lib/python3.10/threading.py\", line 1016, in _bootstrap_inner\n2025-11-03 10:48:29.940342 | ubuntu-jammy |     self.run()\n2025-11-03 10:48:29.945630 | ubuntu-jammy |   File \"/usr/lib/python3.10/threading.py\", line 953, in run\n2025-11-03 10:48:29.954610 | ubuntu-jammy |     self._target(*self._args, **self._kwargs)\n2025-11-03 10:48:29.954656 | ubuntu-jammy |   File \"/home/zuul/src/opendev.org/openstack/ceilometer/.tox/py310/lib/python3.10/site-packages/futurist/periodics.py\", line 880, in start\n2025-11-03 10:48:29.954689 | ubuntu-jammy |     executor \u003d self._executor_factory()\n2025-11-03 10:48:29.954704 | ubuntu-jammy |   File \"/home/zuul/src/opendev.org/openstack/ceilometer/ceilometer/polling/manager.py\", line 858, in \u003clambda\u003e\n2025-11-03 10:48:29.954717 | ubuntu-jammy |     futures.ThreadPoolExecutor(max_workers\u003dlen(data)))\n2025-11-03 10:48:29.954729 | ubuntu-jammy |   File \"/usr/lib/python3.10/concurrent/futures/thread.py\", line 144, in __init__\n2025-11-03 10:48:29.969583 | ubuntu-jammy |     raise ValueError(\"max_workers must be greater than 0\")\n2025-11-03 10:48:29.969638 | ubuntu-jammy | ValueError: max_workers must be greater than 0","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"a3c4a7b8adb1ae4db0dd8700881854bedab9e178","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"8ce174e1_90f8d5f3","in_reply_to":"91fc725a_98afbe35","updated":"2025-11-10 20:24:13.000000000","message":"I don\u0027t think the exception from the original comment is being caused by this change. It\u0027s a bit difficult to pinpoint what\u0027s causing it, since Ceilometer is using multiple threads and stestr is also executing tests in parallel, so the output is quite scrambled. You can see the same exceptions at other changes as well. For example here https://zuul.opendev.org/t/openstack/build/a022fb9265364996b49d4d3b421feb45 (ctrl + f \u0027max_workers\u0027).\n\nI located which test is causing it (`ceilometer.tests.unit.polling.test_manager.TestPollingAgent.test_start`) and I proposed a fix https://review.opendev.org/c/openstack/ceilometer/+/966632","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":4264,"name":"Matthias Runge","email":"mrunge@redhat.com","username":"mrunge"},"change_message_id":"eeee65edaab5fc69bc4208c4ef23ab050c55ba46","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"91fc725a_98afbe35","in_reply_to":"92dd842c_ba070719","updated":"2025-11-10 14:50:57.000000000","message":"I got this from the output of the CI run. Where I am heading at is that the test passes with a clearly faulty test.\n\nThe function call lacks one mandatory argument.","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"abc3229c115089dff7600e34ee9c5bbc21fe2ac5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"92dd842c_ba070719","in_reply_to":"95d0681f_c378a524","updated":"2025-11-10 11:07:02.000000000","message":"Not sure about this. The patch passed the CI, no ? Where did you get this from ?","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"cd1c13dc9c575cbf422742430b636719d93b165b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"40bc43d9_a3450a01","updated":"2025-11-13 08:12:19.000000000","message":"Hi Mathias,\n\nThis was just a mistake from Wissem, he never intended to abandon the patch.","commit_id":"0ba3620a8653ffaa15b01d3de90511de41c7a090"},{"author":{"_account_id":4264,"name":"Matthias Runge","email":"mrunge@redhat.com","username":"mrunge"},"change_message_id":"4a7c5da7ae5d428c116f69ee6c43bc59bac52bbf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"be848923_b1ba271d","updated":"2025-11-12 11:04:29.000000000","message":"I understand that this change is non-controversial and that we do want to land it. Is there any interest to continue?","commit_id":"0ba3620a8653ffaa15b01d3de90511de41c7a090"},{"author":{"_account_id":4264,"name":"Matthias Runge","email":"mrunge@redhat.com","username":"mrunge"},"change_message_id":"701b5428c9a5c92da7e8ee116a65664562aba83c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"8f6d8868_58f05d56","updated":"2025-11-13 08:35:44.000000000","message":"Thank you for pushing this patch!","commit_id":"62cc3a89b7aeba274b7e8c29c4b240f42ee27d14"},{"author":{"_account_id":4264,"name":"Matthias Runge","email":"mrunge@redhat.com","username":"mrunge"},"change_message_id":"5498dbabdea662cfec4dca0d3c793ba4196b9cbf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"03bf91be_a7acc480","updated":"2025-11-14 06:48:26.000000000","message":"thanks again.","commit_id":"b7c27f7fc90aadd90e7ffd3903de515d3952a252"}],"ceilometer/objectstore/rgw.py":[{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":76,"context_line":"        # only ever called once, also we assume that in a single deployment"},{"line_number":77,"context_line":"        # Added the possibility to use the service_name to target the"},{"line_number":78,"context_line":"        # endpoint. There are some deployment case where both `radosgw` and"},{"line_number":79,"context_line":"        # `swift`are used"},{"line_number":80,"context_line":"        if _Base._ENDPOINT is None and conf.rgw_client.rgw_service_name:"},{"line_number":81,"context_line":"            try:"},{"line_number":82,"context_line":"                creds \u003d conf.service_credentials"}],"source_content_type":"text/x-python","patch_set":8,"id":"b6f9eb02_b0061dd7","line":79,"updated":"2025-11-05 11:28:56.000000000","message":"This comment is now very strange. I guess you want to remove the \"also we assume that in a single deployment\" part as well.\n\nBut the new part of the comment at the end seems like it\u0027s addressing the reviewers of this change, not somebody reading the merged code in the future, which would be the preferable option for me.\n\nMaybe you could move the new part of the comment just inside the if block below and have it say something like:\n```\nUse the service_name to target the endpoint. There are cases where both \u0027radosgw\u0027 and \u0027swift\u0027 are used.\n```","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"abc3229c115089dff7600e34ee9c5bbc21fe2ac5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        # only ever called once, also we assume that in a single deployment"},{"line_number":77,"context_line":"        # Added the possibility to use the service_name to target the"},{"line_number":78,"context_line":"        # endpoint. There are some deployment case where both `radosgw` and"},{"line_number":79,"context_line":"        # `swift`are used"},{"line_number":80,"context_line":"        if _Base._ENDPOINT is None and conf.rgw_client.rgw_service_name:"},{"line_number":81,"context_line":"            try:"},{"line_number":82,"context_line":"                creds \u003d conf.service_credentials"}],"source_content_type":"text/x-python","patch_set":8,"id":"62d69279_9b66d30c","line":79,"in_reply_to":"b6f9eb02_b0061dd7","updated":"2025-11-10 11:07:02.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        # Added the possibility to use the service_name to target the"},{"line_number":78,"context_line":"        # endpoint. There are some deployment case where both `radosgw` and"},{"line_number":79,"context_line":"        # `swift`are used"},{"line_number":80,"context_line":"        if _Base._ENDPOINT is None and conf.rgw_client.rgw_service_name:"},{"line_number":81,"context_line":"            try:"},{"line_number":82,"context_line":"                creds \u003d conf.service_credentials"},{"line_number":83,"context_line":"                rgw_url \u003d keystone_client.get_service_catalog("}],"source_content_type":"text/x-python","patch_set":8,"id":"af9f6369_ea0f4780","line":80,"updated":"2025-11-05 11:28:56.000000000","message":"This new section inside the if block is adding new functionality, which isn\u0027t apparent from the commit message heading \"Replace request-aws by awscurl\". In the ideal world, this should be separated into another commit, but I\u0027m not that nitpicky. But I think this should be at least mentioned somehow in the commit message heading, so that in the future it\u0027s apparent that more happened in this commit then just s/request-aws/awscurl.","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"abc3229c115089dff7600e34ee9c5bbc21fe2ac5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # Added the possibility to use the service_name to target the"},{"line_number":78,"context_line":"        # endpoint. There are some deployment case where both `radosgw` and"},{"line_number":79,"context_line":"        # `swift`are used"},{"line_number":80,"context_line":"        if _Base._ENDPOINT is None and conf.rgw_client.rgw_service_name:"},{"line_number":81,"context_line":"            try:"},{"line_number":82,"context_line":"                creds \u003d conf.service_credentials"},{"line_number":83,"context_line":"                rgw_url \u003d keystone_client.get_service_catalog("}],"source_content_type":"text/x-python","patch_set":8,"id":"63656bc8_de711805","line":80,"in_reply_to":"af9f6369_ea0f4780","updated":"2025-11-10 11:07:02.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":86,"context_line":"                        interface\u003dcreds.interface,"},{"line_number":87,"context_line":"                        region_name\u003dcreds.region_name)"},{"line_number":88,"context_line":"                _Base._ENDPOINT \u003d urlparse.urljoin(rgw_url, \u0027/admin\u0027)"},{"line_number":89,"context_line":"                LOG.debug(_Base._ENDPOINT)"},{"line_number":90,"context_line":"            except exceptions.EndpointNotFound:"},{"line_number":91,"context_line":"                LOG.debug(\"Radosgw endpoint not found\")"},{"line_number":92,"context_line":"        elif _Base._ENDPOINT is None and conf.service_types.radosgw:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac8c292_b45484bb","line":89,"updated":"2025-11-05 11:28:56.000000000","message":"I\u0027m not against having a debug output for the endpoint, but there should be some context to this, not just having a wild URL appear in the logs. I imagine it could look something like: `Using endpoint \u003cendpoint\u003e for radosgw connections`. If you decide to leave the debug output here, please add a similar one to the elif block below.","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"bfb4a57d1ab1bfa9cd642ca9e5400fa031fce07b","unresolved":true,"context_lines":[{"line_number":86,"context_line":"                        interface\u003dcreds.interface,"},{"line_number":87,"context_line":"                        region_name\u003dcreds.region_name)"},{"line_number":88,"context_line":"                _Base._ENDPOINT \u003d urlparse.urljoin(rgw_url, \u0027/admin\u0027)"},{"line_number":89,"context_line":"                LOG.debug(_Base._ENDPOINT)"},{"line_number":90,"context_line":"            except exceptions.EndpointNotFound:"},{"line_number":91,"context_line":"                LOG.debug(\"Radosgw endpoint not found\")"},{"line_number":92,"context_line":"        elif _Base._ENDPOINT is None and conf.service_types.radosgw:"}],"source_content_type":"text/x-python","patch_set":8,"id":"e4d1a135_d446feea","line":89,"in_reply_to":"27112c11_6ab0fe45","updated":"2025-11-13 10:23:47.000000000","message":"I don\u0027t see this comment addressed yet. So please either:\n- extend the log message to add some context, because having just URL doesn\u0027t seem much useful. And add the same comment into the elif block below to have the logging unified.\n- or remove this line if you don\u0027t think it\u0027s useful\n\nAfter that, I\u0027ll be happy to +2 +W.","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"abc3229c115089dff7600e34ee9c5bbc21fe2ac5","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                        interface\u003dcreds.interface,"},{"line_number":87,"context_line":"                        region_name\u003dcreds.region_name)"},{"line_number":88,"context_line":"                _Base._ENDPOINT \u003d urlparse.urljoin(rgw_url, \u0027/admin\u0027)"},{"line_number":89,"context_line":"                LOG.debug(_Base._ENDPOINT)"},{"line_number":90,"context_line":"            except exceptions.EndpointNotFound:"},{"line_number":91,"context_line":"                LOG.debug(\"Radosgw endpoint not found\")"},{"line_number":92,"context_line":"        elif _Base._ENDPOINT is None and conf.service_types.radosgw:"}],"source_content_type":"text/x-python","patch_set":8,"id":"27112c11_6ab0fe45","line":89,"in_reply_to":"3ac8c292_b45484bb","updated":"2025-11-10 11:07:02.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"74e5204beea10749aac80776690df6a1640b7d99","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                        interface\u003dcreds.interface,"},{"line_number":87,"context_line":"                        region_name\u003dcreds.region_name)"},{"line_number":88,"context_line":"                _Base._ENDPOINT \u003d urlparse.urljoin(rgw_url, \u0027/admin\u0027)"},{"line_number":89,"context_line":"                LOG.debug(_Base._ENDPOINT)"},{"line_number":90,"context_line":"            except exceptions.EndpointNotFound:"},{"line_number":91,"context_line":"                LOG.debug(\"Radosgw endpoint not found\")"},{"line_number":92,"context_line":"        elif _Base._ENDPOINT is None and conf.service_types.radosgw:"}],"source_content_type":"text/x-python","patch_set":8,"id":"d59daea5_0f843620","line":89,"in_reply_to":"8e3bb4d8_7897b1ef","updated":"2025-11-13 10:47:00.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"a723a66abb0705471b9d35f775fcbf8180eb1f58","unresolved":true,"context_lines":[{"line_number":86,"context_line":"                        interface\u003dcreds.interface,"},{"line_number":87,"context_line":"                        region_name\u003dcreds.region_name)"},{"line_number":88,"context_line":"                _Base._ENDPOINT \u003d urlparse.urljoin(rgw_url, \u0027/admin\u0027)"},{"line_number":89,"context_line":"                LOG.debug(_Base._ENDPOINT)"},{"line_number":90,"context_line":"            except exceptions.EndpointNotFound:"},{"line_number":91,"context_line":"                LOG.debug(\"Radosgw endpoint not found\")"},{"line_number":92,"context_line":"        elif _Base._ENDPOINT is None and conf.service_types.radosgw:"}],"source_content_type":"text/x-python","patch_set":8,"id":"8e3bb4d8_7897b1ef","line":89,"in_reply_to":"e4d1a135_d446feea","updated":"2025-11-13 10:25:45.000000000","message":"Or actually I think you can even move the LOG.debug line down just above the return statement on L102 to avoid code duplication.","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"}],"ceilometer/objectstore/rgw_client.py":[{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from collections import namedtuple"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from awscurl.awscurl import make_request"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from urllib import parse as urlparse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5449a234_9cd0f711","line":19,"updated":"2025-11-05 11:28:56.000000000","message":"```suggestion\nfrom awscurl import awscurl\n```\n\nI know not all the current code is compliant with the OpenStack style guidelines, but let\u0027s try following it with new code https://docs.openstack.org/hacking/latest/user/hacking.html#imports So let\u0027s import the module instead of the function directly.","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"abc3229c115089dff7600e34ee9c5bbc21fe2ac5","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from collections import namedtuple"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from awscurl.awscurl import make_request"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from urllib import parse as urlparse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"55d5b53e_a2c5ec97","line":19,"in_reply_to":"5449a234_9cd0f711","updated":"2025-11-10 11:07:02.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":55,"context_line":"        method \u003d \"GET\""},{"line_number":56,"context_line":"        # Default region , in the case of radosgw either set"},{"line_number":57,"context_line":"        # the value to your zonegroup name or keep the default region"},{"line_number":58,"context_line":"        region \u003d \"us-east-1\""},{"line_number":59,"context_line":"        headers \u003d {\u0027Accept\u0027: \u0027application/json\u0027}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        r \u003d make_request(method, service, region, uri, headers, data,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5919d10a_47e37390","line":58,"updated":"2025-11-05 11:28:56.000000000","message":"I have very little experience with object storage. But I guess that the make_request requires a region specified when called and it seems that the region will always be \"us-east-1\". Is that right? Wouldn\u0027t we expect other regions being possible? Don\u0027t we need a way for influencing this value in some way?","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"a3c4a7b8adb1ae4db0dd8700881854bedab9e178","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        method \u003d \"GET\""},{"line_number":56,"context_line":"        # Default region , in the case of radosgw either set"},{"line_number":57,"context_line":"        # the value to your zonegroup name or keep the default region"},{"line_number":58,"context_line":"        region \u003d \"us-east-1\""},{"line_number":59,"context_line":"        headers \u003d {\u0027Accept\u0027: \u0027application/json\u0027}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        r \u003d make_request(method, service, region, uri, headers, data,"}],"source_content_type":"text/x-python","patch_set":8,"id":"508a5614_9c9d5206","line":58,"in_reply_to":"476269f3_06db7230","updated":"2025-11-10 20:24:13.000000000","message":"alright","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"abc3229c115089dff7600e34ee9c5bbc21fe2ac5","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        method \u003d \"GET\""},{"line_number":56,"context_line":"        # Default region , in the case of radosgw either set"},{"line_number":57,"context_line":"        # the value to your zonegroup name or keep the default region"},{"line_number":58,"context_line":"        region \u003d \"us-east-1\""},{"line_number":59,"context_line":"        headers \u003d {\u0027Accept\u0027: \u0027application/json\u0027}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        r \u003d make_request(method, service, region, uri, headers, data,"}],"source_content_type":"text/x-python","patch_set":8,"id":"476269f3_06db7230","line":58,"in_reply_to":"5919d10a_47e37390","updated":"2025-11-10 11:07:02.000000000","message":"My understanding is that, since we\u0027re using the proxy URL directly, it is using the specific region we want, and this has no influence, though the s3 API needs something like written above.","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":58,"context_line":"        region \u003d \"us-east-1\""},{"line_number":59,"context_line":"        headers \u003d {\u0027Accept\u0027: \u0027application/json\u0027}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        r \u003d make_request(method, service, region, uri, headers, data,"},{"line_number":62,"context_line":"                         self.access_key, self.secret, None, False, False)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        if r.status_code !\u003d 200:"}],"source_content_type":"text/x-python","patch_set":8,"id":"d136d997_4d783354","line":61,"updated":"2025-11-05 11:28:56.000000000","message":"```suggestion\n        r \u003d awscurl.make_request(method, service, region, uri, headers, data,\n```","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"abc3229c115089dff7600e34ee9c5bbc21fe2ac5","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        region \u003d \"us-east-1\""},{"line_number":59,"context_line":"        headers \u003d {\u0027Accept\u0027: \u0027application/json\u0027}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        r \u003d make_request(method, service, region, uri, headers, data,"},{"line_number":62,"context_line":"                         self.access_key, self.secret, None, False, False)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        if r.status_code !\u003d 200:"}],"source_content_type":"text/x-python","patch_set":8,"id":"169095e8_01e497f0","line":61,"in_reply_to":"d136d997_4d783354","updated":"2025-11-10 11:07:02.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"}],"ceilometer/tests/unit/objectstore/test_rgw_client.py":[{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":179,"context_line":"        expected \u003d {\u0027num_buckets\u0027: 2, \u0027size\u0027: 1042, \u0027num_objects\u0027: 1001,"},{"line_number":180,"context_line":"                    \u0027buckets\u0027: bucket_list}"},{"line_number":181,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":182,"context_line":"        self.assertEqual(1, len(self.get.call_args_list))"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def test_get_buckets_implicit_tenants(self):"},{"line_number":185,"context_line":"        self.get_resp.status_code \u003d 200"}],"source_content_type":"text/x-python","patch_set":8,"id":"c7e6f25b_7e1c6e46","line":182,"updated":"2025-11-05 11:28:56.000000000","message":"We can still test that the tenant was passed into the API call with the following.\n```suggestion\n        self.assertEqual(1, len(self.get.call_args_list))\n        self.assertEqual(\u0027http://127.0.0.1:8080/admin/bucket?uid\u003dfoo\u0026stats\u003dtrue\u0027,\n                         self.get.call_args_list[0][0][1])\n```","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"e054dd82417a71f9d08e4e736c5869f050c59128","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        expected \u003d {\u0027num_buckets\u0027: 2, \u0027size\u0027: 1042, \u0027num_objects\u0027: 1001,"},{"line_number":180,"context_line":"                    \u0027buckets\u0027: bucket_list}"},{"line_number":181,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":182,"context_line":"        self.assertEqual(1, len(self.get.call_args_list))"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def test_get_buckets_implicit_tenants(self):"},{"line_number":185,"context_line":"        self.get_resp.status_code \u003d 200"}],"source_content_type":"text/x-python","patch_set":8,"id":"de4a27ca_49a084af","line":182,"in_reply_to":"c7e6f25b_7e1c6e46","updated":"2025-11-13 08:33:48.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":192,"context_line":"        expected \u003d {\u0027num_buckets\u0027: 2, \u0027size\u0027: 1042, \u0027num_objects\u0027: 1001,"},{"line_number":193,"context_line":"                    \u0027buckets\u0027: bucket_list}"},{"line_number":194,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":195,"context_line":"        self.assertEqual(1, len(self.get.call_args_list))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def test_get_usage(self):"},{"line_number":198,"context_line":"        self.get_resp.status_code \u003d 200"}],"source_content_type":"text/x-python","patch_set":8,"id":"f255f72b_6f49ef4a","line":195,"updated":"2025-11-05 11:28:56.000000000","message":"```suggestion\n        self.assertEqual(1, len(self.get.call_args_list))\n        self.assertEqual(\u0027http://127.0.0.1:8080/admin/bucket?uid\u003dfoo$foo\u0026stats\u003dtrue\u0027,\n                         self.get.call_args_list[0][0][1])\n\n```","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"e054dd82417a71f9d08e4e736c5869f050c59128","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        expected \u003d {\u0027num_buckets\u0027: 2, \u0027size\u0027: 1042, \u0027num_objects\u0027: 1001,"},{"line_number":193,"context_line":"                    \u0027buckets\u0027: bucket_list}"},{"line_number":194,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":195,"context_line":"        self.assertEqual(1, len(self.get.call_args_list))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def test_get_usage(self):"},{"line_number":198,"context_line":"        self.get_resp.status_code \u003d 200"}],"source_content_type":"text/x-python","patch_set":8,"id":"da840dda_4ba4f478","line":195,"in_reply_to":"f255f72b_6f49ef4a","updated":"2025-11-13 08:33:48.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":200,"context_line":"        actual \u003d self.client.get_usage(\u0027foo\u0027)"},{"line_number":201,"context_line":"        expected \u003d 7"},{"line_number":202,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":203,"context_line":"        self.assertEqual(1, len(self.get.call_args_list))"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def test_get_usage_implicit_tenants(self):"},{"line_number":206,"context_line":"        self.get_resp.status_code \u003d 200"}],"source_content_type":"text/x-python","patch_set":8,"id":"d7c673fd_887057cb","line":203,"updated":"2025-11-05 11:28:56.000000000","message":"```suggestion\n        self.assertEqual(1, len(self.get.call_args_list))\n        self.assertEqual(\u0027http://127.0.0.1:8080/admin/usage?uid\u003dfoo\u0027,\n                         self.get.call_args_list[0][0][1])\n```","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"e054dd82417a71f9d08e4e736c5869f050c59128","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        actual \u003d self.client.get_usage(\u0027foo\u0027)"},{"line_number":201,"context_line":"        expected \u003d 7"},{"line_number":202,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":203,"context_line":"        self.assertEqual(1, len(self.get.call_args_list))"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def test_get_usage_implicit_tenants(self):"},{"line_number":206,"context_line":"        self.get_resp.status_code \u003d 200"}],"source_content_type":"text/x-python","patch_set":8,"id":"9b8821f4_b13d1ae8","line":203,"in_reply_to":"d7c673fd_887057cb","updated":"2025-11-13 08:33:48.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6cca3af58f1dcff898a63215c08d8129ffba4cc5","unresolved":true,"context_lines":[{"line_number":209,"context_line":"        actual \u003d self.client.get_usage(\u0027foo\u0027)"},{"line_number":210,"context_line":"        expected \u003d 7"},{"line_number":211,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":212,"context_line":"        self.assertEqual(1, len(self.get.call_args_list))"}],"source_content_type":"text/x-python","patch_set":8,"id":"eaa9e74d_06392c57","line":212,"updated":"2025-11-05 11:28:56.000000000","message":"```suggestion\n        self.assertEqual(1, len(self.get.call_args_list))\n        self.assertEqual(\u0027http://127.0.0.1:8080/admin/usage?uid\u003dfoo$foo\u0027,\n                         self.get.call_args_list[0][0][1])\n```","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"},{"author":{"_account_id":6476,"name":"Thomas Goirand","email":"thomas@goirand.fr","username":"thomas-goirand"},"change_message_id":"e054dd82417a71f9d08e4e736c5869f050c59128","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        actual \u003d self.client.get_usage(\u0027foo\u0027)"},{"line_number":210,"context_line":"        expected \u003d 7"},{"line_number":211,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":212,"context_line":"        self.assertEqual(1, len(self.get.call_args_list))"}],"source_content_type":"text/x-python","patch_set":8,"id":"db6fd9c6_2a570cbd","line":212,"in_reply_to":"eaa9e74d_06392c57","updated":"2025-11-13 08:33:48.000000000","message":"Done","commit_id":"bc63c1074eb11df38100a53921f2608444d6d3fb"}]}
