)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     minkyukim \u003cmj110602@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-08-21 09:30:41 +0900"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"tests: Consolidate catalog tests and remove cliff dependencies"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Merge test_list and test_show into test_catalog to test list,"},{"line_number":10,"context_line":"show by service type/name, and non-existent service handling."},{"line_number":11,"context_line":"Remove formatter/column tests as they belong to cliff, not OSC."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Idcfd0c8c5b7418046601d222248c0cd16886e079"},{"line_number":14,"context_line":"Signed-off-by: minkyukim \u003cmj110602@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"e3a31ebb_34f7a874","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":63},"updated":"2025-08-21 16:19:55.000000000","message":"A commit message should describe what changes the commit will make to the code base as a result of it being applied. It should not be a history of to the commit (i.e. the different gerrit patchsets). You don\u0027t need to mention removing cliff dependencies because that is not what the commit is doing. Instead, that\u0027s what the patchset revision is doing.\n\nYou can simply say:\n\n```\ntests: Simplify catalog functional tests\n\n\nCombine multiple test cases into a single test case, in order to\nspeed up execution.\n```\n\nObviously if you add service creation and deletion as I\u0027m suggesting in the next file, you will need to reword this further.","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":35119,"name":"jihyun huh","email":"huhji.elha@gmail.com","username":"jhhuh"},"change_message_id":"aed2bb2eab01c2a36b634b989fba84d0ad606f87","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"40a167c8_3053d2ac","updated":"2025-08-26 05:45:19.000000000","message":"recheck","commit_id":"68d1d01b2ae5b5726a947e03dbc0c1b019a8898b"}],"openstackclient/tests/functional/identity/v3/test_catalog.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6c01ddf7f8f55048cd0b3f310f5ad728c0bf7205","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        # items may have multiple endpoint urls with empty key"},{"line_number":48,"context_line":"        self.assert_show_fields(items, [\u0027endpoints\u0027, \u0027name\u0027, \u0027type\u0027, \u0027\u0027, \u0027id\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_catalog_list_json_format(self):"},{"line_number":51,"context_line":"        \"\"\"Test catalog list with JSON output format\"\"\""},{"line_number":52,"context_line":"        json_output \u003d self.openstack(\u0027catalog list\u0027, parse_output\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        # Verify basic structure"},{"line_number":55,"context_line":"        self.assertIsInstance("},{"line_number":56,"context_line":"            json_output, list, \"JSON output should be a list\""},{"line_number":57,"context_line":"        )"},{"line_number":58,"context_line":"        self.assertGreater("},{"line_number":59,"context_line":"            len(json_output), 0, \"Should have at least one service\""},{"line_number":60,"context_line":"        )"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        # Verify each service has required fields"},{"line_number":63,"context_line":"        for service in json_output:"},{"line_number":64,"context_line":"            self.assertIsInstance("},{"line_number":65,"context_line":"                service, dict, \"Each service should be a dictionary\""},{"line_number":66,"context_line":"            )"},{"line_number":67,"context_line":"            self.assertIn(\u0027Name\u0027, service, \"Service should have Name\")"},{"line_number":68,"context_line":"            self.assertIn(\u0027Type\u0027, service, \"Service should have Type\")"},{"line_number":69,"context_line":"            self.assertIn("},{"line_number":70,"context_line":"                \u0027Endpoints\u0027, service, \"Service should have Endpoints\""},{"line_number":71,"context_line":"            )"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def test_catalog_list_contains_identity_service(self):"},{"line_number":74,"context_line":"        \"\"\"Test that catalog contains identity service\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"6e714d44_6dec1394","line":71,"range":{"start_line":50,"start_character":0,"end_line":71,"end_character":13},"updated":"2025-08-18 13:09:55.000000000","message":"The formatter output is not the responsibility of OSC. Rather, it is functionality provided by cliff which OSC uses (via osc-lib). I don\u0027t believe we should be testing these specifically. Likewise for the column selection option.\n\nInstead, could I ask you to rework this so that we have a single test case, `test_catalog`, where you test the following:\n\n* list\n* show by service type\n* show by service name\n* show non-existent service\n\nSo you will need to merge `test_list` and `test_show` into a single method `test_catalog`, and then you will need to add two new test cases.","commit_id":"b1e4c2e71fb4abc3f8daa5ed8c5a7522b5a25f5a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        # items may have multiple endpoint urls with empty key"},{"line_number":48,"context_line":"        self.assert_show_fields(items, [\u0027endpoints\u0027, \u0027name\u0027, \u0027type\u0027, \u0027\u0027, \u0027id\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_catalog_list_json_format(self):"},{"line_number":51,"context_line":"        \"\"\"Test catalog list with JSON output format\"\"\""},{"line_number":52,"context_line":"        json_output \u003d self.openstack(\u0027catalog list\u0027, parse_output\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        # Verify basic structure"},{"line_number":55,"context_line":"        self.assertIsInstance("},{"line_number":56,"context_line":"            json_output, list, \"JSON output should be a list\""},{"line_number":57,"context_line":"        )"},{"line_number":58,"context_line":"        self.assertGreater("},{"line_number":59,"context_line":"            len(json_output), 0, \"Should have at least one service\""},{"line_number":60,"context_line":"        )"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        # Verify each service has required fields"},{"line_number":63,"context_line":"        for service in json_output:"},{"line_number":64,"context_line":"            self.assertIsInstance("},{"line_number":65,"context_line":"                service, dict, \"Each service should be a dictionary\""},{"line_number":66,"context_line":"            )"},{"line_number":67,"context_line":"            self.assertIn(\u0027Name\u0027, service, \"Service should have Name\")"},{"line_number":68,"context_line":"            self.assertIn(\u0027Type\u0027, service, \"Service should have Type\")"},{"line_number":69,"context_line":"            self.assertIn("},{"line_number":70,"context_line":"                \u0027Endpoints\u0027, service, \"Service should have Endpoints\""},{"line_number":71,"context_line":"            )"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def test_catalog_list_contains_identity_service(self):"},{"line_number":74,"context_line":"        \"\"\"Test that catalog contains identity service\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ebfc40b4_9561d78c","line":71,"range":{"start_line":50,"start_character":0,"end_line":71,"end_character":13},"in_reply_to":"6e714d44_6dec1394","updated":"2025-08-21 16:19:55.000000000","message":"Done","commit_id":"b1e4c2e71fb4abc3f8daa5ed8c5a7522b5a25f5a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":14,"context_line":"from openstackclient.tests.functional.identity.v3 import common"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class CatalogTestsV2(common.IdentityTests):"},{"line_number":18,"context_line":"    \"\"\"Functional tests for catalog commands\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    def test_catalog(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"702fd2bf_ec6feb48","line":17,"updated":"2025-08-21 16:19:55.000000000","message":"You don\u0027t need the V2 suffix here","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ee0009ba979556b7d4c883174fef5f7399733c5b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from openstackclient.tests.functional.identity.v3 import common"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class CatalogTestsV2(common.IdentityTests):"},{"line_number":18,"context_line":"    \"\"\"Functional tests for catalog commands\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    def test_catalog(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"f1c51900_afc5f03e","line":17,"in_reply_to":"702fd2bf_ec6feb48","updated":"2025-09-09 21:24:03.000000000","message":"Done","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":18,"context_line":"    \"\"\"Functional tests for catalog commands\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    def test_catalog(self):"},{"line_number":21,"context_line":"        \"\"\"Test catalog list and show functionality\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        # Test catalog list"},{"line_number":24,"context_line":"        raw_output \u003d self.openstack(\u0027catalog list\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"50ac2c1a_919463f7","line":21,"updated":"2025-08-21 16:19:55.000000000","message":"Is it possible to extend the test and create/delete/update a new service? If you created the service at the start, you could use the created service for the show commands.","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ee0009ba979556b7d4c883174fef5f7399733c5b","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    \"\"\"Functional tests for catalog commands\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    def test_catalog(self):"},{"line_number":21,"context_line":"        \"\"\"Test catalog list and show functionality\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        # Test catalog list"},{"line_number":24,"context_line":"        raw_output \u003d self.openstack(\u0027catalog list\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"58e9871c_363b5e05","line":21,"in_reply_to":"50ac2c1a_919463f7","updated":"2025-09-09 21:24:03.000000000","message":"Done","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":20,"context_line":"    def test_catalog(self):"},{"line_number":21,"context_line":"        \"\"\"Test catalog list and show functionality\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        # Test catalog list"},{"line_number":24,"context_line":"        raw_output \u003d self.openstack(\u0027catalog list\u0027)"},{"line_number":25,"context_line":"        items \u003d self.parse_listing(raw_output)"},{"line_number":26,"context_line":"        self.assert_table_structure(items, [\u0027Name\u0027, \u0027Type\u0027, \u0027Endpoints\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"2cd2620f_f3264a63","line":23,"updated":"2025-08-21 16:19:55.000000000","message":"```suggestion\n        # list catalogs\n\n```","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ee0009ba979556b7d4c883174fef5f7399733c5b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    def test_catalog(self):"},{"line_number":21,"context_line":"        \"\"\"Test catalog list and show functionality\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        # Test catalog list"},{"line_number":24,"context_line":"        raw_output \u003d self.openstack(\u0027catalog list\u0027)"},{"line_number":25,"context_line":"        items \u003d self.parse_listing(raw_output)"},{"line_number":26,"context_line":"        self.assert_table_structure(items, [\u0027Name\u0027, \u0027Type\u0027, \u0027Endpoints\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"8d64048c_8eaacef2","line":23,"in_reply_to":"2cd2620f_f3264a63","updated":"2025-09-09 21:24:03.000000000","message":"Done","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":35,"context_line":"            \"Identity service must be present in catalog\","},{"line_number":36,"context_line":"        )"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Test show by service type"},{"line_number":39,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show identity\u0027)"},{"line_number":40,"context_line":"        items \u003d self.parse_show(raw_output)"},{"line_number":41,"context_line":"        all_fields \u003d set()"}],"source_content_type":"text/x-python","patch_set":3,"id":"b6cc520a_8f2e9aca","line":38,"updated":"2025-08-21 16:19:55.000000000","message":"```suggestion\n        # show service (by type)\n\n```","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ee0009ba979556b7d4c883174fef5f7399733c5b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            \"Identity service must be present in catalog\","},{"line_number":36,"context_line":"        )"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Test show by service type"},{"line_number":39,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show identity\u0027)"},{"line_number":40,"context_line":"        items \u003d self.parse_show(raw_output)"},{"line_number":41,"context_line":"        all_fields \u003d set()"}],"source_content_type":"text/x-python","patch_set":3,"id":"337ec2b4_be242db7","line":38,"in_reply_to":"b6cc520a_8f2e9aca","updated":"2025-09-09 21:24:03.000000000","message":"Done","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        # Test show by service type"},{"line_number":39,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show identity\u0027)"},{"line_number":40,"context_line":"        items \u003d self.parse_show(raw_output)"},{"line_number":41,"context_line":"        all_fields \u003d set()"},{"line_number":42,"context_line":"        for item in items:"},{"line_number":43,"context_line":"            all_fields.update(item.keys())"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        expected_fields \u003d [\u0027endpoints\u0027, \u0027name\u0027, \u0027type\u0027, \u0027id\u0027]"},{"line_number":46,"context_line":"        for field in expected_fields:"},{"line_number":47,"context_line":"            self.assertIn("},{"line_number":48,"context_line":"                field, all_fields, f\"Should have \u0027{field}\u0027 field in output\""},{"line_number":49,"context_line":"            )"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # Test show by service name (assuming keystone is the identity service name)"},{"line_number":52,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show keystone\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"acc91013_bc7e8df2","line":49,"range":{"start_line":41,"start_character":0,"end_line":49,"end_character":13},"updated":"2025-08-21 16:19:55.000000000","message":"Why did you rework this? What we had before was more succinct. Unless there\u0027s a reason to change this, I suggest reverting this\n\n\n```suggestion\n        # items may have multiple endpoint urls with empty key\n        self.assert_show_fields(items, [\u0027endpoints\u0027, \u0027name\u0027, \u0027type\u0027, \u0027\u0027, \u0027id\u0027])\n```","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ee0009ba979556b7d4c883174fef5f7399733c5b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # Test show by service type"},{"line_number":39,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show identity\u0027)"},{"line_number":40,"context_line":"        items \u003d self.parse_show(raw_output)"},{"line_number":41,"context_line":"        all_fields \u003d set()"},{"line_number":42,"context_line":"        for item in items:"},{"line_number":43,"context_line":"            all_fields.update(item.keys())"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        expected_fields \u003d [\u0027endpoints\u0027, \u0027name\u0027, \u0027type\u0027, \u0027id\u0027]"},{"line_number":46,"context_line":"        for field in expected_fields:"},{"line_number":47,"context_line":"            self.assertIn("},{"line_number":48,"context_line":"                field, all_fields, f\"Should have \u0027{field}\u0027 field in output\""},{"line_number":49,"context_line":"            )"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # Test show by service name (assuming keystone is the identity service name)"},{"line_number":52,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show keystone\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3cc5d389_216cfa4b","line":49,"range":{"start_line":41,"start_character":0,"end_line":49,"end_character":13},"in_reply_to":"acc91013_bc7e8df2","updated":"2025-09-09 21:24:03.000000000","message":"Done","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":48,"context_line":"                field, all_fields, f\"Should have \u0027{field}\u0027 field in output\""},{"line_number":49,"context_line":"            )"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # Test show by service name (assuming keystone is the identity service name)"},{"line_number":52,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show keystone\u0027)"},{"line_number":53,"context_line":"        items \u003d self.parse_show(raw_output)"},{"line_number":54,"context_line":"        all_fields \u003d set()"}],"source_content_type":"text/x-python","patch_set":3,"id":"4852cb06_400cf856","line":51,"updated":"2025-08-21 16:19:55.000000000","message":"```suggestion\n        # show service (by name)\n```","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ee0009ba979556b7d4c883174fef5f7399733c5b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                field, all_fields, f\"Should have \u0027{field}\u0027 field in output\""},{"line_number":49,"context_line":"            )"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # Test show by service name (assuming keystone is the identity service name)"},{"line_number":52,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show keystone\u0027)"},{"line_number":53,"context_line":"        items \u003d self.parse_show(raw_output)"},{"line_number":54,"context_line":"        all_fields \u003d set()"}],"source_content_type":"text/x-python","patch_set":3,"id":"f25440f5_5e6f97db","line":51,"in_reply_to":"4852cb06_400cf856","updated":"2025-09-09 21:24:03.000000000","message":"Done","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":51,"context_line":"        # Test show by service name (assuming keystone is the identity service name)"},{"line_number":52,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show keystone\u0027)"},{"line_number":53,"context_line":"        items \u003d self.parse_show(raw_output)"},{"line_number":54,"context_line":"        all_fields \u003d set()"},{"line_number":55,"context_line":"        for item in items:"},{"line_number":56,"context_line":"            all_fields.update(item.keys())"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        for field in expected_fields:"},{"line_number":59,"context_line":"            self.assertIn("},{"line_number":60,"context_line":"                field,"},{"line_number":61,"context_line":"                all_fields,"},{"line_number":62,"context_line":"                f\"Should have \u0027{field}\u0027 field when showing by name\","},{"line_number":63,"context_line":"            )"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # Test show non-existent service"},{"line_number":66,"context_line":"        result \u003d self.openstack("}],"source_content_type":"text/x-python","patch_set":3,"id":"600bd5b3_9dd6feae","line":63,"range":{"start_line":54,"start_character":0,"end_line":63,"end_character":13},"updated":"2025-08-21 16:19:55.000000000","message":"Same comment as above:\n\n\n```suggestion\n        # items may have multiple endpoint urls with empty key\n        self.assert_show_fields(items, [\u0027endpoints\u0027, \u0027name\u0027, \u0027type\u0027, \u0027\u0027, \u0027id\u0027])\n```","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ee0009ba979556b7d4c883174fef5f7399733c5b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # Test show by service name (assuming keystone is the identity service name)"},{"line_number":52,"context_line":"        raw_output \u003d self.openstack(\u0027catalog show keystone\u0027)"},{"line_number":53,"context_line":"        items \u003d self.parse_show(raw_output)"},{"line_number":54,"context_line":"        all_fields \u003d set()"},{"line_number":55,"context_line":"        for item in items:"},{"line_number":56,"context_line":"            all_fields.update(item.keys())"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        for field in expected_fields:"},{"line_number":59,"context_line":"            self.assertIn("},{"line_number":60,"context_line":"                field,"},{"line_number":61,"context_line":"                all_fields,"},{"line_number":62,"context_line":"                f\"Should have \u0027{field}\u0027 field when showing by name\","},{"line_number":63,"context_line":"            )"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # Test show non-existent service"},{"line_number":66,"context_line":"        result \u003d self.openstack("}],"source_content_type":"text/x-python","patch_set":3,"id":"761fb22f_bc431010","line":63,"range":{"start_line":54,"start_character":0,"end_line":63,"end_character":13},"in_reply_to":"600bd5b3_9dd6feae","updated":"2025-09-09 21:24:03.000000000","message":"Done","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"309715d948c3d835953b2554db87435993dcac31","unresolved":true,"context_lines":[{"line_number":62,"context_line":"                f\"Should have \u0027{field}\u0027 field when showing by name\","},{"line_number":63,"context_line":"            )"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # Test show non-existent service"},{"line_number":66,"context_line":"        result \u003d self.openstack("},{"line_number":67,"context_line":"            \u0027catalog show nonexistent-service-xyz\u0027, fail_ok\u003dTrue"},{"line_number":68,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":3,"id":"b78adb33_091344e6","line":65,"updated":"2025-08-21 16:19:55.000000000","message":"```suggestion\n        # show service (non-existent)\n```","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ee0009ba979556b7d4c883174fef5f7399733c5b","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                f\"Should have \u0027{field}\u0027 field when showing by name\","},{"line_number":63,"context_line":"            )"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # Test show non-existent service"},{"line_number":66,"context_line":"        result \u003d self.openstack("},{"line_number":67,"context_line":"            \u0027catalog show nonexistent-service-xyz\u0027, fail_ok\u003dTrue"},{"line_number":68,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":3,"id":"73bd4c23_6ec31f1b","line":65,"in_reply_to":"b78adb33_091344e6","updated":"2025-09-09 21:24:03.000000000","message":"Done","commit_id":"c937b629c196e8aa75f27d51d08e8b7829807632"}]}
