)]}'
{"neutron/services/logapi/common/exceptions.py":[{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"df6b6b0ec795c4ed36c3a864a9484b4c082acc79","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ResourceConstraintInvalid(n_exc.InvalidInput):"},{"line_number":42,"context_line":"    message \u003d _(\"Resource %(resource_id)s and target resource\""},{"line_number":43,"context_line":"                \"%(target_id)s invalid constraint.\")"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_36217bb1","line":43,"updated":"2017-07-05 07:38:40.000000000","message":"doesn\u0027t make sense as a sentence.","commit_id":"63d6c886c8f6e053ef7cf4d9383c15e835abc5c0"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"aec1c47e0401acdb1e2390c5f17e45f71da6dc2d","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ResourceConstraintInvalid(n_exc.InvalidInput):"},{"line_number":42,"context_line":"    message \u003d _(\"Resource %(resource_id)s and target resource\""},{"line_number":43,"context_line":"                \"%(target_id)s invalid constraint.\")"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_81c8e073","line":43,"in_reply_to":"3f1d235d_36217bb1","updated":"2017-07-06 06:52:03.000000000","message":"Thank you for your great reviewing. Could you please take a look at this again?","commit_id":"63d6c886c8f6e053ef7cf4d9383c15e835abc5c0"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"803ab623c014036184bfc279b1372d6e2d3e4984","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TargetResourceNotFound(n_exc.NotFound):"},{"line_number":35,"context_line":"    message \u003d _(\"Parent resource %(target_id)s could not be found.\")"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceNotFound(n_exc.NotFound):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_a1948a45","line":35,"range":{"start_line":35,"start_character":17,"end_line":35,"end_character":23},"updated":"2017-07-31 10:37:14.000000000","message":"target?","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"99cfa57ffa5b8e1b1daa057d3e805f23bdd72a90","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TargetResourceNotFound(n_exc.NotFound):"},{"line_number":35,"context_line":"    message \u003d _(\"Parent resource %(target_id)s could not be found.\")"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceNotFound(n_exc.NotFound):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_aaee9a85","line":35,"range":{"start_line":35,"start_character":17,"end_line":35,"end_character":23},"in_reply_to":"df3967d1_a1948a45","updated":"2017-07-31 14:44:41.000000000","message":"+1  It should be \u0027Target\u0027","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"719801ecbc533a2c2026e4590e28f0a7ac3685d0","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TargetResourceNotFound(n_exc.NotFound):"},{"line_number":35,"context_line":"    message \u003d _(\"Parent resource %(target_id)s could not be found.\")"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class ResourceNotFound(n_exc.NotFound):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_1dd6fbc4","line":35,"range":{"start_line":35,"start_character":17,"end_line":35,"end_character":23},"in_reply_to":"df3967d1_aaee9a85","updated":"2017-08-01 08:08:27.000000000","message":"Done","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"803ab623c014036184bfc279b1372d6e2d3e4984","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ResourcesConstraintInvalid(n_exc.InvalidInput):"},{"line_number":43,"context_line":"    message \u003d _(\"Invalid resources constraint between resource %(resource_id)s\""},{"line_number":44,"context_line":"                \"and target resource %(target_id)s.\")"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_bc0dd138","line":44,"range":{"start_line":43,"start_character":16,"end_line":44,"end_character":52},"updated":"2017-07-31 10:37:14.000000000","message":"Isn\u0027t it better to contains information on resource type and target resource type as well? If only UUID is returned, it is not easy to difficult to identify the resource.","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"719801ecbc533a2c2026e4590e28f0a7ac3685d0","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ResourcesConstraintInvalid(n_exc.InvalidInput):"},{"line_number":43,"context_line":"    message \u003d _(\"Invalid resources constraint between resource %(resource_id)s\""},{"line_number":44,"context_line":"                \"and target resource %(target_id)s.\")"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_5deda389","line":44,"range":{"start_line":43,"start_character":16,"end_line":44,"end_character":52},"in_reply_to":"df3967d1_bc0dd138","updated":"2017-08-01 08:08:27.000000000","message":"Make sense! Done.","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8c96a9883f7fcc088d1d539d6cf5eb418dbcbdf9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    message \u003d _(\"Resource %(resource_id)s could not be found.\")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ResourcesConstraintInvalid(n_exc.InvalidInput):"},{"line_number":43,"context_line":"    message \u003d _(\"Invalid resources constraint between resource \""},{"line_number":44,"context_line":"                \"{\u0027%(resource_type)s\u0027: %(resource_id)s} and target resource \""},{"line_number":45,"context_line":"                \"{\u0027%(target_resource_type)s\u0027: %(target_id)s}.\")"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_61fac775","line":42,"range":{"start_line":42,"start_character":6,"end_line":42,"end_character":32},"updated":"2017-08-02 18:04:17.000000000","message":"InvalidResourceConstraint?\n\n- Move Invalid first\n- Resources -\u003e Resource (as \u0027resource constraint\u0027 is a noun phrase)","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"b5df758cfa8f0c2f45ab5da3d9f2e7c919444cb5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    message \u003d _(\"Resource %(resource_id)s could not be found.\")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ResourcesConstraintInvalid(n_exc.InvalidInput):"},{"line_number":43,"context_line":"    message \u003d _(\"Invalid resources constraint between resource \""},{"line_number":44,"context_line":"                \"{\u0027%(resource_type)s\u0027: %(resource_id)s} and target resource \""},{"line_number":45,"context_line":"                \"{\u0027%(target_resource_type)s\u0027: %(target_id)s}.\")"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_5591ae46","line":42,"range":{"start_line":42,"start_character":6,"end_line":42,"end_character":32},"in_reply_to":"df3967d1_61fac775","updated":"2017-08-03 06:41:00.000000000","message":"Done","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8c96a9883f7fcc088d1d539d6cf5eb418dbcbdf9","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ResourcesConstraintInvalid(n_exc.InvalidInput):"},{"line_number":43,"context_line":"    message \u003d _(\"Invalid resources constraint between resource \""},{"line_number":44,"context_line":"                \"{\u0027%(resource_type)s\u0027: %(resource_id)s} and target resource \""},{"line_number":45,"context_line":"                \"{\u0027%(target_resource_type)s\u0027: %(target_id)s}.\")"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_c1a4d3bb","line":44,"range":{"start_line":44,"start_character":37,"end_line":44,"end_character":38},"updated":"2017-08-02 18:04:17.000000000","message":"Colons and {} is unnecessary.\n\nThe current message will be rendered like:\n\n  Invalid resources constraint between resource {\u0027security group\u0027: UUID}\n  and target resource {\u0027port\u0027: UUID}.\n\nI think \"resource (security group UUID)\" and \"target resource (port UUID)\" are enough.","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"b5df758cfa8f0c2f45ab5da3d9f2e7c919444cb5","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ResourcesConstraintInvalid(n_exc.InvalidInput):"},{"line_number":43,"context_line":"    message \u003d _(\"Invalid resources constraint between resource \""},{"line_number":44,"context_line":"                \"{\u0027%(resource_type)s\u0027: %(resource_id)s} and target resource \""},{"line_number":45,"context_line":"                \"{\u0027%(target_resource_type)s\u0027: %(target_id)s}.\")"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_75a712a9","line":44,"range":{"start_line":44,"start_character":37,"end_line":44,"end_character":38},"in_reply_to":"df3967d1_c1a4d3bb","updated":"2017-08-03 06:41:00.000000000","message":"Done","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"}],"neutron/services/logapi/common/validators.py":[{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"db2339e1763941f1f4b0737675d1d969cac649c8","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_3793445f","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":19},"updated":"2017-05-26 04:21:56.000000000","message":"I think following case should be considered:\n\n* resource_id is None and target_id is None\n\nIn this case, it should be raised.  Either \u0027resource_id\u0027 or \u0027port_id\u0027 should be specified.","commit_id":"073297a56d74afc0714dbfd2a80e1764a3ac85eb"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"159af450b19c484e3f6e91b8b0d76228f196bff3","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_cad66a28","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":19},"in_reply_to":"df140735_0a8d827a","updated":"2017-05-31 07:38:40.000000000","message":"\u003e What\u0027s happen if resource_id and target_id are None?\n\nThat mean logging api will collect all events(DROP or ACCEPT or both) related to all sg of the project in which log resource is created.","commit_id":"073297a56d74afc0714dbfd2a80e1764a3ac85eb"},{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"73f82a5aff72c3700c334c92b5913adc1beb24fe","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_30d6b0c5","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":19},"in_reply_to":"df140735_cad66a28","updated":"2017-06-07 06:01:43.000000000","message":"OK, let\u0027s wait others opinion.  But I thinks if we support this, it may much more comlicate.  E.g. We should monitor SG event(newly created or updated...)","commit_id":"073297a56d74afc0714dbfd2a80e1764a3ac85eb"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"cab4c5b26ff57f25ad103f1d87ea0f0be80b6160","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_0a8d827a","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":19},"in_reply_to":"df140735_f6291e9b","updated":"2017-05-31 07:30:58.000000000","message":"I agree with you on performance perspective. However,IMO A use case: get all events(DROP or ACCEPT or both) related to all security groups of a project may useful for operator. So Shall we wait some point of view from others reviewers? After that, I\u0027ll consider to change these logic code if necessary.","commit_id":"073297a56d74afc0714dbfd2a80e1764a3ac85eb"},{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"00fbf2cef15de2c10ffccae1a186ee4430cfc3b4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_f6291e9b","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":19},"in_reply_to":"ff0f0b1f_3787c4b9","updated":"2017-05-31 07:18:49.000000000","message":"Maybe you are confusing something.  What\u0027s happen if resource_id and target_id are None?  It looks return None.\nIt should be guarded both parameter are nothing for performance perspective.","commit_id":"073297a56d74afc0714dbfd2a80e1764a3ac85eb"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"ba276021b090df692d0e68b7f1e151e4871e5852","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_3787c4b9","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":19},"in_reply_to":"ff0f0b1f_3793445f","updated":"2017-05-26 04:43:41.000000000","message":"Actually, the api allow to collect all event(DROP or ACCEPT or both) related to security groups of a project. That make sense to you?","commit_id":"073297a56d74afc0714dbfd2a80e1764a3ac85eb"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"75a635358bc2b4516116b5bbee95fa618e23f893","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            .filter_by(security_group_id\u003dsg_id, port_id\u003dport_id).one()"},{"line_number":40,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":41,"context_line":"        raise log_exc.ResourcesConstraintInvalid(resource_id\u003dsg_id,"},{"line_number":42,"context_line":"                                                target_id\u003dport_id)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def _check_secgroup_exist(context, sg_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_6c281896","line":42,"updated":"2017-07-06 08:47:14.000000000","message":"nit - alignment","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"d0072ce1737a19b69c3cf8d02b9e0289f1e6752b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            .filter_by(security_group_id\u003dsg_id, port_id\u003dport_id).one()"},{"line_number":40,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":41,"context_line":"        raise log_exc.ResourcesConstraintInvalid(resource_id\u003dsg_id,"},{"line_number":42,"context_line":"                                                target_id\u003dport_id)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def _check_secgroup_exist(context, sg_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_d71a8c15","line":42,"in_reply_to":"3f1d235d_6c281896","updated":"2017-07-11 09:49:41.000000000","message":"Done","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"75a635358bc2b4516116b5bbee95fa618e23f893","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                                                target_id\u003dport_id)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def _check_secgroup_exist(context, sg_id):"},{"line_number":46,"context_line":"    sg_obj \u003d sg_object.SecurityGroup.get_object(context, id\u003dsg_id)"},{"line_number":47,"context_line":"    if not sg_obj:"},{"line_number":48,"context_line":"        raise log_exc.ResourceNotFound(resource_id\u003dsg_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_0c13e467","line":45,"range":{"start_line":45,"start_character":20,"end_line":45,"end_character":25},"updated":"2017-07-06 08:47:14.000000000","message":"consider exist\u003d\u003eexists","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"d0072ce1737a19b69c3cf8d02b9e0289f1e6752b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                                                target_id\u003dport_id)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def _check_secgroup_exist(context, sg_id):"},{"line_number":46,"context_line":"    sg_obj \u003d sg_object.SecurityGroup.get_object(context, id\u003dsg_id)"},{"line_number":47,"context_line":"    if not sg_obj:"},{"line_number":48,"context_line":"        raise log_exc.ResourceNotFound(resource_id\u003dsg_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_97d2d433","line":45,"range":{"start_line":45,"start_character":20,"end_line":45,"end_character":25},"in_reply_to":"3f1d235d_0c13e467","updated":"2017-07-11 09:49:41.000000000","message":"Done","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"75a635358bc2b4516116b5bbee95fa618e23f893","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        raise log_exc.ResourceNotFound(resource_id\u003dsg_id)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def _check_port_exist(context, port_id):"},{"line_number":52,"context_line":"    port \u003d ports.Port.get_object(context, id\u003dport_id)"},{"line_number":53,"context_line":"    if not port:"},{"line_number":54,"context_line":"        raise log_exc.TargetResourceNotFound(target_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_ec15484a","line":51,"range":{"start_line":51,"start_character":16,"end_line":51,"end_character":21},"updated":"2017-07-06 08:47:14.000000000","message":"ditto","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"d0072ce1737a19b69c3cf8d02b9e0289f1e6752b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        raise log_exc.ResourceNotFound(resource_id\u003dsg_id)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def _check_port_exist(context, port_id):"},{"line_number":52,"context_line":"    port \u003d ports.Port.get_object(context, id\u003dport_id)"},{"line_number":53,"context_line":"    if not port:"},{"line_number":54,"context_line":"        raise log_exc.TargetResourceNotFound(target_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_77d5f81a","line":51,"range":{"start_line":51,"start_character":16,"end_line":51,"end_character":21},"in_reply_to":"3f1d235d_ec15484a","updated":"2017-07-11 09:49:41.000000000","message":"Done","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"75a635358bc2b4516116b5bbee95fa618e23f893","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    if resource_id:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_070bbd23","line":98,"range":{"start_line":98,"start_character":44,"end_line":98,"end_character":50},"updated":"2017-07-06 08:47:14.000000000","message":"by default get returns None","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"d0072ce1737a19b69c3cf8d02b9e0289f1e6752b","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    if resource_id:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_57dc3c45","line":98,"range":{"start_line":98,"start_character":44,"end_line":98,"end_character":50},"in_reply_to":"3f1d235d_070bbd23","updated":"2017-07-11 09:49:41.000000000","message":"Done","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"75a635358bc2b4516116b5bbee95fa618e23f893","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    if resource_id:"},{"line_number":102,"context_line":"        _check_secgroup_exist(context, resource_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_672b9182","line":99,"range":{"start_line":99,"start_character":40,"end_line":99,"end_character":46},"updated":"2017-07-06 08:47:14.000000000","message":"ditto","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"d0072ce1737a19b69c3cf8d02b9e0289f1e6752b","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027, None)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027, None)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    if resource_id:"},{"line_number":102,"context_line":"        _check_secgroup_exist(context, resource_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_37df803b","line":99,"range":{"start_line":99,"start_character":40,"end_line":99,"end_character":46},"in_reply_to":"3f1d235d_672b9182","updated":"2017-07-11 09:49:41.000000000","message":"Done","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"75a635358bc2b4516116b5bbee95fa618e23f893","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exist(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _check_port_exist(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027, None)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_272119a0","line":105,"range":{"start_line":105,"start_character":52,"end_line":105,"end_character":58},"updated":"2017-07-06 08:47:14.000000000","message":"ditto","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"d0072ce1737a19b69c3cf8d02b9e0289f1e6752b","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exist(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _check_port_exist(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027, None)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_17e6c417","line":105,"range":{"start_line":105,"start_character":52,"end_line":105,"end_character":58},"in_reply_to":"3f1d235d_272119a0","updated":"2017-07-11 09:49:41.000000000","message":"Done","commit_id":"6630db8cc8c60011b8484482d83d14f61f5d1284"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"32cf18d9a6a8c099d8b91f14d05cf3e3fca3ba8c","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def _check_port_exists(context, port_id):"},{"line_number":52,"context_line":"    port \u003d ports.Port.get_object(context, id\u003dport_id)"},{"line_number":53,"context_line":"    if not port:"},{"line_number":54,"context_line":"        raise log_exc.TargetResourceNotFound(target_id\u003dport_id)"},{"line_number":55,"context_line":"    return port"}],"source_content_type":"text/x-python","patch_set":18,"id":"1f1a1f67_8ac9e826","line":52,"updated":"2017-07-19 21:01:21.000000000","message":"please use the count methods of the objects api for these methods where you are just checking for existence. it\u0027s much less expensive","commit_id":"04bf1e1cfc23beb0f872d30327957293fce250c1"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"97d866eb434c567a8077a71ba0d71b2f30d8b0ab","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def _check_port_exists(context, port_id):"},{"line_number":52,"context_line":"    port \u003d ports.Port.get_object(context, id\u003dport_id)"},{"line_number":53,"context_line":"    if not port:"},{"line_number":54,"context_line":"        raise log_exc.TargetResourceNotFound(target_id\u003dport_id)"},{"line_number":55,"context_line":"    return port"}],"source_content_type":"text/x-python","patch_set":18,"id":"ff346bd7_f10946dd","line":52,"in_reply_to":"1f1a1f67_8ac9e826","updated":"2017-07-24 08:09:49.000000000","message":"Actually, this function not only to check a port exists but also return a port object if it\u0027s exist. Because this port object will be passed to validate_log_type_for_port function [1] for checking supported logging types. So I\u0027d like to change it to _get_port. Do you think so? In addition, I\u0027d like to use the count method in check_secgroup_exists function. Thank you for your teaching :)\n\n[1] https://review.openstack.org/#/c/467976/18/neutron/services/logapi/common/validators.py@106","commit_id":"04bf1e1cfc23beb0f872d30327957293fce250c1"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"cf30dba91e9358144cffce4ed6a9bcf44d3e7549","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_8885a45c","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"updated":"2017-07-27 11:06:18.000000000","message":"i guess resource_type should be checked first\nbecause the meaning of the ids are type specific.","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"9a0972593b09a9bcef774adafd5cc62849cb3497","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f436f4f_d879e12f","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"in_reply_to":"9f436f4f_3827cd67","updated":"2017-08-08 03:48:15.000000000","message":"Basically, \u0027resource_type\u0027 is validated at [1] first. So do we no need to check supported types again?\n\n[1] https://review.openstack.org/#/c/467976/20/neutron/services/logapi/logging_plugin.py@73","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"87e3e21b6c3de29f508454c282d5bb7f38616a00","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f436f4f_58661154","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"in_reply_to":"9f436f4f_38e6adea","updated":"2017-08-08 04:07:02.000000000","message":"yes.\n\nmy assumption is that you wanted to avoid assuming security group is the only type.","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"39a8bacda07bcf65244eba37d374b00c176a7b6f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f436f4f_b43f2ad5","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"in_reply_to":"9f436f4f_58661154","updated":"2017-08-09 02:55:53.000000000","message":"Done","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"a00a5a76d68f36536956e72e148c7da1a0e23ae6","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f436f4f_38e6adea","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"in_reply_to":"9f436f4f_d879e12f","updated":"2017-08-08 03:53:39.000000000","message":"sorry, maybe I miss understood your comment. You mean that, this function need to check resource_type is security_group first, then call to _check_secgroup_exists, is it right?","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"62ab740db0ea442c5cf7030d6ef01fa054c34f21","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_c0a5aaa3","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"in_reply_to":"ff346bd7_3e8032bf","updated":"2017-07-27 22:39:11.000000000","message":"this method is intended to be used for other resource types, right?","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ab35559a78298ab18bf67c098d2326f0c759e032","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f436f4f_3827cd67","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"in_reply_to":"ff346bd7_69a6e9ad","updated":"2017-08-08 03:40:07.000000000","message":"i don\u0027t understand.\nthe caller just ensures the given resource type is one of supported types. this method is expected to confirm it\u0027s security_group, before doing thing specific to security groups, like _check_secgroup_exists.","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"34876293f1bb539d8ce547ec47691b87eeb965f6","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_3e8032bf","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"in_reply_to":"ff346bd7_8885a45c","updated":"2017-07-27 12:41:17.000000000","message":"Yes, you\u0027re right. We\u0027ve already checked resource_type first at [1]. If \u0027target_id\u0027(e.g port_id) is specified in a request, we should check \u0027resource_type\u0027 is supported by log_drivers on the target_id or not? That\u0027s my idea. What do you think?\n\nhttps://review.openstack.org/#/c/467976/20/neutron/services/logapi/logging_plugin.py@73","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"509a05e41cc9ae8d817dc58d0b09da94a3f77b17","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"},{"line_number":108,"context_line":"                                                  port_id\u003dport.id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_69a6e9ad","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":21},"in_reply_to":"ff346bd7_c0a5aaa3","updated":"2017-07-28 02:25:05.000000000","message":"Actually, this method isn\u0027t intended to be used for other resource_types. Because \u0027resource_type\u0027 must be specified in a request, \u0027target_id\u0027 is a optional. Take a example for more clearly: assuming we create a log_object as below:\n\n{\u0027log\u0027: {\u0027name\u0027: \u0027test\u0027, \u0027resource_type\u0027: \u0027security_group\u0027, \u0027target_id\u0027: port_id_xxx}}.\n1) logging plugin will check resource_type\u003dsecurity_group is supported by at least one log_driver or not?\n2) if at least one log_driver (e.g OVSFirewallLoggingDriver) supported \u0027security_group\u0027, logging plugin will check target_id\u003dport_id_xxx is supported by a log_driver or not? That mean, if a port is landed in compute node (which has ML2 driver is LB), where is resource_type\u003dsecurity_group is not supported, Then request should be not completed. Does that make sense to you?","commit_id":"f6b3f5e669a7a643d41c8dadb946f840e4151bd9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"803ab623c014036184bfc279b1372d6e2d3e4984","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            return True"},{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_fc3239a7","line":96,"updated":"2017-07-31 10:37:14.000000000","message":"For public methods (this and above), it is better to have a docstring which describe the behavior (what is returned? what exception is raised when?)\n\nThe reason I felt this is some validator raises an exception when an error is detected and some returns False for a same case.","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"719801ecbc533a2c2026e4590e28f0a7ac3685d0","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            return True"},{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_3d89bfc9","line":96,"in_reply_to":"df3967d1_fc3239a7","updated":"2017-08-01 08:08:27.000000000","message":"Done","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"99cfa57ffa5b8e1b1daa057d3e805f23bdd72a90","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_aa3fbad4","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":20},"updated":"2017-07-31 14:44:41.000000000","message":"It should be valiadted neither resoure_id nor target_id case.                                                                 (I said in previous patchset)","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"719801ecbc533a2c2026e4590e28f0a7ac3685d0","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_d84f6132","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":20},"in_reply_to":"df3967d1_aa3fbad4","updated":"2017-08-01 08:08:27.000000000","message":"Is there any reason for a validating neither resource_id nor target_id except performance perspective? I\u0027ve already handled all use case as i mentioned at previous patch-set[1], \nthe model is not complicate. Why don\u0027t we keep this implementation?\n\n[1] https://review.openstack.org/#/c/467976/2/neutron/services/logapi/common/validators.py@97","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"40ce270402fce0c40a425913934e63745e03ad36","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return False"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def validate_request(context, log_data):"},{"line_number":98,"context_line":"    resource_id \u003d log_data.get(\u0027resource_id\u0027)"},{"line_number":99,"context_line":"    target_id \u003d log_data.get(\u0027target_id\u0027)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_de594435","line":97,"range":{"start_line":97,"start_character":4,"end_line":97,"end_character":20},"in_reply_to":"df3967d1_d84f6132","updated":"2017-08-03 00:45:34.000000000","message":"+1","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"803ab623c014036184bfc279b1372d6e2d3e4984","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    if resource_id:"},{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_9cf8cdc4","line":104,"range":{"start_line":104,"start_character":15,"end_line":104,"end_character":24},"updated":"2017-07-31 10:37:14.000000000","message":"_get_port can raise an exception. Do you want to raise an exception from _get_port to an caller or catch it here?","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"719801ecbc533a2c2026e4590e28f0a7ac3685d0","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    if resource_id:"},{"line_number":102,"context_line":"        _check_secgroup_exists(context, resource_id)"},{"line_number":103,"context_line":"    if target_id:"},{"line_number":104,"context_line":"        port \u003d _get_port(context, target_id)"},{"line_number":105,"context_line":"        resource_type \u003d log_data.get(\u0027resource_type\u0027)"},{"line_number":106,"context_line":"        if not validate_log_type_for_port(resource_type, port):"},{"line_number":107,"context_line":"            raise log_exc.LoggingTypeNotSupported(log_type\u003dresource_type,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_1d727be4","line":104,"range":{"start_line":104,"start_character":15,"end_line":104,"end_character":24},"in_reply_to":"df3967d1_9cf8cdc4","updated":"2017-08-01 08:08:27.000000000","message":"You\u0027re right! An exception will be raised at _get_port as https://review.openstack.org/#/c/467976/23/neutron/services/logapi/common/validators.py@54","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d86008d0f280d0710a5f25f0e791b2dda2463cf4","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"SKIPPED_VIF_TYPES \u003d ["},{"line_number":31,"context_line":"    portbindings.VIF_TYPE_UNBOUND,"},{"line_number":32,"context_line":"    portbindings.VIF_TYPE_BINDING_FAILED"},{"line_number":33,"context_line":"]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"bf3e73b7_5caf1394","line":32,"updated":"2017-08-07 04:56:07.000000000","message":"you could add a , here so that future additions would not have a two line change","commit_id":"f762596db649e1f308b1a2c4ed1a7621aec01fd6"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"f71331153b9c27f046536b6e4fa00a0598bfe742","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"SKIPPED_VIF_TYPES \u003d ["},{"line_number":31,"context_line":"    portbindings.VIF_TYPE_UNBOUND,"},{"line_number":32,"context_line":"    portbindings.VIF_TYPE_BINDING_FAILED"},{"line_number":33,"context_line":"]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"bf3e73b7_89741c9b","line":32,"in_reply_to":"bf3e73b7_5caf1394","updated":"2017-08-07 06:39:07.000000000","message":"Thank Gary. Done.","commit_id":"f762596db649e1f308b1a2c4ed1a7621aec01fd6"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"8eeb42e2de7037ac2179d99575a932799162b14b","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    log_plugin \u003d directory.get_plugin(alias\u003dconstants.LOG_API)"},{"line_number":94,"context_line":"    drivers \u003d log_plugin.driver_manager.drivers"},{"line_number":95,"context_line":"    for driver in drivers:"},{"line_number":96,"context_line":"        vif_type \u003d port.binding.vif_type"},{"line_number":97,"context_line":"        if vif_type not in SKIPPED_VIF_TYPES:"},{"line_number":98,"context_line":"            if not _validate_vif_type(driver, vif_type, port[\u0027id\u0027]):"},{"line_number":99,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":28,"id":"9f436f4f_989a396c","line":96,"range":{"start_line":96,"start_character":24,"end_line":96,"end_character":31},"updated":"2017-08-08 04:08:01.000000000","message":"this assumes ml2? (just a question)","commit_id":"c4a4e85254364538a5eeeebd3ff2d9d9a21c13fb"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"8c8e5d11a590ddbb12cb0b92c79e35079377b03d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    log_plugin \u003d directory.get_plugin(alias\u003dconstants.LOG_API)"},{"line_number":94,"context_line":"    drivers \u003d log_plugin.driver_manager.drivers"},{"line_number":95,"context_line":"    for driver in drivers:"},{"line_number":96,"context_line":"        vif_type \u003d port.binding.vif_type"},{"line_number":97,"context_line":"        if vif_type not in SKIPPED_VIF_TYPES:"},{"line_number":98,"context_line":"            if not _validate_vif_type(driver, vif_type, port[\u0027id\u0027]):"},{"line_number":99,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":28,"id":"9f436f4f_e93cd9c0","line":96,"range":{"start_line":96,"start_character":24,"end_line":96,"end_character":31},"in_reply_to":"9f436f4f_989a396c","updated":"2017-08-08 06:44:48.000000000","message":"Yes, It is.","commit_id":"c4a4e85254364538a5eeeebd3ff2d9d9a21c13fb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"51d14adb2ac7afbf5eed79c1c24cb0225b98597d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    return False"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def validate_log_type_for_port(log_type, port):"},{"line_number":84,"context_line":"    \"\"\"Validate a specific logging type on a specific port"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    This method checks whether or not existing a log_driver which supports for"}],"source_content_type":"text/x-python","patch_set":29,"id":"9f436f4f_6091fc99","line":83,"range":{"start_line":83,"start_character":4,"end_line":83,"end_character":30},"updated":"2017-08-09 05:32:39.000000000","message":"The validator method below raises an exception when a validation error is detected. On the other hand, this method returns True/False. It looks like this method just checks whether log type for a port is supported or not.\n\nIt looks better to change the func name to check_xxxx or something.\n\nIt is not a blocking issue but when we looks at the code later it might be confusing.","commit_id":"68477904140d7c4a1947f435c7f3ac5767c7e517"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"b8f34b03f95a170615e9a747d8d7824780908879","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    return False"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def validate_log_type_for_port(log_type, port):"},{"line_number":84,"context_line":"    \"\"\"Validate a specific logging type on a specific port"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    This method checks whether or not existing a log_driver which supports for"}],"source_content_type":"text/x-python","patch_set":29,"id":"9f436f4f_43215dfb","line":83,"range":{"start_line":83,"start_character":4,"end_line":83,"end_character":30},"in_reply_to":"9f436f4f_6091fc99","updated":"2017-08-09 09:48:27.000000000","message":"Got it. I will put a follow-up change to correct name of this function later. Thanks.","commit_id":"68477904140d7c4a1947f435c7f3ac5767c7e517"}],"neutron/services/logapi/logging_plugin.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"803ab623c014036184bfc279b1372d6e2d3e4984","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @property"},{"line_number":39,"context_line":"    def logging_drivers(self):"},{"line_number":40,"context_line":"        return self.driver_manager.drivers"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @property"},{"line_number":43,"context_line":"    def supported_logging_types(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_9c732d81","line":40,"updated":"2017-07-31 10:37:14.000000000","message":"why is this related to this change?","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"719801ecbc533a2c2026e4590e28f0a7ac3685d0","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @property"},{"line_number":39,"context_line":"    def logging_drivers(self):"},{"line_number":40,"context_line":"        return self.driver_manager.drivers"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @property"},{"line_number":43,"context_line":"    def supported_logging_types(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df3967d1_d83081eb","line":40,"in_reply_to":"df3967d1_9c732d81","updated":"2017-08-01 08:08:27.000000000","message":"Actually. It is used for validate_log_type_for_port method https://review.openstack.org/#/c/467976/23/neutron/services/logapi/common/validators.py@81","commit_id":"3148222cf18248588d8617e0ae7d15462cbc5006"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8c96a9883f7fcc088d1d539d6cf5eb418dbcbdf9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(LoggingPlugin, self).__init__()"},{"line_number":36,"context_line":"        self.driver_manager \u003d driver_mgr.LoggingServiceDriverManager()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @property"},{"line_number":39,"context_line":"    def logging_drivers(self):"},{"line_number":40,"context_line":"        return self.driver_manager.drivers"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @property"},{"line_number":43,"context_line":"    def supported_logging_types(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_61b2c796","line":40,"range":{"start_line":38,"start_character":3,"end_line":40,"end_character":42},"updated":"2017-08-02 18:04:17.000000000","message":"Why do you need to add this in this patch? This patch adds validators, so I am not sure how this is related.","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"b5df758cfa8f0c2f45ab5da3d9f2e7c919444cb5","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(LoggingPlugin, self).__init__()"},{"line_number":36,"context_line":"        self.driver_manager \u003d driver_mgr.LoggingServiceDriverManager()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @property"},{"line_number":39,"context_line":"    def logging_drivers(self):"},{"line_number":40,"context_line":"        return self.driver_manager.drivers"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @property"},{"line_number":43,"context_line":"    def supported_logging_types(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_f5b422d3","line":40,"range":{"start_line":38,"start_character":3,"end_line":40,"end_character":42},"in_reply_to":"df3967d1_61b2c796","updated":"2017-08-03 06:41:00.000000000","message":"It should be removed. Done.","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d86008d0f280d0710a5f25f0e791b2dda2463cf4","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            raise log_exc.InvalidLogResourceType("},{"line_number":71,"context_line":"                resource_type\u003dresource_type)"},{"line_number":72,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":73,"context_line":"            validators.validate_request(context, log_data)"},{"line_number":74,"context_line":"            # body \u0027log\u0027 contains both tenant_id and project_id"},{"line_number":75,"context_line":"            # but only latter needs to be used to create Log object."},{"line_number":76,"context_line":"            # We need to remove redundant keyword."}],"source_content_type":"text/x-python","patch_set":27,"id":"bf3e73b7_fc9da766","line":73,"updated":"2017-08-07 04:56:07.000000000","message":"why does this need to be in the DB transaction?","commit_id":"f762596db649e1f308b1a2c4ed1a7621aec01fd6"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"f71331153b9c27f046536b6e4fa00a0598bfe742","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            raise log_exc.InvalidLogResourceType("},{"line_number":71,"context_line":"                resource_type\u003dresource_type)"},{"line_number":72,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":73,"context_line":"            validators.validate_request(context, log_data)"},{"line_number":74,"context_line":"            # body \u0027log\u0027 contains both tenant_id and project_id"},{"line_number":75,"context_line":"            # but only latter needs to be used to create Log object."},{"line_number":76,"context_line":"            # We need to remove redundant keyword."}],"source_content_type":"text/x-python","patch_set":27,"id":"bf3e73b7_69ae98e8","line":73,"in_reply_to":"bf3e73b7_fc9da766","updated":"2017-08-07 06:39:07.000000000","message":"Done.","commit_id":"f762596db649e1f308b1a2c4ed1a7621aec01fd6"}],"neutron/tests/unit/services/logapi/common/test_validators.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8c96a9883f7fcc088d1d539d6cf5eb418dbcbdf9","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            self.assertRaises(log_exc.TargetResourceNotFound,"},{"line_number":55,"context_line":"                              validators._get_port,"},{"line_number":56,"context_line":"                              mock.ANY,"},{"line_number":57,"context_line":"                              mock.ANY)"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_c1ca9318","line":57,"updated":"2017-08-02 18:04:17.000000000","message":"Test cases look not enough. There are several functions uncovered. The public functions need to be covered.","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"b5df758cfa8f0c2f45ab5da3d9f2e7c919444cb5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            self.assertRaises(log_exc.TargetResourceNotFound,"},{"line_number":55,"context_line":"                              validators._get_port,"},{"line_number":56,"context_line":"                              mock.ANY,"},{"line_number":57,"context_line":"                              mock.ANY)"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_75c0322b","line":57,"in_reply_to":"df3967d1_c1ca9318","updated":"2017-08-03 06:41:00.000000000","message":"Done","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"8eeb42e2de7037ac2179d99575a932799162b14b","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            def __init__(self):"},{"line_number":128,"context_line":"                self.driver_manager \u003d driver_manager"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        with mock.patch(\u0027neutron_lib.plugins.directory.get_plugin\u0027,"},{"line_number":131,"context_line":"                        return_value\u003dFakeLoggingPlugin()):"},{"line_number":132,"context_line":"            self.assertEqual("},{"line_number":133,"context_line":"                expected_result,"},{"line_number":134,"context_line":"                validators.validate_log_type_for_port(\u0027security_group\u0027, port))"}],"source_content_type":"text/x-python","patch_set":28,"id":"9f436f4f_7805557a","line":131,"range":{"start_line":130,"start_character":0,"end_line":131,"end_character":58},"updated":"2017-08-08 04:08:01.000000000","message":"with PluginDirectoryFixture, i guess you just use add_plugin.","commit_id":"c4a4e85254364538a5eeeebd3ff2d9d9a21c13fb"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"8c8e5d11a590ddbb12cb0b92c79e35079377b03d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            def __init__(self):"},{"line_number":128,"context_line":"                self.driver_manager \u003d driver_manager"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        with mock.patch(\u0027neutron_lib.plugins.directory.get_plugin\u0027,"},{"line_number":131,"context_line":"                        return_value\u003dFakeLoggingPlugin()):"},{"line_number":132,"context_line":"            self.assertEqual("},{"line_number":133,"context_line":"                expected_result,"},{"line_number":134,"context_line":"                validators.validate_log_type_for_port(\u0027security_group\u0027, port))"}],"source_content_type":"text/x-python","patch_set":28,"id":"9f436f4f_292661b9","line":131,"range":{"start_line":130,"start_character":0,"end_line":131,"end_character":58},"in_reply_to":"9f436f4f_7805557a","updated":"2017-08-08 06:44:48.000000000","message":"Done","commit_id":"c4a4e85254364538a5eeeebd3ff2d9d9a21c13fb"}],"neutron/tests/unit/services/logapi/drivers/test_manager.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8c96a9883f7fcc088d1d539d6cf5eb418dbcbdf9","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                    \u0027security_group\u0027)"},{"line_number":117,"context_line":"            else:"},{"line_number":118,"context_line":"                is_log_type_supported_mock.assert_not_called()"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_validate_log_type_for_port_vif_type_supported(self):"},{"line_number":121,"context_line":"        port \u003d self._get_port("},{"line_number":122,"context_line":"            portbindings.VIF_TYPE_OVS, portbindings.VNIC_NORMAL)"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_c198531c","line":119,"updated":"2017-08-02 18:04:17.000000000","message":"Most tests here looks like tests for the validators. Can you move them to test_validators.py?","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"b5df758cfa8f0c2f45ab5da3d9f2e7c919444cb5","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                    \u0027security_group\u0027)"},{"line_number":117,"context_line":"            else:"},{"line_number":118,"context_line":"                is_log_type_supported_mock.assert_not_called()"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_validate_log_type_for_port_vif_type_supported(self):"},{"line_number":121,"context_line":"        port \u003d self._get_port("},{"line_number":122,"context_line":"            portbindings.VIF_TYPE_OVS, portbindings.VNIC_NORMAL)"}],"source_content_type":"text/x-python","patch_set":25,"id":"df3967d1_552d2efc","line":119,"in_reply_to":"df3967d1_c198531c","updated":"2017-08-03 06:41:00.000000000","message":"Done","commit_id":"015c6a45dc3628edc659e141a8bc7adc1a5284ba"}],"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":"93348807188e444e1505a11347acf525cb6b1d2d","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                       \u0027enabled\u0027: True}}"},{"line_number":237,"context_line":"        self.assertRaises("},{"line_number":238,"context_line":"            log_exc.InvalidLogReosurceType,"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            self.log_plugin.create_log,"},{"line_number":241,"context_line":"            self.ctxt,"},{"line_number":242,"context_line":"            log)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0f0b1f_37ad84ea","line":239,"updated":"2017-05-26 04:01:13.000000000","message":"newline for what?","commit_id":"073297a56d74afc0714dbfd2a80e1764a3ac85eb"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"de21c7bd57698764b2e8cd83abc04624cef6c50a","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                                return_value\u003dTrue):"},{"line_number":106,"context_line":"                    with mock.patch(\u0027neutron.objects.logapi.\u0027"},{"line_number":107,"context_line":"                                    \u0027logging_resource.Log\u0027,"},{"line_number":108,"context_line":"                                    return_value\u003dnew_log) as init_log_mock:"},{"line_number":109,"context_line":"                        self.log_plugin.create_log(self.ctxt, log)"},{"line_number":110,"context_line":"                        init_log_mock.assert_called_once_with("},{"line_number":111,"context_line":"                            context\u003dself.ctxt, **log[\u0027log\u0027])"}],"source_content_type":"text/x-python","patch_set":29,"id":"9f436f4f_7af64992","line":108,"updated":"2017-08-09 04:30:50.000000000","message":"i guess it\u0027s better to use \"with foo(),bar(),baz():\" style","commit_id":"68477904140d7c4a1947f435c7f3ac5767c7e517"},{"author":{"_account_id":15471,"name":"Nguyen Phuong An","email":"annp.cs51@gmail.com","username":"An-FVL"},"change_message_id":"b8f34b03f95a170615e9a747d8d7824780908879","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                                return_value\u003dTrue):"},{"line_number":106,"context_line":"                    with mock.patch(\u0027neutron.objects.logapi.\u0027"},{"line_number":107,"context_line":"                                    \u0027logging_resource.Log\u0027,"},{"line_number":108,"context_line":"                                    return_value\u003dnew_log) as init_log_mock:"},{"line_number":109,"context_line":"                        self.log_plugin.create_log(self.ctxt, log)"},{"line_number":110,"context_line":"                        init_log_mock.assert_called_once_with("},{"line_number":111,"context_line":"                            context\u003dself.ctxt, **log[\u0027log\u0027])"}],"source_content_type":"text/x-python","patch_set":29,"id":"9f436f4f_9474219b","line":108,"in_reply_to":"9f436f4f_7af64992","updated":"2017-08-09 09:48:27.000000000","message":"Thank you for your teaching. :)","commit_id":"68477904140d7c4a1947f435c7f3ac5767c7e517"}]}
