)]}'
{"troveclient/osc/v1/database_clusters.py":[{"author":{"_account_id":13157,"name":"Zhao Chao","email":"zhaochao1984@gmail.com","username":"zhaochao"},"change_message_id":"31ed93d82c81c27ad47d0310cf6bcbbc6e7bc8eb","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            for item in new_list:"},{"line_number":376,"context_line":"                item.instance_id \u003d instance[\u0027id\u0027]"},{"line_number":377,"context_line":"                item.instance_name \u003d instance[\u0027name\u0027]"},{"line_number":378,"context_line":"                item._info[\u0027module\u0027][\u0027module_name\u0027] \u003d \\"},{"line_number":379,"context_line":"                    item._info[\u0027module\u0027][\u0027name\u0027]"},{"line_number":380,"context_line":"                item._info[\u0027module\u0027][\u0027module_type\u0027] \u003d \\"},{"line_number":381,"context_line":"                    item._info[\u0027module\u0027][\u0027type\u0027]"},{"line_number":382,"context_line":"            modules +\u003d new_list"},{"line_number":383,"context_line":"        modules \u003d [utils.get_dict_properties(module._info[\u0027module\u0027],"},{"line_number":384,"context_line":"                                             self.columns)"},{"line_number":385,"context_line":"                   for module in modules]"},{"line_number":386,"context_line":"        return self.columns, modules"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_fc99fc1e","line":384,"range":{"start_line":378,"start_character":16,"end_line":384,"end_character":58},"updated":"2018-04-17 07:27:52.000000000","message":"In fact we need a list of \u0027troveclient.v1.modules.Module\u0027 object for \u0027new_list\u0027, the hidden attribute \u0027_info\u0027 should not be used to do this job.\n\nI know the reason is the uncertainty about the API response, I add a sample response in the comment of troveclient/tests/fakes.py.","commit_id":"a8c57a212da8db6ec74635932a8e7cb68be15789"},{"author":{"_account_id":22608,"name":"zhanggang","email":"zhanggang@cmss.chinamobile.com","username":"zhanggang"},"change_message_id":"cf8e0c605c776f7050cb67d53fca02a6ae53bf0a","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        instances \u003d cluster._info[\u0027instances\u0027]"},{"line_number":372,"context_line":"        modules \u003d []"},{"line_number":373,"context_line":"        for instance in instances:"},{"line_number":374,"context_line":"            new_list \u003d database_instances.modules(instance[\u0027id\u0027])"},{"line_number":375,"context_line":"            for item in new_list:"},{"line_number":376,"context_line":"                item.instance_id \u003d instance[\u0027id\u0027]"},{"line_number":377,"context_line":"                item.instance_name \u003d instance[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_ff56aa2a","line":374,"range":{"start_line":374,"start_character":42,"end_line":374,"end_character":49},"updated":"2018-06-19 03:20:15.000000000","message":"I know this comes from do_cluster_modules. And database_instances also has a method module_query. \"modules\" and \"module_query\" do the same request except a parameter \"from_guest\". However, although the moudle_list[1] call different methods based the \"from_guest\" , the different methods are acutally the same[2] [3].It seems the method \"_module_list\" is something wrong.\n\n[1] https://github.com/openstack/trove/blob/9cdb08cb7be0a2b9edf2b3ce173009606750ea97/trove/instance/service.py#L505\n[2] https://github.com/openstack/trove/blob/9cdb08cb7be0a2b9edf2b3ce173009606750ea97/trove/instance/service.py#L512\n[3] https://github.com/openstack/trove/blob/9cdb08cb7be0a2b9edf2b3ce173009606750ea97/trove/instance/service.py#L518","commit_id":"3e2af3d68dc218767e9b050668d8ad9d575b4737"},{"author":{"_account_id":13157,"name":"Zhao Chao","email":"zhaochao1984@gmail.com","username":"zhaochao"},"change_message_id":"0890334b544cff66f6387d564f8fdb3eeb754c8f","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        instances \u003d cluster._info[\u0027instances\u0027]"},{"line_number":372,"context_line":"        modules \u003d []"},{"line_number":373,"context_line":"        for instance in instances:"},{"line_number":374,"context_line":"            new_list \u003d database_instances.modules(instance[\u0027id\u0027])"},{"line_number":375,"context_line":"            for item in new_list:"},{"line_number":376,"context_line":"                item.instance_id \u003d instance[\u0027id\u0027]"},{"line_number":377,"context_line":"                item.instance_name \u003d instance[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_9a96a43e","line":374,"range":{"start_line":374,"start_character":42,"end_line":374,"end_character":49},"in_reply_to":"5f7c97a3_ff56aa2a","updated":"2018-06-20 06:44:27.000000000","message":"Yes, _module_list and _module_list_guest are duplicates, no idea why _module_list_guest was added originally, we could just removed it and the \u0027from_guest\u0027 request parameter.","commit_id":"3e2af3d68dc218767e9b050668d8ad9d575b4737"}],"troveclient/tests/fakes.py":[{"author":{"_account_id":13157,"name":"Zhao Chao","email":"zhaochao1984@gmail.com","username":"zhaochao"},"change_message_id":"31ed93d82c81c27ad47d0310cf6bcbbc6e7bc8eb","unresolved":false,"context_lines":[{"line_number":567,"context_line":"        return (200, {}, None)"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"    def get_instances_1234_modules(self, **kw):"},{"line_number":570,"context_line":"        return (200, {}, {\"modules\": [{\"module\": {"},{"line_number":571,"context_line":"            \u0027instance_name\u0027: \u0027member-1\u0027, \u0027name\u0027: \u0027mod1\u0027, \u0027type\u0027: \u0027ping\u0027,"},{"line_number":572,"context_line":"            \u0027md5\u0027: \u0027md5\u0027, \u0027created\u0027: \u0027created\u0027, \u0027updated\u0027: \u0027updated\u0027}}]})"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"    def get_modules_4321_instances(self, **kw):"},{"line_number":575,"context_line":"        if kw.get(\u0027count_only\u0027, False):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_dcbd1869","line":572,"range":{"start_line":570,"start_character":25,"end_line":572,"end_character":72},"updated":"2018-04-17 07:27:52.000000000","message":"The correct API response is:\n\n{\n    \"modules\": [\n        {\n            \"auto_apply\": false,\n            \"contents\": null,\n            \"created\": \"2018-04-17 05:34:02.84\",\n            \"datastore\": \"mariadb\",\n            \"datastore_version\": \"all\",\n            \"id\": \"8a42f71d-dfd2-452d-af2b-3fd670ae5116\",\n            \"is_admin\": false,\n            \"md5\": \"7f700cc7b99606615f8b51946f6d3228\",\n            \"message\": \"Module.V1\",\n            \"name\": \"mymod\",\n            \"removed\": null,\n            \"status\": \"OK\",\n            \"tenant\": \"7f1f041fc291455b83a0b3eb98140808\",\n            \"type\": \"ping\",\n            \"updated\": \"2018-04-17 05:34:02.84\",\n            \"visible\": true\n        }\n    ]\n}","commit_id":"a8c57a212da8db6ec74635932a8e7cb68be15789"}],"troveclient/tests/osc/v1/fakes.py":[{"author":{"_account_id":13157,"name":"Zhao Chao","email":"zhaochao1984@gmail.com","username":"zhaochao"},"change_message_id":"f615144e2b2d67852e08fe12014890f8d2f46a9b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def get_clusters_member_2(self):"},{"line_number":64,"context_line":"        return instances.Instance(None, self.fake_cluster_member)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def cluster_instance_modules_1(self):"},{"line_number":67,"context_line":"        return [modules.Module(None, self.fake_cluster_instance_modules[0])]"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def cluster_instance_modules_2(self):"},{"line_number":70,"context_line":"        return [modules.Module(None, self.fake_cluster_instance_modules[1])]"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class FakeConfigurations(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_02601dcf","line":70,"range":{"start_line":66,"start_character":0,"end_line":70,"end_character":76},"updated":"2018-06-15 15:08:16.000000000","message":"Looks like it\u0027s not necessary to add seperate functions for modules_1 and modules_2?\n\nCould these change to be something like the following lines?\n\n    def cluster_instance_modules(self):\n        return [modules.Module(None, mod)\n                for mod in self.fake_cluster_instance_modues]","commit_id":"a6d27d6ecef359d95d2848d8fbf6c7fe787b8ca8"}],"troveclient/tests/osc/v1/test_database_clusters.py":[{"author":{"_account_id":13157,"name":"Zhao Chao","email":"zhaochao1984@gmail.com","username":"zhaochao"},"change_message_id":"31ed93d82c81c27ad47d0310cf6bcbbc6e7bc8eb","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    columns \u003d (database_clusters"},{"line_number":298,"context_line":"               .ListDatabaseClusterModules.columns)"},{"line_number":299,"context_line":"    values \u003d [(\u0027member-1\u0027, \u0027mod1\u0027, \u0027ping\u0027, \u0027md5\u0027, \u0027created\u0027, \u0027updated\u0027),"},{"line_number":300,"context_line":"              (\u0027member-1\u0027, \u0027mod1\u0027, \u0027ping\u0027, \u0027md5\u0027, \u0027created\u0027, \u0027updated\u0027)]"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def setUp(self):"},{"line_number":303,"context_line":"        super(TestClusterListModules, self).setUp()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_dc30b80a","line":300,"range":{"start_line":299,"start_character":14,"end_line":300,"end_character":71},"updated":"2018-04-17 07:27:52.000000000","message":"This could be refined, at least the names of the instances should be equal to the fake instances of the fake cluster(i.e. \u0027member-1\u0027 and \u0027member-2\u0027). The mocked function \u0027self.instance_client.modules\u0027 could return different items with the \u0027side_effect\u0027 attribute.","commit_id":"a8c57a212da8db6ec74635932a8e7cb68be15789"},{"author":{"_account_id":13157,"name":"Zhao Chao","email":"zhaochao1984@gmail.com","username":"zhaochao"},"change_message_id":"f615144e2b2d67852e08fe12014890f8d2f46a9b","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        self.cmd \u003d (database_clusters"},{"line_number":307,"context_line":"                    .ListDatabaseClusterModules(self.app, None))"},{"line_number":308,"context_line":"        self.data \u003d self.fake_clusters.get_clusters_cls_1234()"},{"line_number":309,"context_line":"        self.module_1 \u003d self.fake_clusters.cluster_instance_modules_1()"},{"line_number":310,"context_line":"        self.module_2 \u003d self.fake_clusters.cluster_instance_modules_2()"},{"line_number":311,"context_line":"        self.instance_client.modules.side_effect \u003d [self.module_1,"},{"line_number":312,"context_line":"                                                    self.module_2]"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    @mock.patch.object(utils, \u0027find_resource\u0027)"},{"line_number":315,"context_line":"    def test_cluster_list_modules(self, mock_find_resource):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_02b57d32","line":312,"range":{"start_line":309,"start_character":8,"end_line":312,"end_character":66},"updated":"2018-06-15 15:08:16.000000000","message":"If we changed cluster_instance_modules_1 and cluster_instance_modules_2, these 3 lines could be squashed into 1 line:\n\n    self.instance_client.mdules.side_effect \u003d (\n        self.fake_clusters.cluster_instance_modules())","commit_id":"a6d27d6ecef359d95d2848d8fbf6c7fe787b8ca8"},{"author":{"_account_id":13157,"name":"Zhao Chao","email":"zhaochao1984@gmail.com","username":"zhaochao"},"change_message_id":"45c4798f689eeff1432955662ece24ec58558d85","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        self.cmd \u003d (database_clusters"},{"line_number":307,"context_line":"                    .ListDatabaseClusterModules(self.app, None))"},{"line_number":308,"context_line":"        self.data \u003d self.fake_clusters.get_clusters_cls_1234()"},{"line_number":309,"context_line":"        self.instance_client.modules.side_effect \u003d \\"},{"line_number":310,"context_line":"            (self.fake_clusters.cluster_instance_modules())"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    @mock.patch.object(utils, \u0027find_resource\u0027)"},{"line_number":313,"context_line":"    def test_cluster_list_modules(self, mock_find_resource):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_f186ff16","line":310,"range":{"start_line":309,"start_character":51,"end_line":310,"end_character":59},"updated":"2018-06-17 13:50:23.000000000","message":"Generally it\u0027s better to use parentheses than back slash for line breaking.","commit_id":"3e2af3d68dc218767e9b050668d8ad9d575b4737"}]}
