)]}'
{"neutron/extensions/loggingapi.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"871e0507c94745a9f9f4ba54f33523db8a93369d","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    path_prefix \u003d LOG_PREFIX"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def get_plugin_description(self):"},{"line_number":171,"context_line":"        return \"Logging API Service Plugin for Security group\""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @classmethod"},{"line_number":174,"context_line":"    def get_plugin_type(cls):"}],"source_content_type":"text/x-python","patch_set":9,"id":"da4df55a_6110665a","line":171,"range":{"start_line":171,"start_character":42,"end_line":171,"end_character":61},"updated":"2016-12-26 10:09:06.000000000","message":"can you separate SG specific part?","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"9eacd2c1f65c9a197228d0d7131c45778b0ee5f3","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    path_prefix \u003d LOG_PREFIX"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def get_plugin_description(self):"},{"line_number":171,"context_line":"        return \"Logging API Service Plugin for Security group\""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @classmethod"},{"line_number":174,"context_line":"    def get_plugin_type(cls):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5201f7_115af483","line":171,"range":{"start_line":171,"start_character":42,"end_line":171,"end_character":61},"in_reply_to":"da4df55a_6110665a","updated":"2016-12-30 06:35:29.000000000","message":"This API for security group and other resources like firewall so I think we no need to specific SG part. I\u0027ve updated the message. Sorry for made you confused.","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15905,"name":"Cao Xuan Hoang","email":"xuanhoangqb@gmail.com","username":"hoangcx"},"change_message_id":"5b9f1911f7fac68ae2b1408b6380db0b55b03e58","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":43,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":44,"context_line":"                      \u0027validate\u0027: {"},{"line_number":45,"context_line":"                          \u0027type:string\u0027: db_const.LONG_DESCRIPTION_FIELD_SIZE},"},{"line_number":46,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":47,"context_line":"        \u0027project_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":48,"context_line":"                       \u0027required_by_policy\u0027: True,"}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_3acdb830","line":45,"range":{"start_line":45,"start_character":50,"end_line":45,"end_character":77},"updated":"2017-06-05 07:11:33.000000000","message":"This field should be \"PROJECT_ID_FIELD_SIZE\".","commit_id":"fb86dc7d95baff84dd3a87ddb3a51705d732e43c"},{"author":{"_account_id":15905,"name":"Cao Xuan Hoang","email":"xuanhoangqb@gmail.com","username":"hoangcx"},"change_message_id":"5b9f1911f7fac68ae2b1408b6380db0b55b03e58","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                       \u0027required_by_policy\u0027: True,"},{"line_number":49,"context_line":"                       \u0027validate\u0027: {"},{"line_number":50,"context_line":"                           \u0027type:string\u0027:"},{"line_number":51,"context_line":"                               db_const.LONG_DESCRIPTION_FIELD_SIZE},"},{"line_number":52,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":53,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":54,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: db_const.NAME_FIELD_SIZE},"}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_1ad0b4c8","line":51,"range":{"start_line":51,"start_character":40,"end_line":51,"end_character":67},"updated":"2017-06-05 07:11:33.000000000","message":"ditto","commit_id":"fb86dc7d95baff84dd3a87ddb3a51705d732e43c"},{"author":{"_account_id":15905,"name":"Cao Xuan Hoang","email":"xuanhoangqb@gmail.com","username":"hoangcx"},"change_message_id":"5b9f1911f7fac68ae2b1408b6380db0b55b03e58","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"class Loggingapi(api_extensions.ExtensionDescriptor):"},{"line_number":86,"context_line":"    \"\"\"Neutron logging api extension.\"\"\""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @classmethod"},{"line_number":89,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_3af6d864","line":86,"range":{"start_line":86,"start_character":7,"end_line":86,"end_character":14},"updated":"2017-06-05 07:11:33.000000000","message":"Neutron looks so redundancy here as this is already belong to Neutron.","commit_id":"fb86dc7d95baff84dd3a87ddb3a51705d732e43c"},{"author":{"_account_id":15905,"name":"Cao Xuan Hoang","email":"xuanhoangqb@gmail.com","username":"hoangcx"},"change_message_id":"5b9f1911f7fac68ae2b1408b6380db0b55b03e58","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    @classmethod"},{"line_number":97,"context_line":"    def get_description(cls):"},{"line_number":98,"context_line":"        return \"The neutron logging api extension.\""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @classmethod"},{"line_number":101,"context_line":"    def get_namespace(cls):"}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_faebc074","line":98,"range":{"start_line":98,"start_character":20,"end_line":98,"end_character":27},"updated":"2017-06-05 07:11:33.000000000","message":"ditto","commit_id":"fb86dc7d95baff84dd3a87ddb3a51705d732e43c"},{"author":{"_account_id":15905,"name":"Cao Xuan Hoang","email":"xuanhoangqb@gmail.com","username":"hoangcx"},"change_message_id":"5b9f1911f7fac68ae2b1408b6380db0b55b03e58","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        return \"The neutron logging api extension.\""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @classmethod"},{"line_number":101,"context_line":"    def get_namespace(cls):"},{"line_number":102,"context_line":"        # todo"},{"line_number":103,"context_line":"        return \"http://docs.openstack.org/ext/logging-api/v2.0\""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"df140735_5a662c2c","line":101,"range":{"start_line":101,"start_character":4,"end_line":101,"end_character":27},"updated":"2017-06-05 07:11:33.000000000","message":"This was removed long time ago [1]\n\n[1] https://review.openstack.org/#/c/190215/","commit_id":"fb86dc7d95baff84dd3a87ddb3a51705d732e43c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"40217195b56224e162d63b7efa5c0321da59a0fb","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import abc"},{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":"from neutron_lib.api import converters"},{"line_number":19,"context_line":"from neutron_lib.api import extensions as api_extensions"},{"line_number":20,"context_line":"from neutron_lib.db import constants as db_const"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f201791_53b71bf6","line":17,"updated":"2017-06-28 10:43:27.000000000","message":"nit first 2 are not third party libs","commit_id":"7df67fd6f15a3ace9804bc349b839cbc42177e9a"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"3e1c64fe80b90da5e18f2f090c3474c21a4c3dc0","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import abc"},{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":"from neutron_lib.api import converters"},{"line_number":19,"context_line":"from neutron_lib.api import extensions as api_extensions"},{"line_number":20,"context_line":"from neutron_lib.db import constants as db_const"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f1d235d_242bf394","line":17,"in_reply_to":"5f201791_53b71bf6","updated":"2017-06-30 09:41:00.000000000","message":"Done","commit_id":"7df67fd6f15a3ace9804bc349b839cbc42177e9a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"40217195b56224e162d63b7efa5c0321da59a0fb","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      \u0027validate\u0027: {"},{"line_number":43,"context_line":"                          \u0027type:string\u0027: db_const.PROJECT_ID_FIELD_SIZE},"},{"line_number":44,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":45,"context_line":"        \u0027project_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":46,"context_line":"                       \u0027required_by_policy\u0027: True,"},{"line_number":47,"context_line":"                       \u0027validate\u0027: {"},{"line_number":48,"context_line":"                           \u0027type:string\u0027:"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f201791_d3c20b53","line":45,"updated":"2017-06-28 10:43:27.000000000","message":"why do we need both the tenant_id and project_id? why not just the project id?","commit_id":"7df67fd6f15a3ace9804bc349b839cbc42177e9a"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"3e1c64fe80b90da5e18f2f090c3474c21a4c3dc0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      \u0027validate\u0027: {"},{"line_number":43,"context_line":"                          \u0027type:string\u0027: db_const.PROJECT_ID_FIELD_SIZE},"},{"line_number":44,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":45,"context_line":"        \u0027project_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":46,"context_line":"                       \u0027required_by_policy\u0027: True,"},{"line_number":47,"context_line":"                       \u0027validate\u0027: {"},{"line_number":48,"context_line":"                           \u0027type:string\u0027:"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f1d235d_64c8cb54","line":45,"in_reply_to":"5f201791_d3c20b53","updated":"2017-06-30 09:41:00.000000000","message":"Thank you Gary. Done","commit_id":"7df67fd6f15a3ace9804bc349b839cbc42177e9a"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2017 Fujitsu Limited"},{"line_number":2,"context_line":"# All rights reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_ec835dcb","line":1,"updated":"2017-07-04 03:31:30.000000000","message":"Question: This file name is \"loggingapi\" but name of api definition is \"logging\" in neutron_lib. I think that same name is better. Why is different?","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2017 Fujitsu Limited"},{"line_number":2,"context_line":"# All rights reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_87a7180c","line":1,"in_reply_to":"3f1d235d_ec835dcb","updated":"2017-07-04 10:08:51.000000000","message":"It should be \u0027logging\u0027. Done.","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from neutron.plugins.common import constants"},{"line_number":28,"context_line":"from neutron.services.logapi.common import constants as log_const"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG_PREFIX \u003d \"/log\""}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_6cf4ed86","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":33},"updated":"2017-07-04 03:31:30.000000000","message":"This is not used so should be removed.","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from neutron.plugins.common import constants"},{"line_number":28,"context_line":"from neutron.services.logapi.common import constants as log_const"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG_PREFIX \u003d \"/log\""}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_67b07c44","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":33},"in_reply_to":"3f1d235d_6cf4ed86","updated":"2017-07-04 10:08:51.000000000","message":"Done","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"}],"neutron/plugins/ml2/managers.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"871e0507c94745a9f9f4ba54f33523db8a93369d","unresolved":false,"context_lines":[{"line_number":407,"context_line":"                LOG.warning(_LW(\"%s does not support logging types; \""},{"line_number":408,"context_line":"                                \"no resource logging types available\"),"},{"line_number":409,"context_line":"                            driver.name)"},{"line_number":410,"context_line":"                # return []"},{"line_number":411,"context_line":"        LOG.debug(\"Supported logging types %s\", str(log_types))"},{"line_number":412,"context_line":"        return list(log_types)"},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da4df55a_c15d9248","line":410,"range":{"start_line":410,"start_character":16,"end_line":410,"end_character":27},"updated":"2016-12-26 10:09:06.000000000","message":"?","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"9eacd2c1f65c9a197228d0d7131c45778b0ee5f3","unresolved":false,"context_lines":[{"line_number":407,"context_line":"                LOG.warning(_LW(\"%s does not support logging types; \""},{"line_number":408,"context_line":"                                \"no resource logging types available\"),"},{"line_number":409,"context_line":"                            driver.name)"},{"line_number":410,"context_line":"                # return []"},{"line_number":411,"context_line":"        LOG.debug(\"Supported logging types %s\", str(log_types))"},{"line_number":412,"context_line":"        return list(log_types)"},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5201f7_51547c53","line":410,"range":{"start_line":410,"start_character":16,"end_line":410,"end_character":27},"in_reply_to":"da4df55a_c15d9248","updated":"2016-12-30 06:35:29.000000000","message":"It should be: return []. Thanks.","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"}],"neutron/services/logapi/common/constants.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"cf4387154be2ff5ea5e25028addc3287cc06354c","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":22,"context_line":"SECURITY_GROUPS \u003d \u0027security_groups\u0027"},{"line_number":23,"context_line":"# mapping of resource types name, if user specify"},{"line_number":24,"context_line":"# \u0027resource_type\u0027: \u0027security_group\u0027 or \u0027resource_type\u0027: \u0027security_groups\u0027."},{"line_number":25,"context_line":"# they are acceptable."},{"line_number":26,"context_line":"RESOURCE_TYPES_MAP \u003d {"},{"line_number":27,"context_line":"    SECURITY_GROUP: \u0027security_group\u0027,"},{"line_number":28,"context_line":"    SECURITY_GROUPS: \u0027security_group\u0027,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f1d235d_3dcefe2d","line":25,"range":{"start_line":23,"start_character":0,"end_line":25,"end_character":22},"updated":"2017-07-05 05:35:59.000000000","message":"do we really need this type of flexibility?\ni tend to this it\u0027s a bad idea.","commit_id":"debb901b3bf90a3e7c21f65d449a5ad34c852ac2"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"6bba8fdfacf51ca64a597fd7a908405d5dd7468a","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":22,"context_line":"SECURITY_GROUPS \u003d \u0027security_groups\u0027"},{"line_number":23,"context_line":"# mapping of resource types name, if user specify"},{"line_number":24,"context_line":"# \u0027resource_type\u0027: \u0027security_group\u0027 or \u0027resource_type\u0027: \u0027security_groups\u0027."},{"line_number":25,"context_line":"# they are acceptable."},{"line_number":26,"context_line":"RESOURCE_TYPES_MAP \u003d {"},{"line_number":27,"context_line":"    SECURITY_GROUP: \u0027security_group\u0027,"},{"line_number":28,"context_line":"    SECURITY_GROUPS: \u0027security_group\u0027,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f1d235d_a04d45c5","line":25,"range":{"start_line":23,"start_character":0,"end_line":25,"end_character":22},"in_reply_to":"3f1d235d_3dcefe2d","updated":"2017-07-05 06:15:42.000000000","message":"Actually, we no need this. But I\u0027m confused which option \u0027security_group\u0027 or \u0027security_groups\u0027 is exactly for resource_type. Do you have any idea or suggestion?","commit_id":"debb901b3bf90a3e7c21f65d449a5ad34c852ac2"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef364e13dd50a22894ae236a9344bc15fa9e403b","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":22,"context_line":"SECURITY_GROUPS \u003d \u0027security_groups\u0027"},{"line_number":23,"context_line":"# mapping of resource types name, if user specify"},{"line_number":24,"context_line":"# \u0027resource_type\u0027: \u0027security_group\u0027 or \u0027resource_type\u0027: \u0027security_groups\u0027."},{"line_number":25,"context_line":"# they are acceptable."},{"line_number":26,"context_line":"RESOURCE_TYPES_MAP \u003d {"},{"line_number":27,"context_line":"    SECURITY_GROUP: \u0027security_group\u0027,"},{"line_number":28,"context_line":"    SECURITY_GROUPS: \u0027security_group\u0027,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f1d235d_4cba2ac1","line":25,"range":{"start_line":23,"start_character":0,"end_line":25,"end_character":22},"in_reply_to":"3f1d235d_a04d45c5","updated":"2017-07-05 08:25:00.000000000","message":"I think this type is not necessary. So I\u0027d like to remove it. We can add this type or something later, if it necessary in validator\u0027s patch-set [1]. Do you think so?\n[1] https://review.openstack.org/#/c/467976/","commit_id":"debb901b3bf90a3e7c21f65d449a5ad34c852ac2"}],"neutron/services/logapi/common/exceptions.py":[{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class LogResourceNotFound(n_exc.NotFound):"},{"line_number":22,"context_line":"    message \u003d _(\"Log resource %(id)s could not be found.\")"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class InvalidLogReosurceType(n_exc.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_6c086d2b","line":22,"range":{"start_line":22,"start_character":32,"end_line":22,"end_character":34},"updated":"2017-07-04 03:31:30.000000000","message":"\"id\" is built-in function name in python so it\u0027s better not to use.","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class LogResourceNotFound(n_exc.NotFound):"},{"line_number":22,"context_line":"    message \u003d _(\"Log resource %(id)s could not be found.\")"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class InvalidLogReosurceType(n_exc.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_a77b3479","line":22,"range":{"start_line":22,"start_character":32,"end_line":22,"end_character":34},"in_reply_to":"3f1d235d_6c086d2b","updated":"2017-07-04 10:08:51.000000000","message":"Done","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"}],"neutron/services/logapi/common/validators.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"21b7a80d737dac66bceda2b0bdf79d2d58e0e97e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        sg_db.SecurityGroupPortBinding.port_id).filter("},{"line_number":25,"context_line":"        sg_db.SecurityGroupPortBinding.security_group_id \u003d\u003d sg_id,"},{"line_number":26,"context_line":"        sg_db.SecurityGroupPortBinding.port_id \u003d\u003d port_id"},{"line_number":27,"context_line":"    ).one()"},{"line_number":28,"context_line":"    if not port:"},{"line_number":29,"context_line":"        raise log_exc.ResourceConstraintInvalid(resource_id\u003dsg_id,"},{"line_number":30,"context_line":"                                                parent_resource_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_16726d11","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":10},"updated":"2016-12-21 10:38:57.000000000","message":"if you are calling one() it will raise exception NoResultFound when no entry is found, so checking in line 28 is pointless.","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"9eacd2c1f65c9a197228d0d7131c45778b0ee5f3","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        sg_db.SecurityGroupPortBinding.port_id).filter("},{"line_number":25,"context_line":"        sg_db.SecurityGroupPortBinding.security_group_id \u003d\u003d sg_id,"},{"line_number":26,"context_line":"        sg_db.SecurityGroupPortBinding.port_id \u003d\u003d port_id"},{"line_number":27,"context_line":"    ).one()"},{"line_number":28,"context_line":"    if not port:"},{"line_number":29,"context_line":"        raise log_exc.ResourceConstraintInvalid(resource_id\u003dsg_id,"},{"line_number":30,"context_line":"                                                parent_resource_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5201f7_d1c6ac15","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":10},"in_reply_to":"1a6eadb0_16726d11","updated":"2016-12-30 06:35:29.000000000","message":"Thanks for teaching me. This is my mistake. :)","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"}],"neutron/services/logapi/logging_plugin.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"21b7a80d737dac66bceda2b0bdf79d2d58e0e97e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def get_logs(self, context, filters\u003dNone, fields\u003dNone, sorts\u003dNone,"},{"line_number":80,"context_line":"                 limit\u003dNone, marker\u003dNone, page_reverse\u003dFalse):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":83,"context_line":"            pager \u003d base_obj.Pager(sorts, limit, page_reverse, marker)"},{"line_number":84,"context_line":"            return log_object.Log.get_objects(context,"},{"line_number":85,"context_line":"                                              _pager\u003dpager, **filters)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_36320911","line":82,"updated":"2016-12-21 10:38:57.000000000","message":"Transaction is not needed. It is handled in get_object(s).","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"9eacd2c1f65c9a197228d0d7131c45778b0ee5f3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def get_logs(self, context, filters\u003dNone, fields\u003dNone, sorts\u003dNone,"},{"line_number":80,"context_line":"                 limit\u003dNone, marker\u003dNone, page_reverse\u003dFalse):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":83,"context_line":"            pager \u003d base_obj.Pager(sorts, limit, page_reverse, marker)"},{"line_number":84,"context_line":"            return log_object.Log.get_objects(context,"},{"line_number":85,"context_line":"                                              _pager\u003dpager, **filters)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5201f7_11d114ce","line":82,"in_reply_to":"1a6eadb0_36320911","updated":"2016-12-30 06:35:29.000000000","message":"Done","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"21b7a80d737dac66bceda2b0bdf79d2d58e0e97e","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":83,"context_line":"            pager \u003d base_obj.Pager(sorts, limit, page_reverse, marker)"},{"line_number":84,"context_line":"            return log_object.Log.get_objects(context,"},{"line_number":85,"context_line":"                                              _pager\u003dpager, **filters)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @db_base_plugin_common.filter_fields"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_d67555cb","line":84,"updated":"2016-12-21 10:38:57.000000000","message":"You can also specify validate_filters\u003dFalse when calling get_objects. It is because when user of API will pass some random filter to get_logs, the get_objects will error out. It depends on how you would like to handle the filtering.","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"9eacd2c1f65c9a197228d0d7131c45778b0ee5f3","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":83,"context_line":"            pager \u003d base_obj.Pager(sorts, limit, page_reverse, marker)"},{"line_number":84,"context_line":"            return log_object.Log.get_objects(context,"},{"line_number":85,"context_line":"                                              _pager\u003dpager, **filters)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @db_base_plugin_common.filter_fields"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5201f7_31d618c6","line":84,"in_reply_to":"1a6eadb0_d67555cb","updated":"2016-12-30 06:35:29.000000000","message":"Thanks for your teaching.","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"21b7a80d737dac66bceda2b0bdf79d2d58e0e97e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":89,"context_line":"    def get_log(self, context, id, fields\u003dNone):"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":92,"context_line":"            log_obj \u003d log_object.Log.get_object(context, id\u003did)"},{"line_number":93,"context_line":"        if not log_obj:"},{"line_number":94,"context_line":"            raise log_exc.ResourceLogNotFound(id\u003did)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_563785fe","line":91,"updated":"2016-12-21 10:38:57.000000000","message":"ditto line 82.","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"9eacd2c1f65c9a197228d0d7131c45778b0ee5f3","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":89,"context_line":"    def get_log(self, context, id, fields\u003dNone):"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":92,"context_line":"            log_obj \u003d log_object.Log.get_object(context, id\u003did)"},{"line_number":93,"context_line":"        if not log_obj:"},{"line_number":94,"context_line":"            raise log_exc.ResourceLogNotFound(id\u003did)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5201f7_f1cbb01c","line":91,"in_reply_to":"1a6eadb0_563785fe","updated":"2016-12-30 06:35:29.000000000","message":"Done","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"21b7a80d737dac66bceda2b0bdf79d2d58e0e97e","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    def delete_log(self, context, id):"},{"line_number":125,"context_line":"        LOG.debug(\"delete-log-id: %s\", id)"},{"line_number":126,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":127,"context_line":"            log_obj \u003d log_object.Log(context, id\u003did)"},{"line_number":128,"context_line":"            self.logging_rpc.delete_log("},{"line_number":129,"context_line":"                context, [log_object.Log.get_object(context, id\u003did)])"},{"line_number":130,"context_line":"            log_obj.delete()"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get_loggable_resources(self, context, filters\u003dNone, fields\u003dNone,"},{"line_number":133,"context_line":"                               sorts\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_917047a6","line":130,"range":{"start_line":127,"start_character":12,"end_line":130,"end_character":28},"updated":"2016-12-21 10:38:57.000000000","message":"why not first do the get_object and then log it?\n\n    log_obj \u003d log_object.Log.get_object(context, id\u003did)\n    if log_obj:\n        self.logging_rpc.delete_log(context, [log_obj])\n        log_obj.delete()","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"9eacd2c1f65c9a197228d0d7131c45778b0ee5f3","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    def delete_log(self, context, id):"},{"line_number":125,"context_line":"        LOG.debug(\"delete-log-id: %s\", id)"},{"line_number":126,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":127,"context_line":"            log_obj \u003d log_object.Log(context, id\u003did)"},{"line_number":128,"context_line":"            self.logging_rpc.delete_log("},{"line_number":129,"context_line":"                context, [log_object.Log.get_object(context, id\u003did)])"},{"line_number":130,"context_line":"            log_obj.delete()"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get_loggable_resources(self, context, filters\u003dNone, fields\u003dNone,"},{"line_number":133,"context_line":"                               sorts\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5201f7_71d8a0f0","line":130,"range":{"start_line":127,"start_character":12,"end_line":130,"end_character":28},"in_reply_to":"1a6eadb0_917047a6","updated":"2016-12-30 06:35:29.000000000","message":"Thanks for great suggestion.","commit_id":"00336d74334516a6df7cbae76e57ed31376cb12f"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"f821b7bfcef5338c525703d064df6aff384aa5dd","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        super(LoggingApiPlugin, self).__init__()"},{"line_number":39,"context_line":"        self.logging_rpc \u003d server_rpc.LoggingApiNotification()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":42,"context_line":"    @db_base_plugin_common.convert_result_to_dict"}],"source_content_type":"text/x-python","patch_set":31,"id":"df140735_fea0f4a7","line":39,"range":{"start_line":39,"start_character":13,"end_line":39,"end_character":24},"updated":"2017-05-30 08:43:32.000000000","message":"can you separate rpc stuff from the plugin itself?\neg. as a driver or a callback consumer.","commit_id":"4b3fc429312b0c42c27c264f7e5ba4d4574e8820"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"96fbcc46e56bcd33bc47fd6024cb59c65bc20b8d","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        super(LoggingApiPlugin, self).__init__()"},{"line_number":39,"context_line":"        self.logging_rpc \u003d server_rpc.LoggingApiNotification()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":42,"context_line":"    @db_base_plugin_common.convert_result_to_dict"}],"source_content_type":"text/x-python","patch_set":31,"id":"df140735_0afea736","line":39,"range":{"start_line":39,"start_character":13,"end_line":39,"end_character":24},"in_reply_to":"df140735_fea0f4a7","updated":"2017-05-31 02:51:24.000000000","message":"Thank you for your suggestion! Done.","commit_id":"4b3fc429312b0c42c27c264f7e5ba4d4574e8820"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.objects.logapi import logging_resource as log_object"},{"line_number":23,"context_line":"from neutron.services.logapi.common import exceptions as log_exc"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class LoggingApiPlugin(log_ext.LoggingApiPluginBase):"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_ccd421c0","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":33},"updated":"2017-07-04 03:31:30.000000000","message":"ditto","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.objects.logapi import logging_resource as log_object"},{"line_number":23,"context_line":"from neutron.services.logapi.common import exceptions as log_exc"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class LoggingApiPlugin(log_ext.LoggingApiPluginBase):"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_278f2476","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":33},"in_reply_to":"3f1d235d_ccd421c0","updated":"2017-07-04 10:08:51.000000000","message":"Done","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"d08df3bc7d56c8e19b0e71f0ec899b8685b80660","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    __native_pagination_support \u003d True"},{"line_number":34,"context_line":"    __native_sorting_support \u003d True"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        super(LoggingApiPlugin, self).__init__()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @db_base_plugin_common.filter_fields"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_ea87cc0e","line":36,"updated":"2017-07-03 15:05:19.000000000","message":"this method isn\u0027t needed","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"39fad86c5e53689aa6512037fe156fd647a1c472","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    __native_pagination_support \u003d True"},{"line_number":34,"context_line":"    __native_sorting_support \u003d True"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        super(LoggingApiPlugin, self).__init__()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @db_base_plugin_common.filter_fields"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_a73fbe23","line":36,"in_reply_to":"3f1d235d_ea87cc0e","updated":"2017-07-04 03:09:13.000000000","message":"Done","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":48,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":49,"context_line":"    def get_log(self, context, id, fields\u003dNone):"},{"line_number":50,"context_line":"        log_obj \u003d log_object.Log.get_object(context, id\u003did)"},{"line_number":51,"context_line":"        if not log_obj:"},{"line_number":52,"context_line":"            raise log_exc.LogResourceNotFound(id\u003did)"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_cc49c18b","line":49,"range":{"start_line":49,"start_character":31,"end_line":49,"end_character":33},"updated":"2017-07-04 03:31:30.000000000","message":"\"id\" is built-in function name in python so it\u0027s better not to use.","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":48,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":49,"context_line":"    def get_log(self, context, id, fields\u003dNone):"},{"line_number":50,"context_line":"        log_obj \u003d log_object.Log.get_object(context, id\u003did)"},{"line_number":51,"context_line":"        if not log_obj:"},{"line_number":52,"context_line":"            raise log_exc.LogResourceNotFound(id\u003did)"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_e7ea4c0d","line":49,"range":{"start_line":49,"start_character":31,"end_line":49,"end_character":33},"in_reply_to":"3f1d235d_cc49c18b","updated":"2017-07-04 10:08:51.000000000","message":"Done","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"d08df3bc7d56c8e19b0e71f0ec899b8685b80660","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":56,"context_line":"    def create_log(self, context, log):"},{"line_number":57,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":58,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":59,"context_line":"            tenant_id \u003d log_data.pop(\u0027tenant_id\u0027, None)"},{"line_number":60,"context_line":"            if log_data.get(\u0027project_id\u0027, None):"},{"line_number":61,"context_line":"                log_data[\u0027project_id\u0027] \u003d tenant_id"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_ca7e5018","line":58,"updated":"2017-07-03 15:05:19.000000000","message":"Let\u0027s not use autonested_transactions in these methods. We only need nested support if we expect to call this inside of another transaction and it is expected to fail sometimes.\n\nJust use \u0027with db_api.context_manager.writer.using(context):\u0027","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"39fad86c5e53689aa6512037fe156fd647a1c472","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":56,"context_line":"    def create_log(self, context, log):"},{"line_number":57,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":58,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":59,"context_line":"            tenant_id \u003d log_data.pop(\u0027tenant_id\u0027, None)"},{"line_number":60,"context_line":"            if log_data.get(\u0027project_id\u0027, None):"},{"line_number":61,"context_line":"                log_data[\u0027project_id\u0027] \u003d tenant_id"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_0718b2d0","line":58,"in_reply_to":"3f1d235d_ca7e5018","updated":"2017-07-04 03:09:13.000000000","message":"Thank Kevin for your great teaching. Done.","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def create_log(self, context, log):"},{"line_number":57,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":58,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":59,"context_line":"            tenant_id \u003d log_data.pop(\u0027tenant_id\u0027, None)"},{"line_number":60,"context_line":"            if log_data.get(\u0027project_id\u0027, None):"},{"line_number":61,"context_line":"                log_data[\u0027project_id\u0027] \u003d tenant_id"},{"line_number":62,"context_line":"            log_obj \u003d log_object.Log(context\u003dcontext, **log_data)"},{"line_number":63,"context_line":"            log_obj.create()"},{"line_number":64,"context_line":"        return log_obj"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_675ac64f","line":61,"range":{"start_line":59,"start_character":12,"end_line":61,"end_character":50},"updated":"2017-07-04 03:31:30.000000000","message":"What is this for? If tenant_id is None, log data have no project_id and no tenant_id.","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def create_log(self, context, log):"},{"line_number":57,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":58,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":59,"context_line":"            tenant_id \u003d log_data.pop(\u0027tenant_id\u0027, None)"},{"line_number":60,"context_line":"            if log_data.get(\u0027project_id\u0027, None):"},{"line_number":61,"context_line":"                log_data[\u0027project_id\u0027] \u003d tenant_id"},{"line_number":62,"context_line":"            log_obj \u003d log_object.Log(context\u003dcontext, **log_data)"},{"line_number":63,"context_line":"            log_obj.create()"},{"line_number":64,"context_line":"        return log_obj"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_074f8834","line":61,"range":{"start_line":59,"start_character":12,"end_line":61,"end_character":50},"in_reply_to":"3f1d235d_675ac64f","updated":"2017-07-04 10:08:51.000000000","message":"Thank you for your great reviewing.","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        return log_obj"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":67,"context_line":"    def update_log(self, context, id, log):"},{"line_number":68,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":69,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":70,"context_line":"            log_obj \u003d log_object.Log(context, id\u003did)"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_2c327511","line":67,"range":{"start_line":67,"start_character":34,"end_line":67,"end_character":36},"updated":"2017-07-04 03:31:30.000000000","message":"ditto","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        return log_obj"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":67,"context_line":"    def update_log(self, context, id, log):"},{"line_number":68,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":69,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":70,"context_line":"            log_obj \u003d log_object.Log(context, id\u003did)"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_e7612cab","line":67,"range":{"start_line":67,"start_character":34,"end_line":67,"end_character":36},"in_reply_to":"3f1d235d_2c327511","updated":"2017-07-04 10:08:51.000000000","message":"Done","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            log_obj.update()"},{"line_number":73,"context_line":"        return log_obj"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def delete_log(self, context, id):"},{"line_number":76,"context_line":"        log_obj \u003d log_object.Log.get_object(context, id\u003did)"},{"line_number":77,"context_line":"        if not log_obj:"},{"line_number":78,"context_line":"            raise log_exc.LogResourceNotFound(id\u003did)"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_2c1b9581","line":75,"range":{"start_line":75,"start_character":34,"end_line":75,"end_character":36},"updated":"2017-07-04 03:31:30.000000000","message":"ditto","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            log_obj.update()"},{"line_number":73,"context_line":"        return log_obj"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def delete_log(self, context, id):"},{"line_number":76,"context_line":"        log_obj \u003d log_object.Log.get_object(context, id\u003did)"},{"line_number":77,"context_line":"        if not log_obj:"},{"line_number":78,"context_line":"            raise log_exc.LogResourceNotFound(id\u003did)"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_875cb8ed","line":75,"range":{"start_line":75,"start_character":34,"end_line":75,"end_character":36},"in_reply_to":"3f1d235d_2c1b9581","updated":"2017-07-04 10:08:51.000000000","message":"Done","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2c5c796565049e3b7e55f4950e14e97a577a372d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        log_obj \u003d log_object.Log.get_object(context, id\u003did)"},{"line_number":77,"context_line":"        if not log_obj:"},{"line_number":78,"context_line":"            raise log_exc.LogResourceNotFound(id\u003did)"},{"line_number":79,"context_line":"        log_obj.delete()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def get_loggable_resources(self, context, filters\u003dNone, fields\u003dNone,"},{"line_number":82,"context_line":"                               sorts\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_47034a10","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":24},"updated":"2017-07-04 03:31:30.000000000","message":"I guess that the object might be deleted before delete() call.","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ef98abd9628f8227b8690a08b7fcf61f9ed67e08","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        log_obj \u003d log_object.Log.get_object(context, id\u003did)"},{"line_number":77,"context_line":"        if not log_obj:"},{"line_number":78,"context_line":"            raise log_exc.LogResourceNotFound(id\u003did)"},{"line_number":79,"context_line":"        log_obj.delete()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def get_loggable_resources(self, context, filters\u003dNone, fields\u003dNone,"},{"line_number":82,"context_line":"                               sorts\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f1d235d_4772207d","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":24},"in_reply_to":"3f1d235d_47034a10","updated":"2017-07-04 10:08:51.000000000","message":"Done","commit_id":"8ebfd647d59ccf66a31d255ab4d83d229d45c8ac"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b83e47ef634673c88b114599f5e56a473ad91ea6","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":41,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":42,"context_line":"    def get_log(self, context, id_, fields\u003dNone):"},{"line_number":43,"context_line":"        log_obj \u003d log_object.Log.get_object(context, id\u003did_)"},{"line_number":44,"context_line":"        if not log_obj:"},{"line_number":45,"context_line":"            raise log_exc.LogResourceNotFound(log_id\u003did_)"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_1f91fd4e","line":42,"range":{"start_line":42,"start_character":31,"end_line":42,"end_character":34},"updated":"2017-07-05 00:10:46.000000000","message":"The \"id_\" is still confused a little. There are some examples in service plugins: policy_id, trunk_id, label_id, rule_id, and so on. Why not use \"log_id\"?","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"6bdb1b2a5c088de35f5a99f0a746fe86cf0413e2","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":41,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":42,"context_line":"    def get_log(self, context, id_, fields\u003dNone):"},{"line_number":43,"context_line":"        log_obj \u003d log_object.Log.get_object(context, id\u003did_)"},{"line_number":44,"context_line":"        if not log_obj:"},{"line_number":45,"context_line":"            raise log_exc.LogResourceNotFound(log_id\u003did_)"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_70c37e39","line":42,"range":{"start_line":42,"start_character":31,"end_line":42,"end_character":34},"in_reply_to":"3f1d235d_1f91fd4e","updated":"2017-07-05 03:36:24.000000000","message":"Your opinion is better. Done","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b83e47ef634673c88b114599f5e56a473ad91ea6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    def create_log(self, context, log):"},{"line_number":50,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":51,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":52,"context_line":"            # body \u0027log\u0027 contains both tenant_id and project_id"},{"line_number":53,"context_line":"            # but only latter needs to be used to create Log object."},{"line_number":54,"context_line":"            # We need to remove redundant keyword."},{"line_number":55,"context_line":"            log_data.pop(\u0027tenant_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_ff25215d","line":52,"range":{"start_line":52,"start_character":14,"end_line":52,"end_character":63},"updated":"2017-07-05 00:10:46.000000000","message":"RESOURCE_ATTRIBUTE_MAP of log has no tenant_id attribute but you expect it includes tenant_id, right?","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"6bdb1b2a5c088de35f5a99f0a746fe86cf0413e2","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    def create_log(self, context, log):"},{"line_number":50,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":51,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":52,"context_line":"            # body \u0027log\u0027 contains both tenant_id and project_id"},{"line_number":53,"context_line":"            # but only latter needs to be used to create Log object."},{"line_number":54,"context_line":"            # We need to remove redundant keyword."},{"line_number":55,"context_line":"            log_data.pop(\u0027tenant_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_f0e42ee2","line":52,"range":{"start_line":52,"start_character":14,"end_line":52,"end_character":63},"in_reply_to":"3f1d235d_ff25215d","updated":"2017-07-05 03:36:24.000000000","message":"You\u0027re right.","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b83e47ef634673c88b114599f5e56a473ad91ea6","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            # body \u0027log\u0027 contains both tenant_id and project_id"},{"line_number":53,"context_line":"            # but only latter needs to be used to create Log object."},{"line_number":54,"context_line":"            # We need to remove redundant keyword."},{"line_number":55,"context_line":"            log_data.pop(\u0027tenant_id\u0027, None)"},{"line_number":56,"context_line":"            log_obj \u003d log_object.Log(context\u003dcontext, **log_data)"},{"line_number":57,"context_line":"            log_obj.create()"},{"line_number":58,"context_line":"        return log_obj"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_df114506","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":43},"updated":"2017-07-05 00:10:46.000000000","message":"Do we need to pop tenant_id from log_data if log_data included tenant_id?","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"6bdb1b2a5c088de35f5a99f0a746fe86cf0413e2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            # body \u0027log\u0027 contains both tenant_id and project_id"},{"line_number":53,"context_line":"            # but only latter needs to be used to create Log object."},{"line_number":54,"context_line":"            # We need to remove redundant keyword."},{"line_number":55,"context_line":"            log_data.pop(\u0027tenant_id\u0027, None)"},{"line_number":56,"context_line":"            log_obj \u003d log_object.Log(context\u003dcontext, **log_data)"},{"line_number":57,"context_line":"            log_obj.create()"},{"line_number":58,"context_line":"        return log_obj"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_70749efe","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":43},"in_reply_to":"3f1d235d_df114506","updated":"2017-07-05 03:36:24.000000000","message":"Yes, we do. If we don\u0027t pop tenant_id, then we must be pass explicit parameters to Log object. That is reason I need to pop \u0027tenant_id\u0027 from log_data.","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b83e47ef634673c88b114599f5e56a473ad91ea6","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        return log_obj"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":61,"context_line":"    def update_log(self, context, id_, log):"},{"line_number":62,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":63,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":64,"context_line":"            log_obj \u003d log_object.Log(context, id\u003did_)"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_bf7fa913","line":61,"range":{"start_line":61,"start_character":34,"end_line":61,"end_character":37},"updated":"2017-07-05 00:10:46.000000000","message":"ditto","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"6bdb1b2a5c088de35f5a99f0a746fe86cf0413e2","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        return log_obj"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":61,"context_line":"    def update_log(self, context, id_, log):"},{"line_number":62,"context_line":"        log_data \u003d log[\u0027log\u0027]"},{"line_number":63,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":64,"context_line":"            log_obj \u003d log_object.Log(context, id\u003did_)"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_1069ea1f","line":61,"range":{"start_line":61,"start_character":34,"end_line":61,"end_character":37},"in_reply_to":"3f1d235d_bf7fa913","updated":"2017-07-05 03:36:24.000000000","message":"Done","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b83e47ef634673c88b114599f5e56a473ad91ea6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            log_obj.update()"},{"line_number":67,"context_line":"        return log_obj"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def delete_log(self, context, id_):"},{"line_number":70,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":71,"context_line":"            log_obj \u003d log_object.Log.get_object(context, id\u003did_)"},{"line_number":72,"context_line":"            if log_obj is None:"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_5f72d54a","line":69,"range":{"start_line":69,"start_character":34,"end_line":69,"end_character":37},"updated":"2017-07-05 00:10:46.000000000","message":"ditto","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"6bdb1b2a5c088de35f5a99f0a746fe86cf0413e2","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            log_obj.update()"},{"line_number":67,"context_line":"        return log_obj"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def delete_log(self, context, id_):"},{"line_number":70,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":71,"context_line":"            log_obj \u003d log_object.Log.get_object(context, id\u003did_)"},{"line_number":72,"context_line":"            if log_obj is None:"}],"source_content_type":"text/x-python","patch_set":44,"id":"3f1d235d_f059ce8d","line":69,"range":{"start_line":69,"start_character":34,"end_line":69,"end_character":37},"in_reply_to":"3f1d235d_5f72d54a","updated":"2017-07-05 03:36:24.000000000","message":"Done","commit_id":"db890b62e2d784d62cddb2f445b751ac0b2cb8a7"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"18ef0a0854f43be1d4b6808f1d2e30301fb2b9d4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                               marker\u003dNone, page_reverse\u003dFalse):"},{"line_number":85,"context_line":"        \"\"\"Get supported logging types\"\"\""},{"line_number":86,"context_line":"        return [{\u0027type\u0027: type_}"},{"line_number":87,"context_line":"                for type_ in self.supported_logging_types]"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_0631d8a2","line":87,"range":{"start_line":87,"start_character":29,"end_line":87,"end_character":57},"updated":"2017-07-12 05:04:43.000000000","message":"This variable isn\u0027t defined anywhere.","commit_id":"871b68193948e84acbc0fa203784407ef928adf6"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"83a48113228f14a23f773d9e22224ddbacd297f1","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                               marker\u003dNone, page_reverse\u003dFalse):"},{"line_number":85,"context_line":"        \"\"\"Get supported logging types\"\"\""},{"line_number":86,"context_line":"        return [{\u0027type\u0027: type_}"},{"line_number":87,"context_line":"                for type_ in self.supported_logging_types]"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_8c9d0959","line":87,"range":{"start_line":87,"start_character":29,"end_line":87,"end_character":57},"in_reply_to":"3f1d235d_0166622a","updated":"2017-07-12 06:49:52.000000000","message":"I think it\u0027s better if I define a prototype for this function and return a temporary value at the moment. Do you think so?","commit_id":"871b68193948e84acbc0fa203784407ef928adf6"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"97c0e9d52cb6f321587feb973ac57680fef51b5c","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                               marker\u003dNone, page_reverse\u003dFalse):"},{"line_number":85,"context_line":"        \"\"\"Get supported logging types\"\"\""},{"line_number":86,"context_line":"        return [{\u0027type\u0027: type_}"},{"line_number":87,"context_line":"                for type_ in self.supported_logging_types]"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_0166622a","line":87,"range":{"start_line":87,"start_character":29,"end_line":87,"end_character":57},"in_reply_to":"3f1d235d_0631d8a2","updated":"2017-07-12 06:17:02.000000000","message":"Actually, This function was defined at https://review.openstack.org/#/c/468309/14/neutron/services/logapi/logging_plugin.py@38. Do I need define a prototype for it in this patch-set?","commit_id":"871b68193948e84acbc0fa203784407ef928adf6"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"5af0e7b1b212b702db469d86bcedc7749931fd4e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                               marker\u003dNone, page_reverse\u003dFalse):"},{"line_number":85,"context_line":"        \"\"\"Get supported logging types\"\"\""},{"line_number":86,"context_line":"        return [{\u0027type\u0027: type_}"},{"line_number":87,"context_line":"                for type_ in self.supported_logging_types]"}],"source_content_type":"text/x-python","patch_set":48,"id":"3f1d235d_6c4f4dbd","line":87,"range":{"start_line":87,"start_character":29,"end_line":87,"end_character":57},"in_reply_to":"3f1d235d_8c9d0959","updated":"2017-07-12 06:59:38.000000000","message":"I agree.","commit_id":"871b68193948e84acbc0fa203784407ef928adf6"}],"neutron/tests/unit/services/logapi/test_logging_plugin.py":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"d90516fa3e9dec4fbe6c2197e490886928eb9aad","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.resource \u003d log_object.Log(self.ctxt, **self.resource_data[\u0027log\u0027])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_get_logs(self):"},{"line_number":81,"context_line":"        with mock.patch.object(log_object.Log, \u0027get_objects\u0027)\\"},{"line_number":82,"context_line":"                as get_objects_mock:"},{"line_number":83,"context_line":"            filters \u003d {\u0027filter\u0027: \u0027filter_id\u0027}"},{"line_number":84,"context_line":"            self.log_plugin.get_logs(self.ctxt, filters\u003dfilters)"}],"source_content_type":"text/x-python","patch_set":29,"id":"ff0f0b1f_973a1096","line":81,"range":{"start_line":81,"start_character":61,"end_line":81,"end_character":62},"updated":"2017-05-26 04:06:37.000000000","message":"avoid to use line concatenate, parenthesis is more prefer in PEP8","commit_id":"32260fbe41c4179736adcf19d051289775b64f0b"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"65eaab52f3df38297f911818f6f4c553b647c5c2","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        mock.patch.object(self.ctxt.session, \u0027refresh\u0027).start()"},{"line_number":57,"context_line":"        mock.patch.object(self.ctxt.session, \u0027expunge\u0027).start()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.resource_data \u003d {"},{"line_number":60,"context_line":"            \u0027log\u0027: {"},{"line_number":61,"context_line":"                    \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":62,"context_line":"                    \u0027project_id\u0027: uuidutils.generate_uuid(),"},{"line_number":63,"context_line":"                    \u0027name\u0027: \u0027fake-log\u0027,"},{"line_number":64,"context_line":"                    \u0027resource_type\u0027: \u0027security_group\u0027,"},{"line_number":65,"context_line":"                    \u0027resource_id\u0027: uuidutils.generate_uuid(),"},{"line_number":66,"context_line":"                    \u0027target_id\u0027: uuidutils.generate_uuid(),"},{"line_number":67,"context_line":"                    \u0027event\u0027: tools.get_random_security_event(),"},{"line_number":68,"context_line":"                    \u0027enabled\u0027: True, }}"},{"line_number":69,"context_line":"        self.resource \u003d log_object.Log(self.ctxt, **self.resource_data[\u0027log\u0027])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_get_logs(self):"},{"line_number":72,"context_line":"        with mock.patch.object(log_object.Log, \u0027get_objects\u0027)\\"}],"source_content_type":"text/x-python","patch_set":47,"id":"3f1d235d_463e37c1","line":69,"range":{"start_line":59,"start_character":8,"end_line":69,"end_character":78},"updated":"2017-07-07 04:54:57.000000000","message":"This definition is unnecessary because this test runs all mocks and confirm the mocks only so actual value never be used.\n\nSo this test is mock only and I\u0027m afraid a little. However, I\u0027m OK because log object call is tested by the test[1] (except delete()).\n\nAnyway, I noticed the test misses update test so I pushed a fix[2].\n\n[1]: https://github.com/openstack/neutron/blob/master/neutron/tests/unit/objects/logapi/test_logging_resource.py\n[2]: https://review.openstack.org/#/c/481417/","commit_id":"79dba29673a6cf918f657a189ef8b801affffb9f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"77f672a138660164743554412d9fcf35a8fbb07d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        mock.patch.object(self.ctxt.session, \u0027refresh\u0027).start()"},{"line_number":57,"context_line":"        mock.patch.object(self.ctxt.session, \u0027expunge\u0027).start()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.resource_data \u003d {"},{"line_number":60,"context_line":"            \u0027log\u0027: {"},{"line_number":61,"context_line":"                    \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":62,"context_line":"                    \u0027project_id\u0027: uuidutils.generate_uuid(),"},{"line_number":63,"context_line":"                    \u0027name\u0027: \u0027fake-log\u0027,"},{"line_number":64,"context_line":"                    \u0027resource_type\u0027: \u0027security_group\u0027,"},{"line_number":65,"context_line":"                    \u0027resource_id\u0027: uuidutils.generate_uuid(),"},{"line_number":66,"context_line":"                    \u0027target_id\u0027: uuidutils.generate_uuid(),"},{"line_number":67,"context_line":"                    \u0027event\u0027: tools.get_random_security_event(),"},{"line_number":68,"context_line":"                    \u0027enabled\u0027: True, }}"},{"line_number":69,"context_line":"        self.resource \u003d log_object.Log(self.ctxt, **self.resource_data[\u0027log\u0027])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_get_logs(self):"},{"line_number":72,"context_line":"        with mock.patch.object(log_object.Log, \u0027get_objects\u0027)\\"}],"source_content_type":"text/x-python","patch_set":47,"id":"3f1d235d_2c4be787","line":69,"range":{"start_line":59,"start_character":8,"end_line":69,"end_character":78},"in_reply_to":"3f1d235d_463e37c1","updated":"2017-07-10 04:46:41.000000000","message":"Thanks for your great reviewing. Done.","commit_id":"79dba29673a6cf918f657a189ef8b801affffb9f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"65eaab52f3df38297f911818f6f4c553b647c5c2","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                                                    id\u003dself.resource.id)"},{"line_number":183,"context_line":"            new_log.update_fields.assert_called_once_with(log_data[\u0027log\u0027],"},{"line_number":184,"context_line":"                                                          reset_changes\u003dTrue)"},{"line_number":185,"context_line":"            new_log.update.assert_called()"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def test_update_log_none_enabled(self):"},{"line_number":188,"context_line":"        log_data \u003d {\u0027log\u0027: {}}"}],"source_content_type":"text/x-python","patch_set":47,"id":"3f1d235d_a6306b57","line":185,"range":{"start_line":185,"start_character":12,"end_line":185,"end_character":42},"updated":"2017-07-07 04:54:57.000000000","message":"Why is this different from assertTrue(mock.called) like L172 and other tests? If there is no reason, it\u0027s better to use same implementation for consistency.","commit_id":"79dba29673a6cf918f657a189ef8b801affffb9f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"77f672a138660164743554412d9fcf35a8fbb07d","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                                                    id\u003dself.resource.id)"},{"line_number":183,"context_line":"            new_log.update_fields.assert_called_once_with(log_data[\u0027log\u0027],"},{"line_number":184,"context_line":"                                                          reset_changes\u003dTrue)"},{"line_number":185,"context_line":"            new_log.update.assert_called()"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def test_update_log_none_enabled(self):"},{"line_number":188,"context_line":"        log_data \u003d {\u0027log\u0027: {}}"}],"source_content_type":"text/x-python","patch_set":47,"id":"3f1d235d_4c55031d","line":185,"range":{"start_line":185,"start_character":12,"end_line":185,"end_character":42},"in_reply_to":"3f1d235d_a6306b57","updated":"2017-07-10 04:46:41.000000000","message":"Actually, there is no reason. It should be as your comment. Done.","commit_id":"79dba29673a6cf918f657a189ef8b801affffb9f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"65eaab52f3df38297f911818f6f4c553b647c5c2","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            self.log_plugin.delete_log(self.ctxt, self.resource.id)"},{"line_number":205,"context_line":"            delete_log_mock.assert_called_once_with(self.ctxt,"},{"line_number":206,"context_line":"                                                    id\u003dself.resource.id)"},{"line_number":207,"context_line":"            self.assertTrue(delete_log.delete.called)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def test_delete_nonexistent_log(self):"},{"line_number":210,"context_line":"        delete_log \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":47,"id":"3f1d235d_e1ec0dbc","line":207,"range":{"start_line":207,"start_character":28,"end_line":207,"end_character":52},"updated":"2017-07-07 04:54:57.000000000","message":"As I commented above, I saw object tests and there are get_object(), create(), and update() but delete() isn\u0027t. So I\u0027m not sure that the test can delete Log correctly.","commit_id":"79dba29673a6cf918f657a189ef8b801affffb9f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2cfb8a096b95d7d6970bd9854b3bb97cf29043a0","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            self.log_plugin.delete_log(self.ctxt, self.resource.id)"},{"line_number":205,"context_line":"            delete_log_mock.assert_called_once_with(self.ctxt,"},{"line_number":206,"context_line":"                                                    id\u003dself.resource.id)"},{"line_number":207,"context_line":"            self.assertTrue(delete_log.delete.called)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def test_delete_nonexistent_log(self):"},{"line_number":210,"context_line":"        delete_log \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":47,"id":"3f1d235d_7d7839f7","line":207,"range":{"start_line":207,"start_character":28,"end_line":207,"end_character":52},"in_reply_to":"3f1d235d_972774b7","updated":"2017-07-11 10:59:28.000000000","message":"Never mind. I checked object UT again. My worry was covered by test_base.","commit_id":"79dba29673a6cf918f657a189ef8b801affffb9f"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"32b20fe8940aaa46d6ae6b997a4b901897a648f4","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            self.log_plugin.delete_log(self.ctxt, self.resource.id)"},{"line_number":205,"context_line":"            delete_log_mock.assert_called_once_with(self.ctxt,"},{"line_number":206,"context_line":"                                                    id\u003dself.resource.id)"},{"line_number":207,"context_line":"            self.assertTrue(delete_log.delete.called)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def test_delete_nonexistent_log(self):"},{"line_number":210,"context_line":"        delete_log \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":47,"id":"3f1d235d_972774b7","line":207,"range":{"start_line":207,"start_character":28,"end_line":207,"end_character":52},"in_reply_to":"3f1d235d_e1ec0dbc","updated":"2017-07-11 09:47:07.000000000","message":"Actually, I\u0027m not familiar with unit-test. So I\u0027m not sure that, too. Do you have any better idea to ensure this test run correct?","commit_id":"79dba29673a6cf918f657a189ef8b801affffb9f"}]}
