)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"795d159c82b6d97b83f0a345d8ba1216703cf926","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Changes for symmetric chain support for OVS driver and agent"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Add fwd_path column in sfc_path_nodes table and in_mac_address column in sfc_portpair_details table in Database."},{"line_number":10,"context_line":"* Edit normalize_chain_parameters for parameters update to keep correlation when updating symmetric in extensions/sfc.py"},{"line_number":11,"context_line":"* Add symmetric chain function in OVS driver and agent to enable SF chain."},{"line_number":12,"context_line":"* Create unit test and tempest cases for symmetric chain function"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I701d03a7aa6459d03062856ae77046990b5a257c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a3c09a3_2bece3c6","line":11,"range":{"start_line":9,"start_character":2,"end_line":11,"end_character":74},"updated":"2017-01-13 09:31:53.000000000","message":"Wrap after 80 chars..","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Changes for symmetric chain support for OVS driver and agent"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Add fwd_path column in sfc_path_nodes table and in_mac_address column in sfc_portpair_details table in Database."},{"line_number":10,"context_line":"* Edit normalize_chain_parameters for parameters update to keep correlation when updating symmetric in extensions/sfc.py"},{"line_number":11,"context_line":"* Add symmetric chain function in OVS driver and agent to enable SF chain."},{"line_number":12,"context_line":"* Create unit test and tempest cases for symmetric chain function"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I701d03a7aa6459d03062856ae77046990b5a257c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a3c09a3_532c3aab","line":11,"range":{"start_line":9,"start_character":2,"end_line":11,"end_character":74},"in_reply_to":"7a3c09a3_2bece3c6","updated":"2017-01-16 14:49:00.000000000","message":"Even shorter :), it should be \u003c\u003d72 chars in OpenStack: https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":15,"context_line":"* Add symmetric chain function in OVS driver and agent to enable"},{"line_number":16,"context_line":"  SF chain."},{"line_number":17,"context_line":"* Create unit test for symmetric chain function"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I701d03a7aa6459d03062856ae77046990b5a257c"},{"line_number":20,"context_line":"Co-Authored-By: Louis Fourie \u003clouis.fourie@huawei.com\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Cathy Zhang \u003cCathy.H.Zhang@huawei.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"fa31d9ce_73180b76","line":18,"updated":"2017-02-14 17:25:10.000000000","message":"missing blueprint link, something like this would do:\nImplements: blueprint symmetric-port-chain-ovs-agent","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/db/flowclassifier_db.py":[{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2017 Futurewei.  All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_a005c77a","line":1,"updated":"2017-02-14 17:25:10.000000000","message":"Please drop all these copyright year changes on unmodified files (only mentioning it here, but same for the other files in that situation): unmodified files shoud not have an updated copyright, this is an unrelated change and makes the review (and commit) hard to read and check","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/db/migration/alembic_migrations/versions/newton/expand/b3adaf631bab__add_fwd_path_and_in_mac_column.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"795d159c82b6d97b83f0a345d8ba1216703cf926","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Futurewei. All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_f0a56ab5","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2017-01-13 09:31:53.000000000","message":"2017","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.add_column(\u0027sfc_path_nodes\u0027, sa.Column(\u0027fwd_path\u0027, sa.Boolean(),"},{"line_number":34,"context_line":"                                              nullable\u003dFalse))"},{"line_number":35,"context_line":"    op.add_column(\u0027sfc_portpair_details\u0027, sa.Column(\u0027in_mac_address\u0027,"},{"line_number":36,"context_line":"                                                    sa.String(length\u003d32),"},{"line_number":37,"context_line":"                                                    nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_3e92159f","line":35,"range":{"start_line":35,"start_character":19,"end_line":35,"end_character":39},"updated":"2017-01-16 14:49:00.000000000","message":"Conflict with https://review.openstack.org/#/c/419130/ - if symmetric chain is still aiming at Ocata, I\u0027d recommend merging it first and then simplifying the driver.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2017 Futurewei. All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_932d7f48","line":1,"updated":"2017-02-14 17:25:10.000000000","message":"This should be in ocata migrations, not newton","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"16272fac9e985dc0b339a8cf28fac18e5446c66c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2017 Futurewei. All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_18c363ee","line":1,"in_reply_to":"fa31d9ce_932d7f48","updated":"2017-02-14 19:17:21.000000000","message":"Will move to ocata","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/extensions/sfc.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"795d159c82b6d97b83f0a345d8ba1216703cf926","unresolved":false,"context_lines":[{"line_number":141,"context_line":"# edit parameters update to keep correlation: mpls with symmetric update"},{"line_number":142,"context_line":"def normalize_chain_parameters(parameters):"},{"line_number":143,"context_line":"    if parameters:"},{"line_number":144,"context_line":"        parameters.update({\u0027correlation\u0027: \u0027mpls\u0027})"},{"line_number":145,"context_line":"        return parameters"},{"line_number":146,"context_line":"    else:"},{"line_number":147,"context_line":"        return DEFAULT_CHAIN_PARAMETERS"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_8b34f7de","line":144,"range":{"start_line":144,"start_character":8,"end_line":144,"end_character":50},"updated":"2017-01-13 09:31:53.000000000","message":"Why we add this explicitly?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":19948,"name":"Farhad Sunavala","email":"fsbiz@yahoo.com","username":"fsunaval"},"change_message_id":"99d6b4fc252d732ff93b7809b2bd7cb75a6ca96b","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    return port_pair_groups"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"# edit parameters update to keep correlation: mpls with symmetric update"},{"line_number":142,"context_line":"def normalize_chain_parameters(parameters):"},{"line_number":143,"context_line":"    if parameters:"},{"line_number":144,"context_line":"        parameters.update({\u0027correlation\u0027: \u0027mpls\u0027})"},{"line_number":145,"context_line":"        return parameters"},{"line_number":146,"context_line":"    else:"},{"line_number":147,"context_line":"        return DEFAULT_CHAIN_PARAMETERS"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"def normalize_sf_parameters(parameters):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_972b4e33","line":147,"range":{"start_line":141,"start_character":0,"end_line":147,"end_character":39},"updated":"2017-01-13 03:56:37.000000000","message":"Nothing wrong but is this change needed ?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"cb28f7a4a92b182045ec8df7875fba7458ea2c42","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    return port_pair_groups"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"# edit parameters update to keep correlation: mpls with symmetric update"},{"line_number":142,"context_line":"def normalize_chain_parameters(parameters):"},{"line_number":143,"context_line":"    if parameters:"},{"line_number":144,"context_line":"        parameters.update({\u0027correlation\u0027: \u0027mpls\u0027})"},{"line_number":145,"context_line":"        return parameters"},{"line_number":146,"context_line":"    else:"},{"line_number":147,"context_line":"        return DEFAULT_CHAIN_PARAMETERS"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"def normalize_sf_parameters(parameters):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_bc03c30e","line":147,"range":{"start_line":141,"start_character":0,"end_line":147,"end_character":39},"in_reply_to":"7a3c09a3_972b4e33","updated":"2017-01-13 18:11:18.000000000","message":"This change in order to keep default chain_parameters {\u0027correlation\u0027: \u0027mpls\u0027} when create port-chain with new chain_parameters {\u0027symmetric\u0027: True}.\n\nWith previous normalize_chain_parameters function, after creating port chain with symmetric parameter, the port_chain[\u0027chain_parameters\u0027] \u003d {\u0027symmetric\u0027: True}.\n\nWith new changes in this function, after creating port chain with symmetric parameter, the port_chain[\u0027chain_parameters\u0027] \u003d {{\u0027symmetric\u0027: True}, {\u0027correlation\u0027: \u0027mpls\u0027}}","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    return port_pair_groups"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"# edit parameters update to keep correlation: mpls with symmetric update"},{"line_number":142,"context_line":"def normalize_chain_parameters(parameters):"},{"line_number":143,"context_line":"    if parameters:"},{"line_number":144,"context_line":"        parameters.update({\u0027correlation\u0027: \u0027mpls\u0027})"},{"line_number":145,"context_line":"        return parameters"},{"line_number":146,"context_line":"    else:"},{"line_number":147,"context_line":"        return DEFAULT_CHAIN_PARAMETERS"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"def normalize_sf_parameters(parameters):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_fecfad7c","line":147,"range":{"start_line":141,"start_character":0,"end_line":147,"end_character":39},"in_reply_to":"7a3c09a3_bc03c30e","updated":"2017-01-16 14:49:00.000000000","message":"I\u0027m not sure what is causing the problem, but how it\u0027s being worked around will bring additional trouble in the future. If I create an nsh-encapsulated chain, when nsh is supported, then normalize_chain_parameters will forcibly replace nsh with mpls.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":141,"context_line":"# edit parameters update to keep correlation: mpls with symmetric update"},{"line_number":142,"context_line":"def normalize_chain_parameters(parameters):"},{"line_number":143,"context_line":"    if parameters:"},{"line_number":144,"context_line":"        parameters.update({\u0027correlation\u0027: \u0027mpls\u0027})"},{"line_number":145,"context_line":"        return parameters"},{"line_number":146,"context_line":"    else:"},{"line_number":147,"context_line":"        return DEFAULT_CHAIN_PARAMETERS"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_f684e90b","line":144,"updated":"2017-02-14 17:25:10.000000000","message":"Having to set it here looks like a bug in the new code, current chains have the correct value without having to force it again.\n\nAlso correlation parameter will accept other values in the future","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"e1da5aacd5b579481ce6aedb8dab86fb56a68d26","unresolved":false,"context_lines":[{"line_number":141,"context_line":"# edit parameters update to keep correlation: mpls with symmetric update"},{"line_number":142,"context_line":"def normalize_chain_parameters(parameters):"},{"line_number":143,"context_line":"    if parameters:"},{"line_number":144,"context_line":"        parameters.update({\u0027correlation\u0027: \u0027mpls\u0027})"},{"line_number":145,"context_line":"        return parameters"},{"line_number":146,"context_line":"    else:"},{"line_number":147,"context_line":"        return DEFAULT_CHAIN_PARAMETERS"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_d6cfbe53","line":144,"in_reply_to":"fa31d9ce_93c3b488","updated":"2017-02-15 11:11:01.000000000","message":"OK :/ Not ideal but for the moment, I suppose it can go in as-is for now.\nBut you should had a FIXME comment so this does not get lost (and will have to be fixed when correlation has multiple possible values)","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"16272fac9e985dc0b339a8cf28fac18e5446c66c","unresolved":false,"context_lines":[{"line_number":141,"context_line":"# edit parameters update to keep correlation: mpls with symmetric update"},{"line_number":142,"context_line":"def normalize_chain_parameters(parameters):"},{"line_number":143,"context_line":"    if parameters:"},{"line_number":144,"context_line":"        parameters.update({\u0027correlation\u0027: \u0027mpls\u0027})"},{"line_number":145,"context_line":"        return parameters"},{"line_number":146,"context_line":"    else:"},{"line_number":147,"context_line":"        return DEFAULT_CHAIN_PARAMETERS"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_93c3b488","line":144,"in_reply_to":"fa31d9ce_f684e90b","updated":"2017-02-14 19:17:21.000000000","message":"For this section, the current chains will lose the other parameter value when update one of the parameters.\n\nWhen update the two chain-parameters values at the same time, only the last --chain-parameters value adds in the port-chain-create cmd will be kept and updated.\n\nTo add the update, because previous correlation value is set and have to equal to \u0027mpls\u0027. If correlation will accept other values, will figure out a way to fix it.","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/services/flowclassifier/drivers/ovs/driver.py":[{"author":{"_account_id":19948,"name":"Farhad Sunavala","email":"fsbiz@yahoo.com","username":"fsunaval"},"change_message_id":"99d6b4fc252d732ff93b7809b2bd7cb75a6ca96b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                \u0027FlowClassifier %s does not set \u0027"},{"line_number":51,"context_line":"                \u0027logical source port in ovs driver\u0027 % flow_classifier[\u0027id\u0027]))"},{"line_number":52,"context_line":"        logical_destination_port \u003d flow_classifier[\u0027logical_destination_port\u0027]"},{"line_number":53,"context_line":"        if logical_destination_port is None:"},{"line_number":54,"context_line":"            raise exc.FlowClassifierBadRequest(message\u003d("},{"line_number":55,"context_line":"                \u0027FlowClassifier %s does not set logical destination port \u0027"},{"line_number":56,"context_line":"                \u0027in ovs driver\u0027 % flow_classifier[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_b72f6af5","line":56,"range":{"start_line":53,"start_character":0,"end_line":56,"end_character":57},"updated":"2017-01-13 03:56:37.000000000","message":"The comment and the code do not match. You are checking to make sure the logical_destination_port is not None.\nDoes this mean that the logical_destination_port HAS to be specified even if the \"symmetric\" option is not specified?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                \u0027FlowClassifier %s does not set \u0027"},{"line_number":51,"context_line":"                \u0027logical source port in ovs driver\u0027 % flow_classifier[\u0027id\u0027]))"},{"line_number":52,"context_line":"        logical_destination_port \u003d flow_classifier[\u0027logical_destination_port\u0027]"},{"line_number":53,"context_line":"        if logical_destination_port is None:"},{"line_number":54,"context_line":"            raise exc.FlowClassifierBadRequest(message\u003d("},{"line_number":55,"context_line":"                \u0027FlowClassifier %s does not set logical destination port \u0027"},{"line_number":56,"context_line":"                \u0027in ovs driver\u0027 % flow_classifier[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_beffe565","line":56,"range":{"start_line":53,"start_character":0,"end_line":56,"end_character":57},"in_reply_to":"7a3c09a3_1c121763","updated":"2017-01-16 14:49:00.000000000","message":"\u003e However considering about consistency, logical_destination_port set to be required.\n\nCan you expand a bit about such consistency?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"cb28f7a4a92b182045ec8df7875fba7458ea2c42","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                \u0027FlowClassifier %s does not set \u0027"},{"line_number":51,"context_line":"                \u0027logical source port in ovs driver\u0027 % flow_classifier[\u0027id\u0027]))"},{"line_number":52,"context_line":"        logical_destination_port \u003d flow_classifier[\u0027logical_destination_port\u0027]"},{"line_number":53,"context_line":"        if logical_destination_port is None:"},{"line_number":54,"context_line":"            raise exc.FlowClassifierBadRequest(message\u003d("},{"line_number":55,"context_line":"                \u0027FlowClassifier %s does not set logical destination port \u0027"},{"line_number":56,"context_line":"                \u0027in ovs driver\u0027 % flow_classifier[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_1c121763","line":56,"range":{"start_line":53,"start_character":0,"end_line":56,"end_character":57},"in_reply_to":"7a3c09a3_b72f6af5","updated":"2017-01-13 18:11:18.000000000","message":"The comment and code matches, this raise exception \"FlowClassifier ... does not set logical destination port\" when logical_destination_port is None which means the logical_destination_port is required.\n\nEven though for \"symmetric\" not specified, the logical_destination_port is not required. However considering about consistency, logical_destination_port set to be required.\n\nDo you think we need to set separate condition about logical_destination_port for \u0027symmetirc\u0027 option?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \"\"\"OVS Driver precommit before transaction committed."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        Make sure the logical_source_port is not None."},{"line_number":44,"context_line":"        Make sure the logical_destination_port is None."},{"line_number":45,"context_line":"        \"\"\""},{"line_number":46,"context_line":"        flow_classifier \u003d context.current"},{"line_number":47,"context_line":"        logical_source_port \u003d flow_classifier[\u0027logical_source_port\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_d1a1aff9","line":44,"updated":"2017-02-14 17:25:10.000000000","message":"Update comment to reflect the change below","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            raise exc.FlowClassifierBadRequest(message\u003d("},{"line_number":50,"context_line":"                \u0027FlowClassifier %s does not set \u0027"},{"line_number":51,"context_line":"                \u0027logical source port in ovs driver\u0027 % flow_classifier[\u0027id\u0027]))"},{"line_number":52,"context_line":"        # logical_destination_port \u003d"},{"line_number":53,"context_line":"        #     flow_classifier[\u0027logical_destination_port\u0027]"},{"line_number":54,"context_line":"        # if logical_destination_port is None:"},{"line_number":55,"context_line":"        #     raise exc.FlowClassifierBadRequest(message\u003d("}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_767c79b5","line":52,"updated":"2017-02-14 17:25:10.000000000","message":"Only commented code, should be dropped","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/services/sfc/agent/extensions/openvswitch/sfc_driver.py":[{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"7f758c0900169ca61bf2943f80193073f6889062","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    if flowrule[\u0027fwd_path\u0027]:"},{"line_number":139,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id)"},{"line_number":140,"context_line":"                    else:"},{"line_number":141,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id + 7000)"},{"line_number":142,"context_line":"                    for item in flowrule[\u0027next_hops\u0027]:"},{"line_number":143,"context_line":"                        if flowrule[\u0027fwd_path\u0027]:"},{"line_number":144,"context_line":"                            self.br_int.delete_flows("}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_e8d7eabc","line":141,"range":{"start_line":141,"start_character":69,"end_line":141,"end_character":73},"updated":"2017-01-20 16:44:06.000000000","message":"REVERSE_GROUP_NUMBER_OFFSET 7000 to be added in next patch.\nFor a symmetric chain, an additional OVS group is needed for the reverse path load balancer to a port-pair-group. This reverse path group number is chosen as the forward OVS group number + REVERSE_GROUP_NUMBER_OFFSET.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"795d159c82b6d97b83f0a345d8ba1216703cf926","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    if flowrule[\u0027fwd_path\u0027]:"},{"line_number":139,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id)"},{"line_number":140,"context_line":"                    else:"},{"line_number":141,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id + 7000)"},{"line_number":142,"context_line":"                    for item in flowrule[\u0027next_hops\u0027]:"},{"line_number":143,"context_line":"                        if flowrule[\u0027fwd_path\u0027]:"},{"line_number":144,"context_line":"                            self.br_int.delete_flows("}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_2b7303b3","line":141,"range":{"start_line":141,"start_character":69,"end_line":141,"end_character":73},"updated":"2017-01-13 09:31:53.000000000","message":"Why this value?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"7972c4cbf5ab3ad2835976fe37528bcd4042ea53","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    if flowrule[\u0027fwd_path\u0027]:"},{"line_number":139,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id)"},{"line_number":140,"context_line":"                    else:"},{"line_number":141,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id + 7000)"},{"line_number":142,"context_line":"                    for item in flowrule[\u0027next_hops\u0027]:"},{"line_number":143,"context_line":"                        if flowrule[\u0027fwd_path\u0027]:"},{"line_number":144,"context_line":"                            self.br_int.delete_flows("}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_695a7e52","line":141,"range":{"start_line":141,"start_character":69,"end_line":141,"end_character":73},"in_reply_to":"7a3c09a3_2b7303b3","updated":"2017-01-18 21:30:46.000000000","message":"Groups for load balancers in the reverse direction are numbered from REVERSE_GROUP_NUMBER_OFFSET","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"cdce079a3e675c7e3ad38fd42a3e3de672850706","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    if flowrule[\u0027fwd_path\u0027]:"},{"line_number":139,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id)"},{"line_number":140,"context_line":"                    else:"},{"line_number":141,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id + 7000)"},{"line_number":142,"context_line":"                    for item in flowrule[\u0027next_hops\u0027]:"},{"line_number":143,"context_line":"                        if flowrule[\u0027fwd_path\u0027]:"},{"line_number":144,"context_line":"                            self.br_int.delete_flows("}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_fffc6074","line":141,"range":{"start_line":141,"start_character":69,"end_line":141,"end_character":73},"in_reply_to":"7a3c09a3_695a7e52","updated":"2017-01-18 21:58:01.000000000","message":"Where is REVERSE_GROUP_NUMBER_OFFSET?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                    else:"},{"line_number":141,"context_line":"                        self.br_int.delete_group(group_id\u003dgroup_id + 7000)"},{"line_number":142,"context_line":"                    for item in flowrule[\u0027next_hops\u0027]:"},{"line_number":143,"context_line":"                        if flowrule[\u0027fwd_path\u0027]:"},{"line_number":144,"context_line":"                            self.br_int.delete_flows("},{"line_number":145,"context_line":"                                table\u003dACROSS_SUBNET_TABLE,"},{"line_number":146,"context_line":"                                dl_dst\u003ditem[\u0027in_mac_address\u0027])"},{"line_number":147,"context_line":"                        else:"},{"line_number":148,"context_line":"                            self.int_br.delete_flows("},{"line_number":149,"context_line":"                                table\u003dACROSS_SUBNET_TABLE,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_76c039e1","line":146,"range":{"start_line":143,"start_character":24,"end_line":146,"end_character":62},"updated":"2017-01-16 14:49:00.000000000","message":"When fwd_path is set, we use in_mac_address. When it\u0027s not, we use mac_address. I recommend sticking to mac_address when the fwd_path is set, so that this patch doesn\u0027t change any existing semantics (fwd_path set is the default before this patch).\n\nSo, rename in_mac_address to mac_address; and mac_address to something else \u003d\u003e no change in semantics after this patch.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"795d159c82b6d97b83f0a345d8ba1216703cf926","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            for destination_port in destination_port_masks:"},{"line_number":275,"context_line":"                for source_port in source_port_masks:"},{"line_number":276,"context_line":"                    if nw_proto is None:"},{"line_number":277,"context_line":"                        if flowrule[\u0027fwd_path\u0027]:"},{"line_number":278,"context_line":"                            flow_infos.append(dict("},{"line_number":279,"context_line":"                                dl_type\u003ddl_type,"},{"line_number":280,"context_line":"                                nw_src\u003dnw_src,"},{"line_number":281,"context_line":"                                nw_dst\u003dnw_dst,"},{"line_number":282,"context_line":"                                tp_src\u003d\u0027%s\u0027 % source_port,"},{"line_number":283,"context_line":"                                tp_dst\u003d\u0027%s\u0027 % destination_port"},{"line_number":284,"context_line":"                            ))"},{"line_number":285,"context_line":"                        else:"},{"line_number":286,"context_line":"                            flow_infos.append(dict("},{"line_number":287,"context_line":"                                dl_type\u003ddl_type,"},{"line_number":288,"context_line":"                                nw_src\u003dnw_src,"},{"line_number":289,"context_line":"                                nw_dst\u003dnw_dst,"},{"line_number":290,"context_line":"                                tp_src\u003d\u0027%s\u0027 % destination_port,"},{"line_number":291,"context_line":"                                tp_dst\u003d\u0027%s\u0027 % source_port"},{"line_number":292,"context_line":"                            ))"},{"line_number":293,"context_line":"                    else:"},{"line_number":294,"context_line":"                        if flowrule[\u0027fwd_path\u0027]:"},{"line_number":295,"context_line":"                            flow_infos.append(dict("},{"line_number":296,"context_line":"                                dl_type\u003ddl_type,"},{"line_number":297,"context_line":"                                nw_proto\u003dnw_proto,"},{"line_number":298,"context_line":"                                nw_src\u003dnw_src,"},{"line_number":299,"context_line":"                                nw_dst\u003dnw_dst,"},{"line_number":300,"context_line":"                                tp_src\u003d\u0027%s\u0027 % source_port,"},{"line_number":301,"context_line":"                                tp_dst\u003d\u0027%s\u0027 % destination_port"},{"line_number":302,"context_line":"                            ))"},{"line_number":303,"context_line":"                        else:"},{"line_number":304,"context_line":"                            flow_infos.append(dict("},{"line_number":305,"context_line":"                                dl_type\u003ddl_type,"},{"line_number":306,"context_line":"                                nw_proto\u003dnw_proto,"},{"line_number":307,"context_line":"                                nw_src\u003dnw_src,"},{"line_number":308,"context_line":"                                nw_dst\u003dnw_dst,"},{"line_number":309,"context_line":"                                tp_src\u003d\u0027%s\u0027 % destination_port,"},{"line_number":310,"context_line":"                                tp_dst\u003d\u0027%s\u0027 % source_port"},{"line_number":311,"context_line":"                            ))"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        return flow_infos"},{"line_number":314,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_ebbe5bd3","line":311,"range":{"start_line":277,"start_character":24,"end_line":311,"end_character":30},"updated":"2017-01-13 09:31:53.000000000","message":"How about optimizing this, \nif flowrule[\u0027fwd_path\u0027]:\n    tp_src \u003d \u0027%s\u0027 % source_port\n    tp_dst \u003d \u0027%s\u0027 % destination_port\nelse\n    tp_dst \u003d \u0027%s\u0027 % source_port\n    tp_src \u003d \u0027%s\u0027 % destination_port\nif nw_proto is None:\n    flow_infos.append(dict(\n                      dl_type\u003ddl_type,\n                      nw_src\u003dnw_src,\n                      nw_dst\u003dnw_dst,\n                      tp_src\u003dtp_src,\n                      tp_dst\u003dtp_dst))\nelse:\n    flow_infos.append(dict(\n                      dl_type\u003ddl_type,\n                      nw_proto\u003dnw_proto,\n                      nw_src\u003dnw_src,\n                      nw_dst\u003dnw_dst,\n                      tp_src\u003dtp_src,\n                      tp_dst\u003dtp_dst))","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                                table\u003dACROSS_SUBNET_TABLE,"},{"line_number":150,"context_line":"                                dl_dst\u003ditem[\u0027in_mac_address\u0027])"},{"line_number":151,"context_line":"                        else:"},{"line_number":152,"context_line":"                            self.int_br.delete_flows("},{"line_number":153,"context_line":"                                table\u003dACROSS_SUBNET_TABLE,"},{"line_number":154,"context_line":"                                dl_dst\u003ditem[\u0027mac_address\u0027])"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_02ebf378","line":152,"range":{"start_line":152,"start_character":33,"end_line":152,"end_character":39},"updated":"2017-02-14 17:25:10.000000000","message":"br_int ! Related to the comments in networking_sfc/tests/unit/services/sfc/agent/extensions/openvswitch/test_sfc_driver.py","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"d9df9bfff19f0ef7c0745db894e0c603e44b72f3","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                                table\u003dACROSS_SUBNET_TABLE,"},{"line_number":150,"context_line":"                                dl_dst\u003ditem[\u0027in_mac_address\u0027])"},{"line_number":151,"context_line":"                        else:"},{"line_number":152,"context_line":"                            self.int_br.delete_flows("},{"line_number":153,"context_line":"                                table\u003dACROSS_SUBNET_TABLE,"},{"line_number":154,"context_line":"                                dl_dst\u003ditem[\u0027mac_address\u0027])"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_ec0ebc8a","line":152,"range":{"start_line":152,"start_character":33,"end_line":152,"end_character":39},"in_reply_to":"fa31d9ce_02ebf378","updated":"2017-02-15 09:26:00.000000000","message":"thanks for pointing out","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/services/sfc/drivers/ovs/db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"795d159c82b6d97b83f0a345d8ba1216703cf926","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            raise NodeNotFound(node_id\u003did)"},{"line_number":224,"context_line":"        return node"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _get_port_detail(self, id):"},{"line_number":227,"context_line":"        try:"},{"line_number":228,"context_line":"            port \u003d self._get_by_id(self.admin_context, PortPairDetail, id)"},{"line_number":229,"context_line":"        except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_4b7ccf20","line":226,"range":{"start_line":226,"start_character":8,"end_line":226,"end_character":24},"updated":"2017-01-13 09:31:53.000000000","message":"Better to rename this as well _get_portpair_detail","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"b70bc60630b802b254cfd5681403805fce58a69a","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            raise NodeNotFound(node_id\u003did)"},{"line_number":224,"context_line":"        return node"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _get_port_detail(self, id):"},{"line_number":227,"context_line":"        try:"},{"line_number":228,"context_line":"            port \u003d self._get_by_id(self.admin_context, PortPairDetail, id)"},{"line_number":229,"context_line":"        except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_6618c41e","line":226,"range":{"start_line":226,"start_character":8,"end_line":226,"end_character":24},"in_reply_to":"7a3c09a3_4b7ccf20","updated":"2017-01-13 19:02:25.000000000","message":"_get_port_pair_detail to be consistent and elsewhere","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"795d159c82b6d97b83f0a345d8ba1216703cf926","unresolved":false,"context_lines":[{"line_number":323,"context_line":"            node_obj \u003d self._get_path_node(id)"},{"line_number":324,"context_line":"            self.admin_context.session.delete(node_obj)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def get_port_detail(self, id):"},{"line_number":327,"context_line":"        with self.admin_context.session.begin(subtransactions\u003dTrue):"},{"line_number":328,"context_line":"            port_obj \u003d self._get_port_detail(id)"},{"line_number":329,"context_line":"            return self._make_port_detail_dict(port_obj)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_eb93bb4d","line":326,"range":{"start_line":326,"start_character":8,"end_line":326,"end_character":23},"updated":"2017-01-13 09:31:53.000000000","message":"Better to rename this as well to get_portpair_detail","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            raise PortPairDetailNotFound(port_id\u003did)"},{"line_number":231,"context_line":"        return port"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def create_portpair_detail(self, port):"},{"line_number":234,"context_line":"        with self.admin_context.session.begin(subtransactions\u003dTrue):"},{"line_number":235,"context_line":"            args \u003d self._filter_non_model_columns(port, PortPairDetail)"},{"line_number":236,"context_line":"            args[\u0027id\u0027] \u003d uuidutils.generate_uuid()"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_f132335d","line":233,"updated":"2017-02-14 17:25:10.000000000","message":"Nit: port_pair to be homogeneous with previous change","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"d9df9bfff19f0ef7c0745db894e0c603e44b72f3","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            raise PortPairDetailNotFound(port_id\u003did)"},{"line_number":231,"context_line":"        return port"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def create_portpair_detail(self, port):"},{"line_number":234,"context_line":"        with self.admin_context.session.begin(subtransactions\u003dTrue):"},{"line_number":235,"context_line":"            args \u003d self._filter_non_model_columns(port, PortPairDetail)"},{"line_number":236,"context_line":"            args[\u0027id\u0027] \u003d uuidutils.generate_uuid()"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_2939a6d7","line":233,"in_reply_to":"fa31d9ce_f132335d","updated":"2017-02-15 09:26:00.000000000","message":"will change, thx for pointing out","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                if key \u003d\u003d \u0027portpair_details\u0027:"},{"line_number":295,"context_line":"                    pds \u003d []"},{"line_number":296,"context_line":"                    for pd_id in value:"},{"line_number":297,"context_line":"                        # self._get_port_pair_detail(pd_id)"},{"line_number":298,"context_line":"                        query \u003d self._model_query("},{"line_number":299,"context_line":"                            self.admin_context, PathPortAssoc)"},{"line_number":300,"context_line":"                        pd_association \u003d query.filter_by("}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_b17a7bef","line":297,"updated":"2017-02-14 17:25:10.000000000","message":"Commented code, please remove (also this line was removed from current code previously)","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"            return self._make_pathnode_dict(node_obj)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def delete_portpair_detail(self, id):"},{"line_number":317,"context_line":"        with self.admin_context.session.begin(subtransactions\u003dTrue):"},{"line_number":318,"context_line":"            port_obj \u003d self._get_port_pair_detail(id)"},{"line_number":319,"context_line":"            self.admin_context.session.delete(port_obj)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_31412baa","line":316,"updated":"2017-02-14 17:25:10.000000000","message":"Nit: port_pair to be homogeneous with previous change","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/services/sfc/drivers/ovs/driver.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"795d159c82b6d97b83f0a345d8ba1216703cf926","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Futurewei. All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_4ba3ef9e","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2017-01-13 09:31:53.000000000","message":"2017","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        return pd"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    # change here for rev_src_node"},{"line_number":250,"context_line":"    @log_helpers.log_method_call"},{"line_number":251,"context_line":"    def _add_flowclassifier_port_assoc(self, fc_ids, project_id,"},{"line_number":252,"context_line":"                                       src_node):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_115d0779","line":249,"updated":"2017-02-14 17:25:10.000000000","message":"what do you mean with this comment?","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                                       src_node):"},{"line_number":253,"context_line":"        for fc in self._get_fcs_by_ids(fc_ids):"},{"line_number":254,"context_line":"            need_assoc \u003d True"},{"line_number":255,"context_line":"            # lookup the soruce port, when it\u0027s reverse path"},{"line_number":256,"context_line":"            # set logical_destination_port to be source port"},{"line_number":257,"context_line":"            if src_node[\u0027fwd_path\u0027] is False:"},{"line_number":258,"context_line":"                src_pd_filter \u003d dict("}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_91f73758","line":255,"range":{"start_line":255,"start_character":25,"end_line":255,"end_character":31},"updated":"2017-02-14 17:25:10.000000000","message":"nit: source","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                    egress\u003dfc[\u0027logical_destination_port\u0027],"},{"line_number":260,"context_line":"                    project_id\u003dproject_id,"},{"line_number":261,"context_line":"                )"},{"line_number":262,"context_line":"            # lookup the source port"},{"line_number":263,"context_line":"            else:"},{"line_number":264,"context_line":"                src_pd_filter \u003d dict("},{"line_number":265,"context_line":"                    egress\u003dfc[\u0027logical_source_port\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_712d63a7","line":262,"updated":"2017-02-14 17:25:10.000000000","message":"this comment can be regrouped for both cases (moved before the if), and then only detail what is different on reverse path","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                                       pd[\u0027id\u0027])"},{"line_number":315,"context_line":"                            src_node[\u0027portpair_details\u0027].remove(pd[\u0027id\u0027])"},{"line_number":316,"context_line":"                            # path_nodes is [] when passing from pds"},{"line_number":317,"context_line":"                            # if len(pd[\u0027path_nodes\u0027]) \u003d\u003d 1:"},{"line_number":318,"context_line":"                            self.delete_portpair_detail(pd[\u0027id\u0027])"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_0ceb2c79","line":317,"updated":"2017-02-14 17:25:10.000000000","message":"This should not be hidden in a comment, and may break if there is a path_node left.\nI\u0027d rather leave the check and open a bug for it so it gets fixed","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"d9df9bfff19f0ef7c0745db894e0c603e44b72f3","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                                       pd[\u0027id\u0027])"},{"line_number":315,"context_line":"                            src_node[\u0027portpair_details\u0027].remove(pd[\u0027id\u0027])"},{"line_number":316,"context_line":"                            # path_nodes is [] when passing from pds"},{"line_number":317,"context_line":"                            # if len(pd[\u0027path_nodes\u0027]) \u003d\u003d 1:"},{"line_number":318,"context_line":"                            self.delete_portpair_detail(pd[\u0027id\u0027])"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_9802da08","line":317,"in_reply_to":"fa31d9ce_0ceb2c79","updated":"2017-02-15 09:26:00.000000000","message":"Current function doesn\u0027t delete the src_node from portpair_detail tables. Didn\u0027t see the reason need to check the length of pd[\u0027path_nodes\u0027], which returns the []. \n\nWithout this if condition, src_node in portpair_details table could be removed properly.","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"e1da5aacd5b579481ce6aedb8dab86fb56a68d26","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                                       pd[\u0027id\u0027])"},{"line_number":315,"context_line":"                            src_node[\u0027portpair_details\u0027].remove(pd[\u0027id\u0027])"},{"line_number":316,"context_line":"                            # path_nodes is [] when passing from pds"},{"line_number":317,"context_line":"                            # if len(pd[\u0027path_nodes\u0027]) \u003d\u003d 1:"},{"line_number":318,"context_line":"                            self.delete_portpair_detail(pd[\u0027id\u0027])"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_16723611","line":317,"in_reply_to":"fa31d9ce_9802da08","updated":"2017-02-15 11:11:01.000000000","message":"Yes, I know the current code does not work, but this is an unrelated bug. As I said, please fill a launchpad bug for it, you can of course submit this change as a separate workaround review (though a proper fix would be better).\nAnd in this review, leave the current code (as it does not affect the added feature)","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":448,"context_line":"                    next_group_intid, next_group_members \u003d ("},{"line_number":449,"context_line":"                        self._get_portgroup_members("},{"line_number":450,"context_line":"                            context,"},{"line_number":451,"context_line":"                            port_pair_groups[sf_path_length - 1 - 1 - i],"},{"line_number":452,"context_line":"                            fwd_path)"},{"line_number":453,"context_line":"                    )"},{"line_number":454,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_cc503435","line":451,"updated":"2017-02-14 17:25:10.000000000","message":"a comment would be nice here to explain this arithmetic fun","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":483,"context_line":"                LOG.debug(\u0027create assoc port with node: %s\u0027, sfna)"},{"line_number":484,"context_line":"                sf_node[\u0027portpair_details\u0027].append(member[\u0027portpair_id\u0027])"},{"line_number":485,"context_line":"            path_nodes.append(sf_node)"},{"line_number":486,"context_line":"            # update ingress \u0026 egress here"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        return path_nodes"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_47125d58","line":486,"updated":"2017-02-14 17:25:10.000000000","message":"is this a todo item left?","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"d9df9bfff19f0ef7c0745db894e0c603e44b72f3","unresolved":false,"context_lines":[{"line_number":483,"context_line":"                LOG.debug(\u0027create assoc port with node: %s\u0027, sfna)"},{"line_number":484,"context_line":"                sf_node[\u0027portpair_details\u0027].append(member[\u0027portpair_id\u0027])"},{"line_number":485,"context_line":"            path_nodes.append(sf_node)"},{"line_number":486,"context_line":"            # update ingress \u0026 egress here"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        return path_nodes"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_29d0c6f5","line":486,"in_reply_to":"fa31d9ce_47125d58","updated":"2017-02-15 09:26:00.000000000","message":"no todo left here","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            for pd in pds:"},{"line_number":524,"context_line":"                self.delete_path_node(pd[\u0027id\u0027])"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        # only 1 src_node fwd_path: T has been passed"},{"line_number":527,"context_line":"        # delete the ports on the traffic classifier"},{"line_number":528,"context_line":"        self._remove_flowclassifier_port_assoc("},{"line_number":529,"context_line":"            port_chain[\u0027flow_classifiers\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_670121af","line":526,"range":{"start_line":526,"start_character":36,"end_line":526,"end_character":38},"updated":"2017-02-14 17:25:10.000000000","message":"what is T?","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"d9df9bfff19f0ef7c0745db894e0c603e44b72f3","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            for pd in pds:"},{"line_number":524,"context_line":"                self.delete_path_node(pd[\u0027id\u0027])"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        # only 1 src_node fwd_path: T has been passed"},{"line_number":527,"context_line":"        # delete the ports on the traffic classifier"},{"line_number":528,"context_line":"        self._remove_flowclassifier_port_assoc("},{"line_number":529,"context_line":"            port_chain[\u0027flow_classifiers\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_49f25a9b","line":526,"range":{"start_line":526,"start_character":36,"end_line":526,"end_character":38},"in_reply_to":"fa31d9ce_670121af","updated":"2017-02-15 09:26:00.000000000","message":"It stands True, but it\u0027s the comment note for deploying code, will remove it","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":700,"context_line":"            for fc in self._get_fcs_by_ids(port_chain[\u0027flow_classifiers\u0027]):"},{"line_number":701,"context_line":"                if fc[\u0027logical_destination_port\u0027] is None:"},{"line_number":702,"context_line":"                    raise exc.SfcBadRequest(message\u003d("},{"line_number":703,"context_line":"                        \u0027FlowClassifier %s does not sets\u0027"},{"line_number":704,"context_line":"                        \u0027logical_destination_port. logical_destination_port \u0027"},{"line_number":705,"context_line":"                        \u0027needed when symmetric has been set. Please recreate \u0027"},{"line_number":706,"context_line":"                        \u0027FlowClassifier with logical_destination_port and \u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_c7d9ed58","line":703,"range":{"start_line":703,"start_character":55,"end_line":703,"end_character":56},"updated":"2017-02-14 17:25:10.000000000","message":"set","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":907,"context_line":"    def _get_port_detail_info(self, port_id):"},{"line_number":908,"context_line":"        \"\"\"Get port detail."},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        @param: portpair_id: uuid"},{"line_number":911,"context_line":"        @return: (host_id, local_ip, network_type, segment_id,"},{"line_number":912,"context_line":"        service_insert_type): tuple"},{"line_number":913,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_e77fd114","line":910,"range":{"start_line":910,"start_character":20,"end_line":910,"end_character":24},"updated":"2017-02-14 17:25:10.000000000","message":"also update the comment","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":943,"context_line":"        return host_id, local_ip, network_type, segment_id, mac_address"},{"line_number":944,"context_line":""},{"line_number":945,"context_line":"    @log_helpers.log_method_call"},{"line_number":946,"context_line":"    def _create_portpair_detail(self, port_pair):"},{"line_number":947,"context_line":"        # since first node may not assign the ingress port, and last node"},{"line_number":948,"context_line":"        # is not saved in the portpair_detail. we store the major egress port"},{"line_number":949,"context_line":"        # info as the key to get the SF information."}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_87a8d578","line":946,"updated":"2017-02-14 17:25:10.000000000","message":"nit: could be port_pair to keep in line with the other changes","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"            LOG.error(_LE(\"get_flowrules_by_host_portid failed\"))"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"    def update_flowrule_status(self, context, id, status):"},{"line_number":1065,"context_line":"        pass"},{"line_number":1066,"context_line":"        # try:"},{"line_number":1067,"context_line":"        #     flowrule_status \u003d dict(status\u003dstatus)"},{"line_number":1068,"context_line":"        #     self.update_path_node(id, flowrule_status)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_67d92122","line":1065,"updated":"2017-02-14 17:25:10.000000000","message":"This is https://review.openstack.org/#/c/431218/ right?\n\nUnrelated change, please revert it here (the change is large enough by itself)","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":23142,"name":"Freya Dian Yu","email":"freyadyu@gmail.com","username":"dianyu"},"change_message_id":"d9df9bfff19f0ef7c0745db894e0c603e44b72f3","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"            LOG.error(_LE(\"get_flowrules_by_host_portid failed\"))"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"    def update_flowrule_status(self, context, id, status):"},{"line_number":1065,"context_line":"        pass"},{"line_number":1066,"context_line":"        # try:"},{"line_number":1067,"context_line":"        #     flowrule_status \u003d dict(status\u003dstatus)"},{"line_number":1068,"context_line":"        #     self.update_path_node(id, flowrule_status)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_897c52ed","line":1065,"in_reply_to":"fa31d9ce_67d92122","updated":"2017-02-15 09:26:00.000000000","message":"Actually, prefer to abandon the other patch you mentioned, but keeping the changes in this patch in order to ensure functions work and avoid RuntimeError, DBError and DBconnectionError.","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"e1da5aacd5b579481ce6aedb8dab86fb56a68d26","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"            LOG.error(_LE(\"get_flowrules_by_host_portid failed\"))"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"    def update_flowrule_status(self, context, id, status):"},{"line_number":1065,"context_line":"        pass"},{"line_number":1066,"context_line":"        # try:"},{"line_number":1067,"context_line":"        #     flowrule_status \u003d dict(status\u003dstatus)"},{"line_number":1068,"context_line":"        #     self.update_path_node(id, flowrule_status)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_36bf3a62","line":1065,"in_reply_to":"fa31d9ce_897c52ed","updated":"2017-02-15 11:11:01.000000000","message":"This should be kept separate. Mixing multiple logical changes in a commit is a no-go, please follow: https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"e36d4c1576ed1e249d60a50b9f1548f26f6b8be8","unresolved":false,"context_lines":[{"line_number":1060,"context_line":"            LOG.error(_LE(\"get_flowrules_by_host_portid failed\"))"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"    def update_flowrule_status(self, context, id, status):"},{"line_number":1063,"context_line":"        pass"},{"line_number":1064,"context_line":"        # try:"},{"line_number":1065,"context_line":"        #     flowrule_status \u003d dict(status\u003dstatus)"},{"line_number":1066,"context_line":"        #     self.update_path_node(id, flowrule_status)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_8db88f2c","line":1063,"updated":"2017-02-16 16:35:13.000000000","message":"To move to https://review.openstack.org/#/c/431218/","commit_id":"a2cb01900a71d70e3566a12046ea39ad1869dee3"}],"networking_sfc/tests/tempest_plugin/tests/api/base.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                port_ip_prefix \u003d str(netaddr.IPNetwork("},{"line_number":64,"context_line":"                    port[\u0027fixed_ips\u0027][0][\u0027ip_address\u0027]))"},{"line_number":65,"context_line":"                kwargs[\u0027source_ip_prefix\u0027] \u003d port_ip_prefix"},{"line_number":66,"context_line":"                if \u0027logical_destination_port\u0027 not in kwargs:"},{"line_number":67,"context_line":"                    port_kwargs \u003d {\"binding:host_id\": self.host_id}"},{"line_number":68,"context_line":"                    port \u003d self._create_port(network\u003dself.network,"},{"line_number":69,"context_line":"                                             **port_kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_39ca2f6e","line":66,"range":{"start_line":66,"start_character":16,"end_line":66,"end_character":60},"updated":"2017-01-16 14:49:00.000000000","message":"Why is this not checked if source_ip_prefix is already specified?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"}],"networking_sfc/tests/tempest_plugin/tests/scenario/test_sfc.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        port_chain \u003d self._create_port_chain("},{"line_number":168,"context_line":"            port_pair_groups\u003d[port_pair_group[\u0027id\u0027]],"},{"line_number":169,"context_line":"            flow_classifiers\u003d[fc[\u0027id\u0027]],"},{"line_number":170,"context_line":"            chain_parameters\u003d{\u0027symmetric\u0027: True}"},{"line_number":171,"context_line":"        )"},{"line_number":172,"context_line":"        self._check_connectivity("},{"line_number":173,"context_line":"            server1_floating_ip, server2_fixed_ip,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_59a7fb4e","line":170,"range":{"start_line":170,"start_character":12,"end_line":170,"end_character":48},"updated":"2017-01-16 14:49:00.000000000","message":"I can see the problem from extensions/sfc.py:140 here.\nEither chain_parameters needs to pass the complete specification of parameters, or the normalization at the sfc.py needs to set defaults only for non-specified parameters.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"}],"networking_sfc/tests/unit/db/test_flowclassifier_db.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        ) as port:"},{"line_number":160,"context_line":"            self._test_create_flow_classifier({"},{"line_number":161,"context_line":"                \u0027logical_source_port\u0027: port[\u0027port\u0027][\u0027id\u0027],"},{"line_number":162,"context_line":"                \u0027logical_destination_port\u0027: port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":163,"context_line":"            })"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def test_quota_create_flow_classifier(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_d9484b8a","line":162,"range":{"start_line":162,"start_character":16,"end_line":162,"end_character":62},"updated":"2017-01-16 14:49:00.000000000","message":"This is not the same test, unless this means that FCs now always require a logical_destination_port. The same applies to the remaining of tests changed below.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"}],"networking_sfc/tests/unit/db/test_sfc_db.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":345,"context_line":"                \u0027flow_classifiers\u0027: [],"},{"line_number":346,"context_line":"                \u0027name\u0027: \u0027abc\u0027,"},{"line_number":347,"context_line":"                \u0027description\u0027: \u0027def\u0027,"},{"line_number":348,"context_line":"                \u0027chain_parameters\u0027: {\u0027symmetric\u0027: False, \u0027correlation\u0027: \u0027mpls\u0027}"},{"line_number":349,"context_line":"            })"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"    def test_create_port_chain_all_fields_with_chain_id(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_e40d5a38","line":348,"range":{"start_line":348,"start_character":37,"end_line":348,"end_character":57},"updated":"2017-01-16 14:49:00.000000000","message":"No need to change the test since False is default.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        ) as port:"},{"line_number":482,"context_line":"            with self.flow_classifier(flow_classifier\u003d{"},{"line_number":483,"context_line":"                \u0027logical_source_port\u0027: port[\u0027port\u0027][\u0027id\u0027],"},{"line_number":484,"context_line":"                \u0027logical_destination_port\u0027: port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":485,"context_line":"            }) as fc:"},{"line_number":486,"context_line":"                with self.port_pair_group(port_pair_group\u003d{}) as pg:"},{"line_number":487,"context_line":"                    self._test_create_port_chain({"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_641a4a70","line":484,"range":{"start_line":484,"start_character":16,"end_line":484,"end_character":62},"updated":"2017-01-16 14:49:00.000000000","message":"The same comment I made in test_flowclassifier_db.py (previous file).","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                \u0027chain_id\u0027: 99"},{"line_number":360,"context_line":"            })"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def test_create_port_chain_all_fields_with_symmetirc(self):"},{"line_number":363,"context_line":"        with self.port_pair_group(port_pair_group\u003d{}) as pg:"},{"line_number":364,"context_line":"            self._test_create_port_chain({"},{"line_number":365,"context_line":"                \u0027port_pair_groups\u0027: [pg[\u0027port_pair_group\u0027][\u0027id\u0027]],"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_c7f48d5c","line":362,"range":{"start_line":362,"start_character":47,"end_line":362,"end_character":56},"updated":"2017-02-14 17:25:10.000000000","message":"symmetric","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":706,"context_line":"            self.fmt, {}, expected_res_status\u003d400"},{"line_number":707,"context_line":"        )"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":"    def test_create_port_chain_with_invalid_chain_parameters(self):"},{"line_number":710,"context_line":"        with self.port_pair_group(port_pair_group\u003d{}) as pg:"},{"line_number":711,"context_line":"            self._create_port_chain("},{"line_number":712,"context_line":"                self.fmt, {"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_c7c2cde8","line":709,"updated":"2017-02-14 17:25:10.000000000","message":"Can be splitted in 2 tests (one on symmetric None value, one on correlation \u0027unknown\u0027 value)","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/tests/unit/extensions/test_flowclassifier.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        tenant_id \u003d _uuid()"},{"line_number":117,"context_line":"        data \u003d {\u0027flow_classifier\u0027: {"},{"line_number":118,"context_line":"            \u0027logical_source_port\u0027: _uuid(),"},{"line_number":119,"context_line":"            \u0027logical_destination_port\u0027: _uuid(),"},{"line_number":120,"context_line":"            \u0027tenant_id\u0027: tenant_id, \u0027project_id\u0027: tenant_id,"},{"line_number":121,"context_line":"        }}"},{"line_number":122,"context_line":"        expected_data \u003d self._get_expected_flow_classifier(data)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_78102702","line":119,"range":{"start_line":119,"start_character":0,"end_line":119,"end_character":48},"updated":"2017-01-16 14:49:00.000000000","message":"See comment in test_flowclassifier_db.py.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"}],"networking_sfc/tests/unit/extensions/test_sfc.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7a3c09a3_789ae764","line":952,"updated":"2017-01-16 14:49:00.000000000","message":"\"symmetric\" should be True or False, correct?","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        self._test_create_port_chain()"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_create_port_chain_all_fields(self):"},{"line_number":116,"context_line":"        portchain_id \u003d _uuid()"},{"line_number":117,"context_line":"        tenant_id \u003d _uuid()"},{"line_number":118,"context_line":"        data \u003d {\u0027port_chain\u0027: {"},{"line_number":119,"context_line":"            \u0027description\u0027: \u0027desc\u0027,"},{"line_number":120,"context_line":"            \u0027name\u0027: \u0027test1\u0027,"},{"line_number":121,"context_line":"            \u0027port_pair_groups\u0027: [_uuid()],"},{"line_number":122,"context_line":"            \u0027chain_parameters\u0027: {\u0027symmetric\u0027: False, \u0027correlation\u0027: \u0027mpls\u0027},"},{"line_number":123,"context_line":"            \u0027flow_classifiers\u0027: [],"},{"line_number":124,"context_line":"            \u0027tenant_id\u0027: tenant_id, \u0027project_id\u0027: tenant_id"},{"line_number":125,"context_line":"        }}"},{"line_number":126,"context_line":"        expected_data \u003d self._get_expected_port_chain(data)"},{"line_number":127,"context_line":"        return_value \u003d copy.copy(expected_data[\u0027port_chain\u0027])"},{"line_number":128,"context_line":"        return_value.update({\u0027id\u0027: portchain_id})"},{"line_number":129,"context_line":"        instance \u003d self.plugin.return_value"},{"line_number":130,"context_line":"        instance.create_port_chain.return_value \u003d return_value"},{"line_number":131,"context_line":"        res \u003d self.api.post(_get_path(PORT_CHAIN_PATH, fmt\u003dself.fmt),"},{"line_number":132,"context_line":"                            self.serialize(data),"},{"line_number":133,"context_line":"                            content_type\u003d\u0027application/%s\u0027 % self.fmt)"},{"line_number":134,"context_line":"        instance.create_port_chain.assert_called_with("},{"line_number":135,"context_line":"            mock.ANY,"},{"line_number":136,"context_line":"            port_chain\u003dexpected_data)"},{"line_number":137,"context_line":"        self.assertEqual(exc.HTTPCreated.code, res.status_int)"},{"line_number":138,"context_line":"        res \u003d self.deserialize(res)"},{"line_number":139,"context_line":"        self.assertIn(\u0027port_chain\u0027, res)"},{"line_number":140,"context_line":"        self.assertEqual(return_value, res[\u0027port_chain\u0027])"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_create_port_chain_with_symmetic(self):"},{"line_number":143,"context_line":"        portchain_id \u003d _uuid()"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_a732390e","line":140,"range":{"start_line":116,"start_character":8,"end_line":140,"end_character":57},"updated":"2017-02-14 17:25:10.000000000","message":"Update _test_create_port_chain() to handle the extra parameters and drop all this duplicated code","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        self.assertIn(\u0027port_chain\u0027, res)"},{"line_number":140,"context_line":"        self.assertEqual(return_value, res[\u0027port_chain\u0027])"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_create_port_chain_with_symmetic(self):"},{"line_number":143,"context_line":"        portchain_id \u003d _uuid()"},{"line_number":144,"context_line":"        tenant_id \u003d _uuid()"},{"line_number":145,"context_line":"        data \u003d {\u0027port_chain\u0027: {"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_6704c117","line":142,"range":{"start_line":142,"start_character":36,"end_line":142,"end_character":44},"updated":"2017-02-14 17:25:10.000000000","message":"symmetric","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        self.assertEqual(return_value, res[\u0027port_chain\u0027])"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_create_port_chain_with_symmetic(self):"},{"line_number":143,"context_line":"        portchain_id \u003d _uuid()"},{"line_number":144,"context_line":"        tenant_id \u003d _uuid()"},{"line_number":145,"context_line":"        data \u003d {\u0027port_chain\u0027: {"},{"line_number":146,"context_line":"            \u0027description\u0027: \u0027desc\u0027,"},{"line_number":147,"context_line":"            \u0027name\u0027: \u0027test1\u0027,"},{"line_number":148,"context_line":"            \u0027port_pair_groups\u0027: [_uuid()],"},{"line_number":149,"context_line":"            \u0027chain_parameters\u0027: {\u0027symmetric\u0027: True, \u0027correlation\u0027: \u0027mpls\u0027},"},{"line_number":150,"context_line":"            \u0027flow_classifiers\u0027: [],"},{"line_number":151,"context_line":"            \u0027tenant_id\u0027: tenant_id, \u0027project_id\u0027: tenant_id"},{"line_number":152,"context_line":"        }}"},{"line_number":153,"context_line":"        expected_data \u003d self._get_expected_port_chain(data)"},{"line_number":154,"context_line":"        return_value \u003d copy.copy(expected_data[\u0027port_chain\u0027])"},{"line_number":155,"context_line":"        return_value.update({\u0027id\u0027: portchain_id})"},{"line_number":156,"context_line":"        instance \u003d self.plugin.return_value"},{"line_number":157,"context_line":"        instance.create_port_chain.return_value \u003d return_value"},{"line_number":158,"context_line":"        res \u003d self.api.post(_get_path(PORT_CHAIN_PATH, fmt\u003dself.fmt),"},{"line_number":159,"context_line":"                            self.serialize(data),"},{"line_number":160,"context_line":"                            content_type\u003d\u0027application/%s\u0027 % self.fmt)"},{"line_number":161,"context_line":"        instance.create_port_chain.assert_called_with("},{"line_number":162,"context_line":"            mock.ANY,"},{"line_number":163,"context_line":"            port_chain\u003dexpected_data)"},{"line_number":164,"context_line":"        self.assertEqual(exc.HTTPCreated.code, res.status_int)"},{"line_number":165,"context_line":"        res \u003d self.deserialize(res)"},{"line_number":166,"context_line":"        self.assertIn(\u0027port_chain\u0027, res)"},{"line_number":167,"context_line":"        self.assertEqual(return_value, res[\u0027port_chain\u0027])"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def test_create_port_chain_none_chain_parameters(self):"},{"line_number":170,"context_line":"        self._test_create_port_chain(chain_parameters\u003dNone)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_c2055b11","line":167,"range":{"start_line":143,"start_character":8,"end_line":167,"end_character":57},"updated":"2017-02-14 17:25:10.000000000","message":"Same comment as previous test","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        tenant_id \u003d _uuid()"},{"line_number":237,"context_line":"        data \u003d {\u0027port_chain\u0027: {"},{"line_number":238,"context_line":"            \u0027port_pair_groups\u0027: [_uuid()],"},{"line_number":239,"context_line":"            \u0027chain_parameters\u0027: {\u0027symmetric\u0027: None, \u0027correlation\u0027: \u0027def\u0027},"},{"line_number":240,"context_line":"            \u0027tenant_id\u0027: tenant_id, \u0027project_id\u0027: tenant_id"},{"line_number":241,"context_line":"        }}"},{"line_number":242,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_62e58f36","line":239,"range":{"start_line":239,"start_character":46,"end_line":239,"end_character":51},"updated":"2017-02-14 17:25:10.000000000","message":"Should be False, we check the correlation parameter value in this test","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/tests/unit/services/flowclassifier/drivers/ovs/test_driver.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            with self.flow_classifier(flow_classifier\u003d{"},{"line_number":95,"context_line":"                \u0027name\u0027: \u0027test1\u0027,"},{"line_number":96,"context_line":"                \u0027logical_source_port\u0027: src_port[\u0027port\u0027][\u0027id\u0027],"},{"line_number":97,"context_line":"                \u0027logical_destination_port\u0027: dst_port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":98,"context_line":"            }) as fc:"},{"line_number":99,"context_line":"                fc_context \u003d fc_ctx.FlowClassifierContext("},{"line_number":100,"context_line":"                    self.flowclassifier_plugin, self.ctx,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_b8cb6f52","line":97,"range":{"start_line":97,"start_character":16,"end_line":97,"end_character":66},"updated":"2017-01-16 14:49:00.000000000","message":"See comment in test_flowclassifier_db.py.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                self.driver.create_flow_classifier_precommit,"},{"line_number":108,"context_line":"                fc_context)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    # def test_create_flow_classifier_precommit_logical_destination_port(self):"},{"line_number":111,"context_line":"    #     with self.port("},{"line_number":112,"context_line":"    #         name\u003d\u0027port1\u0027,"},{"line_number":113,"context_line":"    #         device_owner\u003d\u0027compute\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_e20c1fee","line":110,"updated":"2017-02-14 17:25:10.000000000","message":"Delete the commented test (indeed not used anymore if we allow destination port)","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/tests/unit/services/sfc/agent/extensions/openvswitch/test_sfc_driver.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":353,"context_line":"    def mock_get_flowrules_by_host_portid(self, context, port_id):"},{"line_number":354,"context_line":"        return ["},{"line_number":355,"context_line":"            flowrule"},{"line_number":356,"context_line":"            # import pdb; pdb.set_trace()"},{"line_number":357,"context_line":"            for flowrule in self.node_flowrules"},{"line_number":358,"context_line":"            if ("},{"line_number":359,"context_line":"                flowrule[\u0027ingress\u0027] \u003d\u003d port_id or"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_f84fb7ba","line":356,"range":{"start_line":356,"start_character":0,"end_line":356,"end_character":41},"updated":"2017-01-16 14:49:00.000000000","message":"flagging for removal","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":1130,"context_line":"                    status"},{"line_number":1131,"context_line":"                )"},{"line_number":1132,"context_line":"                self.assertEqual("},{"line_number":1133,"context_line":"                    [\u0027ovs-ofctl del-flows br-int -O OpenFlow13 -\u0027,"},{"line_number":1134,"context_line":"                     \u0027ovs-ofctl del-flows br-int -O OpenFlow13 -\u0027,"},{"line_number":1135,"context_line":"                     \u0027ovs-ofctl del-flows br-int -O OpenFlow13 --strict -\u0027],"},{"line_number":1136,"context_line":"                    self.executed_cmds"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_42888bc5","line":1133,"updated":"2017-02-14 17:25:10.000000000","message":"executed_cmds should always be empty in these tests, you should never have to add this kind of entry.\n\nThis usually indicates a problem in the code itself or the mocked calls\nHere it is the first one, see comment in networking_sfc/services/sfc/agent/extensions/openvswitch/sfc_driver.py","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"},{"author":{"_account_id":21798,"name":"Bernard Cafarelli","email":"bcafarel@redhat.com","username":"bcafarel"},"change_message_id":"f9ec153b8f47224f4fa1ae98b10bd9f7768083f9","unresolved":false,"context_lines":[{"line_number":1216,"context_line":"                    status"},{"line_number":1217,"context_line":"                )"},{"line_number":1218,"context_line":"                self.assertEqual("},{"line_number":1219,"context_line":"                    [\u0027ovs-ofctl del-flows br-int -O OpenFlow13 -\u0027,"},{"line_number":1220,"context_line":"                     \u0027ovs-ofctl del-flows br-int -O OpenFlow13 -\u0027,"},{"line_number":1221,"context_line":"                     \u0027ovs-ofctl del-flows br-int -O OpenFlow13 --strict -\u0027],"},{"line_number":1222,"context_line":"                    self.executed_cmds"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_e2b33f98","line":1219,"updated":"2017-02-14 17:25:10.000000000","message":"same","commit_id":"a7e076ef5a971f72369a1ea957236d92b1ae4588"}],"networking_sfc/tests/unit/services/sfc/drivers/ovs/test_driver.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":336,"context_line":"                \u0027l7_parameters\u0027: {},"},{"line_number":337,"context_line":"                \u0027protocol\u0027: \u0027tcp\u0027,"},{"line_number":338,"context_line":"                \u0027logical_source_port\u0027: src_port[\u0027port\u0027][\u0027id\u0027],"},{"line_number":339,"context_line":"                \u0027logical_destination_port\u0027: dst_port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":340,"context_line":"            }) as fc:"},{"line_number":341,"context_line":"                with self.port_pair_group(port_pair_group\u003d{"},{"line_number":342,"context_line":"                    \u0027port_pairs\u0027: []"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_b8b1af91","line":339,"range":{"start_line":339,"start_character":16,"end_line":339,"end_character":66},"updated":"2017-01-16 14:49:00.000000000","message":"See comment in test_flowclassifier_db.py","commit_id":"064665e44dee3544094a63150010f13de62a3c50"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"d67bd5a96770b31c719d1ed32f62c2c0dbca385f","unresolved":false,"context_lines":[{"line_number":2575,"context_line":"                        }, del_fcs[0])"},{"line_number":2576,"context_line":"                        next_hops \u003d self.next_hops_info("},{"line_number":2577,"context_line":"                            delete_flow_rules[flow3].get(\u0027next_hops\u0027))"},{"line_number":2578,"context_line":"                        self.assertEqual("},{"line_number":2579,"context_line":"                            next_hops,"},{"line_number":2580,"context_line":"                            {}"},{"line_number":2581,"context_line":"                        )"},{"line_number":2582,"context_line":"                        self.assertEqual("},{"line_number":2583,"context_line":"                            delete_flow_rules[flow3][\u0027node_type\u0027],"},{"line_number":2584,"context_line":"                            \u0027sf_node\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_38193f89","line":2581,"range":{"start_line":2578,"start_character":24,"end_line":2581,"end_character":25},"updated":"2017-01-16 14:49:00.000000000","message":"You can even make this a one-liner.","commit_id":"064665e44dee3544094a63150010f13de62a3c50"}]}
