)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f1b68142105ec016a711939340868198d6f4e1ec","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-02 13:21:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Realizing SFC (3/5)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch defines two new entities called \u0027flow_classifier\u0027 and"},{"line_number":10,"context_line":"\u0027port_chain\u0027 for realizing service function chaining (SFC)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"7a2fa921_70fcb73e","line":7,"updated":"2015-10-06 06:30:45.000000000","message":"It is better the summary line contains more descriptive information.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-02 13:21:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Realizing SFC (3/5)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch defines two new entities called \u0027flow_classifier\u0027 and"},{"line_number":10,"context_line":"\u0027port_chain\u0027 for realizing service function chaining (SFC)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"7a2fa921_cb738e4c","line":7,"in_reply_to":"7a2fa921_70fcb73e","updated":"2015-10-06 12:54:37.000000000","message":"+1. Will Change.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-02 13:21:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Realizing SFC (3/5)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch defines two new entities called \u0027flow_classifier\u0027 and"},{"line_number":10,"context_line":"\u0027port_chain\u0027 for realizing service function chaining (SFC)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"7a2fa921_3f1d640f","line":7,"in_reply_to":"7a2fa921_70fcb73e","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":14,"context_line":" - Defined API extensions for Port-Chain resource."},{"line_number":15,"context_line":" - Defined CRUD for Port-Chain resource."},{"line_number":16,"context_line":" - Defined \u0027port_chain\u0027 extension for the \u0027sfc\u0027 plugin."},{"line_number":17,"context_line":" - Applicable Unit tests."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Co-Authored-By: Cathy Zhang \u003ccathy.h.zhang@huawei.com\u003e"},{"line_number":20,"context_line":"Co-Authored-By: vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"3a29b11f_464d4971","line":17,"updated":"2015-10-19 07:52:43.000000000","message":"Outstanding Item:\n - API tests","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"8c9c9d0321c63ad8a39f04841b103df682b6174a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Co-Authored-By: Cathy Zhang \u003ccathy.h.zhang@huawei.com\u003e"},{"line_number":22,"context_line":"Co-Authored-By: Louis Fourie \u003clouis.fourie@huawei.com\u003e"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Conflicts:"},{"line_number":25,"context_line":"\tnetworking_sfc/services/sfc/plugin.py"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I9dabd42d6c57c1042507ab3383ee2a5b75566409"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"7a740942_4a9709ec","line":24,"updated":"2015-12-08 08:43:15.000000000","message":"Conflicts shouldn\u0027t appear.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"}],"networking_sfc/db/flowclassifier_db.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        except AssertionError:"},{"line_number":208,"context_line":"            raise fc_ext.FlowClassifierInUse(id\u003did)"},{"line_number":209,"context_line":"        except fc_ext.FlowClassifierNotFound:"},{"line_number":210,"context_line":"            LOG.error(_(\"Trying to delete a non-existent flow classifier.\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_d0510b64","line":210,"updated":"2015-10-06 06:29:29.000000000","message":"Is this an error which operators should be aware of?","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        except AssertionError:"},{"line_number":208,"context_line":"            raise fc_ext.FlowClassifierInUse(id\u003did)"},{"line_number":209,"context_line":"        except fc_ext.FlowClassifierNotFound:"},{"line_number":210,"context_line":"            LOG.error(_(\"Trying to delete a non-existent flow classifier.\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_dc61e13a","line":210,"in_reply_to":"7a2fa921_2bb002dd","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        except AssertionError:"},{"line_number":208,"context_line":"            raise fc_ext.FlowClassifierInUse(id\u003did)"},{"line_number":209,"context_line":"        except fc_ext.FlowClassifierNotFound:"},{"line_number":210,"context_line":"            LOG.error(_(\"Trying to delete a non-existent flow classifier.\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_2bb002dd","line":210,"in_reply_to":"7a2fa921_d0510b64","updated":"2015-10-06 12:54:37.000000000","message":"I think better to record it as an INFO.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7484657a2a8676ce2d5961a3c6e5e10a2daa00e3","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_1f6f482c","line":157,"updated":"2015-10-07 14:56:21.000000000","message":"\u0027l7_parameters\u0027 is received as a dictionary.\n\nIMO, we can have a direct assignment instead of a loop.\n\nUser Input:\n\nneutron --debug flow-classifier-create --l7-param url\u003dmy_url fc1\n\nReST request received by the server:\n\n2015-09-23 20:17:21.407 DEBUG neutron.api.v2.base [req-46f9f7bd-58fc-45d1-b2ee-f429f9471ce4 demo demo] Request body: {u\u0027flow_classifier\u0027: {u\u0027ip_version\u0027: u\u0027IPv4\u0027, u\u0027l7_parameters\u0027: {u\u0027url\u0027: u\u0027my_url\u0027}, u\u0027name\u0027: u\u0027fc1\u0027}} prepare_request_body /opt/stack/neutron/neutron/api/v2/base.py:645\n\nPlease check the same for service_chain_parameters and chain_parameters.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"b6802d60d581842df7d7eb9519371edcab1b998a","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_39bc24ba","line":157,"in_reply_to":"7a2fa921_18004965","updated":"2015-10-09 20:00:14.000000000","message":"we will address this issue after spliting the flow classifier from the portchain code. can you clarify this and suggest a code snippet","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_470ccaec","line":157,"in_reply_to":"7a2fa921_1f6f482c","updated":"2015-10-09 00:32:41.000000000","message":"actually the dict(flow_classifier.l7_parameters) is somthing like this:\n{\u0027a\u0027: L7Param(keyword\u003d\u0027a\u0027, value\u003d\u0027b\u0027)}. That is the reason I iterate here","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"48d6d36a9e1c683dff64ecf92dd256d0d2220511","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_82ec5b90","line":157,"in_reply_to":"7a2fa921_1f6f482c","updated":"2015-10-07 15:14:38.000000000","message":"vikram: +1","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"1c615a4591099624600712f09b2a3d47f790d505","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_18004965","line":157,"in_reply_to":"7a2fa921_384f5e38","updated":"2015-10-09 16:52:24.000000000","message":"I think the server and cli behave the same. The code here is to generate the l7_parameters as dict. And we take the api input  l7_parameters as dict too. I do not find any conflict in server and cli. The code here is about how to generate the dict from database records. It is all about the implementation in server because sqlalchemy does not support access relationship field as pure dict.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2ae62fa9aeb212811617418e15f1b83f9aa9a75b","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_892750c9","line":157,"in_reply_to":"7a2fa921_470ccaec","updated":"2015-10-09 03:08:50.000000000","message":"@xiaodongwang: In the CLI, it\u0027s implemented as \"u\u0027l7_parameters\u0027: {u\u0027url\u0027: u\u0027my_url\u0027}, u\u0027name\u0027: u\u0027fc1\u0027}} \". I don\u0027t feel receiving as  \u0027keyword\u0027 and \u0027value\u0027 is too generic and could create confusion to the user. Ayways, if you have better suggestion please free to comment @ \"https://review.openstack.org/#/c/210008/13/networking_sfc/cli/flow_classifier.py\"\n\nCurrent Implementation:\n\nparser.add_argument(\u0027--l7-parameters\u0027,\n\t\t     metavar\u003d\u0027type\u003dTYPE[,url\u003dURL_PATH]\u0027,\n\t\t     type\u003dutils.str2dict,\n\t             help\u003d_(\u0027Dictionary of L7-parameters.\n                             Currently, no value is supported for this option.\u0027))\n\nPlease note: We can extend \u0027metavar\u003d\u0027 as and when new keywords are supported.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4de1473ef258697d89c861a269f5bdb14c254a23","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_6af78df5","line":157,"in_reply_to":"7a2fa921_82ec5b90","updated":"2015-10-07 18:25:51.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ac4d8deeb8be87b2ae6122cb742309cca91ace7","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_b18e322c","line":157,"in_reply_to":"7a2fa921_892750c9","updated":"2015-10-09 05:06:21.000000000","message":"The code here is how to retrieve data from database, the api interface is something like this: \u0027l7_parameters\u0027: {\u0027a\u0027: \u0027b\u0027}, the keyword and value is only used internal, not exposed to customer in api.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"428f7c66b09c043f296abaf2f9faa6759126a3a7","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027logical_destination_port\u0027: ("},{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_384f5e38","line":157,"in_reply_to":"7a2fa921_b18e322c","updated":"2015-10-09 08:40:17.000000000","message":"We need to agree upon one convention. Both CLI and Server should be in same.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class L7Parameter(model_base.BASEV2):"},{"line_number":36,"context_line":"    \"\"\"Represents a L7 parameter.\"\"\""},{"line_number":37,"context_line":"    __tablename__ \u003d \u0027flow_classifier_l7_parameters\u0027"},{"line_number":38,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_5e5437c9","line":35,"updated":"2015-10-12 15:18:14.000000000","message":"Why is this class here at all? The spec defines l7_parameters as a dict type field of a Flow Classifier resource, not as a separate resource type of its own.\n\nIf you think we should change the spec, please add a modified version of api.rst to this change with the corresponding spec change to match the code.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class L7Parameter(model_base.BASEV2):"},{"line_number":36,"context_line":"    \"\"\"Represents a L7 parameter.\"\"\""},{"line_number":37,"context_line":"    __tablename__ \u003d \u0027flow_classifier_l7_parameters\u0027"},{"line_number":38,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_9fe3a633","line":35,"in_reply_to":"7a2fa921_5e5437c9","updated":"2015-10-12 16:01:58.000000000","message":"@Paul: IMO, this is internal to implementation. I think it\u0027s not required to be mentioned in the spec.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    __tablename__ \u003d \u0027flow_classifiers\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":55,"context_line":"    ethertype \u003d sa.Column(sa.String(40))"},{"line_number":56,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":57,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":58,"context_line":"    source_port_range_min \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_dee5a7dc","line":55,"updated":"2015-10-12 15:18:14.000000000","message":"I know there\u0027s been some back and forth on this and I\u0027m not opposed to the field name EtherType, but I disagree with the spec and with this code on the type of the field. EtherType is a two octet field. \"IPv4\" is not a valid EtherType, 0x0800 is.\n\nPer [1] it does not appear that there is a well accepted authority on the text equivalents of EtherTypes.\n\n[1] https://en.wikipedia.org/wiki/EtherType","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    __tablename__ \u003d \u0027flow_classifiers\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":55,"context_line":"    ethertype \u003d sa.Column(sa.String(40))"},{"line_number":56,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":57,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":58,"context_line":"    source_port_range_min \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_bfa22299","line":55,"in_reply_to":"7a2fa921_dee5a7dc","updated":"2015-10-12 16:01:58.000000000","message":"Ethertype 0x0800 means IPv4. To me a string is more user friendly. Moreover, the current SG implementation (http://developer.openstack.org/api-ref-networking-v2-ext.html) defines it as a string. Hence, IMO, we can keep it as a string for the time being for having a consistent user experience.\n\nIf we feel this is not correct and needs modification then better we can take this discussion via a separate patch to api.rst.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":55,"context_line":"    ethertype \u003d sa.Column(sa.String(40))"},{"line_number":56,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":57,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":58,"context_line":"    source_port_range_min \u003d sa.Column(sa.Integer)"},{"line_number":59,"context_line":"    source_port_range_max \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_de10475c","line":56,"updated":"2015-10-12 15:18:14.000000000","message":"I don\u0027t like this one as a string either, but at least here I assume we\u0027re using the IANA list as definitive. I\u0027ll be on the lookout for where in the code we translate string to numeric value and make sure we handle all valid protocols. I think it would be preferable to just store the number and handle the strings on input/display via a single Neutron-wide method.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":55,"context_line":"    ethertype \u003d sa.Column(sa.String(40))"},{"line_number":56,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":57,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":58,"context_line":"    source_port_range_min \u003d sa.Column(sa.Integer)"},{"line_number":59,"context_line":"    source_port_range_max \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_5fbaeec1","line":56,"in_reply_to":"7a2fa921_de10475c","updated":"2015-10-12 16:01:58.000000000","message":"ditto.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":55,"context_line":"    ethertype \u003d sa.Column(sa.String(40))"},{"line_number":56,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":57,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":58,"context_line":"    source_port_range_min \u003d sa.Column(sa.Integer)"},{"line_number":59,"context_line":"    source_port_range_max \u003d sa.Column(sa.Integer)"},{"line_number":60,"context_line":"    destination_port_range_min \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_591c516a","line":57,"updated":"2015-10-12 15:18:14.000000000","message":"Please move description up under name so that it matches the order of fields in the spec. I know it doesn\u0027t matter to the computer, but to the reviewer it\u0027s better if the code lines up with the spec.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":55,"context_line":"    ethertype \u003d sa.Column(sa.String(40))"},{"line_number":56,"context_line":"    protocol \u003d sa.Column(sa.String(40))"},{"line_number":57,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":58,"context_line":"    source_port_range_min \u003d sa.Column(sa.Integer)"},{"line_number":59,"context_line":"    source_port_range_max \u003d sa.Column(sa.Integer)"},{"line_number":60,"context_line":"    destination_port_range_min \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_dfc6fe48","line":57,"in_reply_to":"7a2fa921_591c516a","updated":"2015-10-12 16:01:58.000000000","message":"+1","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                flow_classifier[\u0027logical_destination_port\u0027]),"},{"line_number":156,"context_line":"            \u0027l7_parameters\u0027: {"},{"line_number":157,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":158,"context_line":"                for k, param in six.iteritems(flow_classifier.l7_parameters)"},{"line_number":159,"context_line":"            }"},{"line_number":160,"context_line":"        }"},{"line_number":161,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_8baccc8d","line":158,"updated":"2015-10-12 15:18:14.000000000","message":"Is there any particular reason to use iteritems rather than flow_classifier.l3_parameters.values() since you\u0027re not using the key at all? It looks odd to have \"for k, param\" when you\u0027re not using k for anything.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"}],"networking_sfc/db/migration/alembic_migrations/versions/HEADS":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"958eb8a0e4b27dac7f4845fbb1d15789929afaea","unresolved":false,"context_lines":[{"line_number":1,"context_line":"48072cb59133"},{"line_number":2,"context_line":"9768e6a66c9"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"7a2fa921_728a4ac1","line":1,"updated":"2015-10-07 05:41:13.000000000","message":"This file is no more available. Kindly rebase.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"}],"networking_sfc/db/migration/alembic_migrations/versions/liberty/expand/c3e178d4a985_portchain_data_model.py":[{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def upgrade():"},{"line_number":34,"context_line":"    op.create_table("},{"line_number":35,"context_line":"        \u0027port_pair_groups\u0027,"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":37,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003dattr.TENANT_ID_MAX_LEN),"},{"line_number":38,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_d85a6583","line":35,"range":{"start_line":35,"start_character":9,"end_line":35,"end_character":25},"updated":"2015-12-17 14:55:49.000000000","message":"Similar to other groupings of tables in the database, please add a prefix to all SFC tables:\n\n sfc_port_pair_groups\n\nWhen looking at the database, various things are grouped together, e.g. arista_*, ml2_*, nsxv_*, but the SFC tables are scattered around. A prefix will make it clear which tables belong to this subproject.","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def upgrade():"},{"line_number":34,"context_line":"    op.create_table("},{"line_number":35,"context_line":"        \u0027port_pair_groups\u0027,"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":37,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003dattr.TENANT_ID_MAX_LEN),"},{"line_number":38,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_2edd47e0","line":35,"range":{"start_line":35,"start_character":9,"end_line":35,"end_character":25},"in_reply_to":"3a7e1126_d85a6583","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    )"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    op.create_table("},{"line_number":47,"context_line":"        \u0027port_pairs\u0027,"},{"line_number":48,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003dattr.TENANT_ID_MAX_LEN),"},{"line_number":49,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":50,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_78e1f199","line":47,"range":{"start_line":47,"start_character":9,"end_line":47,"end_character":19},"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_port_pairs","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    )"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    op.create_table("},{"line_number":47,"context_line":"        \u0027port_pairs\u0027,"},{"line_number":48,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003dattr.TENANT_ID_MAX_LEN),"},{"line_number":49,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":50,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_4ed8d3ef","line":47,"range":{"start_line":47,"start_character":9,"end_line":47,"end_character":19},"in_reply_to":"3a7e1126_78e1f199","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    )"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    op.create_table("},{"line_number":69,"context_line":"        \u0027port_chains\u0027,"},{"line_number":70,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003dattr.TENANT_ID_MAX_LEN),"},{"line_number":71,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":72,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_d357a600","line":69,"range":{"start_line":69,"start_character":9,"end_line":69,"end_character":20},"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_port_chains","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    )"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    op.create_table("},{"line_number":69,"context_line":"        \u0027port_chains\u0027,"},{"line_number":70,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003dattr.TENANT_ID_MAX_LEN),"},{"line_number":71,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":72,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_eee65fb3","line":69,"range":{"start_line":69,"start_character":9,"end_line":69,"end_character":20},"in_reply_to":"3a7e1126_d357a600","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    )"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    op.create_table("},{"line_number":81,"context_line":"        \u0027chain_group_associations\u0027,"},{"line_number":82,"context_line":"        sa.Column(\u0027portpairgroup_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":83,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":84,"context_line":"        sa.Column(\u0027position\u0027, sa.Integer(), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_93691ec1","line":81,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_chain_group_associations","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    )"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    op.create_table("},{"line_number":81,"context_line":"        \u0027chain_group_associations\u0027,"},{"line_number":82,"context_line":"        sa.Column(\u0027portpairgroup_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":83,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":84,"context_line":"        sa.Column(\u0027position\u0027, sa.Integer(), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_aeeff785","line":81,"in_reply_to":"3a7e1126_93691ec1","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    )"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    op.create_table("},{"line_number":92,"context_line":"        \u0027port_chain_parameters\u0027,"},{"line_number":93,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":94,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":95,"context_line":"        sa.Column(\u0027chain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_d3a56604","line":92,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_port_chain_parameters","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    )"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    op.create_table("},{"line_number":92,"context_line":"        \u0027port_chain_parameters\u0027,"},{"line_number":93,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":94,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":95,"context_line":"        sa.Column(\u0027chain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_cef2836f","line":92,"in_reply_to":"3a7e1126_d3a56604","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    )"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    op.create_table("},{"line_number":101,"context_line":"        \u0027service_function_params\u0027,"},{"line_number":102,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":103,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":104,"context_line":"        sa.Column(\u0027pair_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_b3abfad5","line":101,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_service_function_params","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    )"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    op.create_table("},{"line_number":101,"context_line":"        \u0027service_function_params\u0027,"},{"line_number":102,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":103,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":104,"context_line":"        sa.Column(\u0027pair_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_6ee90f80","line":101,"in_reply_to":"3a7e1126_b3abfad5","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    )"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    op.create_table("},{"line_number":110,"context_line":"        \u0027chain_classifier_associations\u0027,"},{"line_number":111,"context_line":"        sa.Column(\u0027flowclassifier_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":112,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":113,"context_line":"        sa.ForeignKeyConstraint([\u0027flowclassifier_id\u0027],"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_53917698","line":110,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_chain_classifier_associations","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    )"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    op.create_table("},{"line_number":110,"context_line":"        \u0027chain_classifier_associations\u0027,"},{"line_number":111,"context_line":"        sa.Column(\u0027flowclassifier_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":112,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":113,"context_line":"        sa.ForeignKeyConstraint([\u0027flowclassifier_id\u0027],"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_8eec7b90","line":110,"in_reply_to":"3a7e1126_53917698","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"}],"networking_sfc/db/migration/alembic_migrations/versions/mitaka/expand/24fc7241aa5_initial.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"ef77819b4a5102b29206dbfb3b05068057f516d5","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_384c9c41","line":15,"range":{"start_line":15,"start_character":3,"end_line":15,"end_character":34},"updated":"2015-10-05 11:37:45.000000000","message":"You should not change already created migrations. Once it applied it should be changed, so add all this table from a very beginning or create a separate migration.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8c54cdc0a5eb1d06c702d4911bd8d6e3fc8afcda","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_4ddd0f41","line":15,"in_reply_to":"9a1a9d01_384c9c41","updated":"2015-10-05 13:10:16.000000000","message":"Will add a new file.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"66f54d34b9908bb218ac2ad644d0874ba4dc3490","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_2762ee3e","line":15,"in_reply_to":"9a1a9d01_384c9c41","updated":"2015-10-09 01:11:43.000000000","message":"the migration files are all regenerated from beginning since we have many changes in our data models. And currently the old code base is not actively used by customer. I thin regenerating all migrations files may be better to keep the code base as clean as possible.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"66f54d34b9908bb218ac2ad644d0874ba4dc3490","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_4767ea4c","line":15,"in_reply_to":"9a1a9d01_4ddd0f41","updated":"2015-10-09 01:11:43.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"da2543d00dd18b1b0fa376ef7f18ae4aa81a9af9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"7a2fa921_2746794f","updated":"2015-10-08 16:54:23.000000000","message":"This file should not be changed.\nInstead please create a new db migration revision.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"d819e6bc40ed4e2a918c9578c47b56fce517b9c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"7a2fa921_f858ed8b","in_reply_to":"7a2fa921_2746794f","updated":"2015-10-09 17:12:30.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6c802579831e874c44b3c9c7aa1feaaabe10a787","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_9032495e","line":15,"updated":"2015-10-08 06:27:07.000000000","message":"Address PS12 comment.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"b6802d60d581842df7d7eb9519371edcab1b998a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_1c0836d9","line":15,"in_reply_to":"7a2fa921_1885a9cd","updated":"2015-10-09 20:00:14.000000000","message":"The migration scripts will be updated when the API is stable","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ac4d8deeb8be87b2ae6122cb742309cca91ace7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_b11872d4","line":15,"in_reply_to":"7a2fa921_844df53f","updated":"2015-10-09 05:06:21.000000000","message":"If the migration file has already existed, it should add a new file to contain the change of the data model. But I think we can treat this file as the intial setup of the portchain data model, so better replace the old files with the new ones.\nRenaming is OK if you think that filename is more reasonable, but I do not think it has much benefits.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_c71f7a06","line":15,"in_reply_to":"7a2fa921_9032495e","updated":"2015-10-09 00:32:41.000000000","message":"this file is auto generated by migration tools. I do not think it is a good idea to manually modify it. These files are already ignored in tox -epep8","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"428f7c66b09c043f296abaf2f9faa6759126a3a7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_f80246b3","line":15,"in_reply_to":"7a2fa921_b11872d4","updated":"2015-10-09 08:40:17.000000000","message":"Detailed file name is always easier for maintenance.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2ae62fa9aeb212811617418e15f1b83f9aa9a75b","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_844df53f","line":15,"in_reply_to":"7a2fa921_c71f7a06","updated":"2015-10-09 03:08:50.000000000","message":"@xiaodongwang: The comment is about not to modify an existing migration file. Please check \"Ann Kamyshnikova\" comment in PS12.\n\nTwo solutions can be possible:\n\n1. Add a new file containing the proposed changes.\n\n2. Rename \"24fc7241aa5_initial.py\" to \"24fc7241aa5_portchain_data_model.py\". I believe this would be okay as we are still in the development phase and the code is not yet released.\n\n\nPlease note this file is being added as part of \"https://review.openstack.org/#/c/227074/\"","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"d819e6bc40ed4e2a918c9578c47b56fce517b9c9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: 24fc7241aa5"},{"line_number":18,"context_line":"Revises: start_networking_sfc"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_1885a9cd","line":15,"in_reply_to":"7a2fa921_f80246b3","updated":"2015-10-09 17:12:30.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":80,"context_line":"    )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    op.create_table("},{"line_number":83,"context_line":"        \u0027chain_group_associations\u0027,"},{"line_number":84,"context_line":"        sa.Column(\u0027portgroup_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":85,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_4b623418","line":82,"updated":"2015-10-12 15:18:14.000000000","message":"Where is this coming from? I\u0027m comparing against [1] and I don\u0027t see \"chain_group_associations\" anywhere.\n\n[1] http://docs.openstack.org/developer/networking-sfc/api.html","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":80,"context_line":"    )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    op.create_table("},{"line_number":83,"context_line":"        \u0027chain_group_associations\u0027,"},{"line_number":84,"context_line":"        sa.Column(\u0027portgroup_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":85,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_df3b5e37","line":82,"in_reply_to":"7a2fa921_4b623418","updated":"2015-10-12 16:01:58.000000000","message":"AFAIK, API doc only contains the API and data model which are exposed to the user. We don.t need to mention about additional internal DB model which we need for implementation..","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        sa.PrimaryKeyConstraint(\u0027portgroup_id\u0027, \u0027portchain_id\u0027)"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    op.create_table("},{"line_number":94,"context_line":"        \u0027port_chain_parameters\u0027,"},{"line_number":95,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":96,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_6e9ffeb4","line":93,"updated":"2015-10-12 15:18:14.000000000","message":"I\u0027m fine with a change of the spec document if desired, but right now this table is out of sync with the current spec. The spec has chain_parameters as a dict field in the Port Chain resource. There is no Port Chain Parameter resource.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        sa.PrimaryKeyConstraint(\u0027portgroup_id\u0027, \u0027portchain_id\u0027)"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    op.create_table("},{"line_number":94,"context_line":"        \u0027port_chain_parameters\u0027,"},{"line_number":95,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":96,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_7f1faab7","line":93,"in_reply_to":"7a2fa921_6e9ffeb4","updated":"2015-10-12 16:01:58.000000000","message":"ditto","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        sa.PrimaryKeyConstraint(\u0027keyword\u0027, \u0027chain_id\u0027)"},{"line_number":100,"context_line":"    )"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    op.create_table("},{"line_number":103,"context_line":"        \u0027service_function_params\u0027,"},{"line_number":104,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":105,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_ee922e9f","line":102,"updated":"2015-10-12 15:18:14.000000000","message":"Similar comment as above. If desired to change the spec, add a modified api.rst to this commit, but right now the spec says service_function_parameters is a dict field in the Port Pair resource, not a separate resource.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        sa.PrimaryKeyConstraint(\u0027keyword\u0027, \u0027chain_id\u0027)"},{"line_number":100,"context_line":"    )"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    op.create_table("},{"line_number":103,"context_line":"        \u0027service_function_params\u0027,"},{"line_number":104,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":105,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_5f7d0ee6","line":102,"in_reply_to":"7a2fa921_ee922e9f","updated":"2015-10-12 16:01:58.000000000","message":"ditto","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"5a2ca52d_bff06468","updated":"2015-10-16 01:16:30.000000000","message":"A new db migration script should be created instead of changing the existing one.","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                  nullable\u003dTrue),"},{"line_number":56,"context_line":"        sa.Column(\u0027ingress\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":57,"context_line":"        sa.Column(\u0027egress\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":58,"context_line":"        sa.Column(\u0027portgroup_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":59,"context_line":"        sa.ForeignKeyConstraint([\u0027egress\u0027], [\u0027ports.id\u0027],"},{"line_number":60,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":61,"context_line":"        sa.ForeignKeyConstraint([\u0027ingress\u0027], [\u0027ports.id\u0027],"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_ea12d808","line":58,"updated":"2015-10-14 22:39:24.000000000","message":"portgroup_id -\u003e portpairgroup_id","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":61,"context_line":"        sa.ForeignKeyConstraint([\u0027ingress\u0027], [\u0027ports.id\u0027],"},{"line_number":62,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":63,"context_line":"        sa.ForeignKeyConstraint([\u0027portgroup_id\u0027], [\u0027port_pair_groups.id\u0027],"},{"line_number":64,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":65,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":66,"context_line":"        sa.UniqueConstraint(\u0027ingress\u0027, \u0027egress\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_8afa44bc","line":63,"updated":"2015-10-14 22:39:24.000000000","message":"portgroup_id -\u003e portpairgroup_id","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"dbf5d54e89103dccd28deaf6f20bc685a65e46fa","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":65,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":66,"context_line":"        sa.UniqueConstraint(\u0027ingress\u0027, \u0027egress\u0027,"},{"line_number":67,"context_line":"                            name\u003d\u0027uniq_port_pairs0ingress0egress\u0027)"},{"line_number":68,"context_line":"    )"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_adec23c8","line":67,"updated":"2015-11-20 17:26:41.000000000","message":"uniq_port_pairs0ingress0egress \u003d\u003d \u003e is it typo ?","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"}],"networking_sfc/db/migration/alembic_migrations/versions/mitaka/expand/9768e6a66c9_flowclassifier_data_model.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d2aa556bfbe9213015f488c7bc8c6b7ecd312452","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003dattr.NAME_MAX_LEN), nullable\u003dTrue),"},{"line_number":40,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027protocol\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003dattr.DESCRIPTION_MAX_LEN),"},{"line_number":43,"context_line":"                  nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_dbdbab7a","line":40,"updated":"2015-10-09 17:07:19.000000000","message":"change \u0027ip_version\u0027 \u003d\u003d\u003e \u0027ethertype\u0027","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"71f317c8bb990e96cd6a88477928b72c6aa2c88f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003dattr.NAME_MAX_LEN), nullable\u003dTrue),"},{"line_number":40,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027protocol\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003dattr.DESCRIPTION_MAX_LEN),"},{"line_number":43,"context_line":"                  nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_fb58e78b","line":40,"in_reply_to":"7a2fa921_dbdbab7a","updated":"2015-10-09 17:18:12.000000000","message":"can we keep the name unchanged in this cl? We have rename the name many times and there are a lot of pain of renaming. We should tests all the code and all developers should merge their code.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9a6d3008d1dc9d315f53844d50db38f3eb1ef608","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003dattr.NAME_MAX_LEN), nullable\u003dTrue),"},{"line_number":40,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027protocol\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003dattr.DESCRIPTION_MAX_LEN),"},{"line_number":43,"context_line":"                  nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_ef4faf68","line":40,"in_reply_to":"7a2fa921_fb58e78b","updated":"2015-10-10 07:03:10.000000000","message":"I already reworked for this but miss to change here. Please note we have agreed on this after the review via a separate patch. I believe we got to change this.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d2aa556bfbe9213015f488c7bc8c6b7ecd312452","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        sa.Column(\u0027source_ip_prefix\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027destination_ip_prefix\u0027, sa.String(length\u003d255),"},{"line_number":50,"context_line":"                  nullable\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027source_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":52,"context_line":"        sa.Column(\u0027destination_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":53,"context_line":"        sa.ForeignKeyConstraint([\u0027destination_port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":54,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_5bd6bb4f","line":51,"updated":"2015-10-09 17:07:19.000000000","message":"\u0027source_port_id\u0027 \u003d\u003d\u003e \u0027logical_source_port\u0027","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"71f317c8bb990e96cd6a88477928b72c6aa2c88f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        sa.Column(\u0027source_ip_prefix\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027destination_ip_prefix\u0027, sa.String(length\u003d255),"},{"line_number":50,"context_line":"                  nullable\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027source_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":52,"context_line":"        sa.Column(\u0027destination_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":53,"context_line":"        sa.ForeignKeyConstraint([\u0027destination_port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":54,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_9bdf73d5","line":51,"in_reply_to":"7a2fa921_5bd6bb4f","updated":"2015-10-09 17:18:12.000000000","message":"ditto","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9a6d3008d1dc9d315f53844d50db38f3eb1ef608","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        sa.Column(\u0027source_ip_prefix\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027destination_ip_prefix\u0027, sa.String(length\u003d255),"},{"line_number":50,"context_line":"                  nullable\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027source_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":52,"context_line":"        sa.Column(\u0027destination_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":53,"context_line":"        sa.ForeignKeyConstraint([\u0027destination_port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":54,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_0f530b18","line":51,"in_reply_to":"7a2fa921_9bdf73d5","updated":"2015-10-10 07:03:10.000000000","message":"Ditto","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d2aa556bfbe9213015f488c7bc8c6b7ecd312452","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        sa.Column(\u0027destination_ip_prefix\u0027, sa.String(length\u003d255),"},{"line_number":50,"context_line":"                  nullable\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027source_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":52,"context_line":"        sa.Column(\u0027destination_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":53,"context_line":"        sa.ForeignKeyConstraint([\u0027destination_port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":54,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":55,"context_line":"        sa.ForeignKeyConstraint([\u0027source_port_id\u0027], [\u0027ports.id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_3b3adf99","line":52,"updated":"2015-10-09 17:07:19.000000000","message":"\u0027destination_port_id\u0027 \u003d\u003d\u003e \u0027logical_destination_port\u0027","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"71f317c8bb990e96cd6a88477928b72c6aa2c88f","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        sa.Column(\u0027destination_ip_prefix\u0027, sa.String(length\u003d255),"},{"line_number":50,"context_line":"                  nullable\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027source_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":52,"context_line":"        sa.Column(\u0027destination_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":53,"context_line":"        sa.ForeignKeyConstraint([\u0027destination_port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":54,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":55,"context_line":"        sa.ForeignKeyConstraint([\u0027source_port_id\u0027], [\u0027ports.id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_5bf47b59","line":52,"in_reply_to":"7a2fa921_3b3adf99","updated":"2015-10-09 17:18:12.000000000","message":"ditto","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"b6802d60d581842df7d7eb9519371edcab1b998a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        sa.Column(\u0027destination_ip_prefix\u0027, sa.String(length\u003d255),"},{"line_number":50,"context_line":"                  nullable\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027source_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":52,"context_line":"        sa.Column(\u0027destination_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":53,"context_line":"        sa.ForeignKeyConstraint([\u0027destination_port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":54,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":55,"context_line":"        sa.ForeignKeyConstraint([\u0027source_port_id\u0027], [\u0027ports.id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_5c022eb5","line":52,"in_reply_to":"7a2fa921_5bf47b59","updated":"2015-10-09 20:00:14.000000000","message":"This scripts will be updated when the API is stable","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9a6d3008d1dc9d315f53844d50db38f3eb1ef608","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        sa.Column(\u0027destination_ip_prefix\u0027, sa.String(length\u003d255),"},{"line_number":50,"context_line":"                  nullable\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027source_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":52,"context_line":"        sa.Column(\u0027destination_port_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":53,"context_line":"        sa.ForeignKeyConstraint([\u0027destination_port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":54,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":55,"context_line":"        sa.ForeignKeyConstraint([\u0027source_port_id\u0027], [\u0027ports.id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_cf58b333","line":52,"in_reply_to":"7a2fa921_5c022eb5","updated":"2015-10-10 07:03:10.000000000","message":"Ditto","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003dattr.NAME_MAX_LEN), nullable\u003dTrue),"},{"line_number":40,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027protocol\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003dattr.DESCRIPTION_MAX_LEN),"},{"line_number":43,"context_line":"                  nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_eef54ecb","line":40,"updated":"2015-10-12 15:18:14.000000000","message":"This should be EtherType (and I still don\u0027t like it being a string, but that\u0027s a different argument)","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003dattr.NAME_MAX_LEN), nullable\u003dTrue),"},{"line_number":40,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027protocol\u0027, sa.String(length\u003d40), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003dattr.DESCRIPTION_MAX_LEN),"},{"line_number":43,"context_line":"                  nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_df503e61","line":40,"in_reply_to":"7a2fa921_eef54ecb","updated":"2015-10-12 16:01:58.000000000","message":"PS13 comments are un-addressed.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    op.create_table("},{"line_number":70,"context_line":"        \u0027chain_classifier_asscociations\u0027,"},{"line_number":71,"context_line":"        sa.Column(\u0027flowclassifier_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":72,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":73,"context_line":"        sa.ForeignKeyConstraint([\u0027flowclassifier_id\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_4ed24236","line":70,"updated":"2015-10-12 15:18:14.000000000","message":"I don\u0027t know what to check this against. It\u0027s not in the spec. Also associations is misspelled.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    op.create_table("},{"line_number":70,"context_line":"        \u0027chain_classifier_asscociations\u0027,"},{"line_number":71,"context_line":"        sa.Column(\u0027flowclassifier_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":72,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":73,"context_line":"        sa.ForeignKeyConstraint([\u0027flowclassifier_id\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_3fc61217","line":70,"in_reply_to":"7a2fa921_4ed24236","updated":"2015-10-12 16:01:58.000000000","message":"AFAIK, API doc only contains the API and data model which are exposed to the user. We don.t need to mention about additional internal DB model which we need for implementation..","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"}],"networking_sfc/db/migration/alembic_migrations/versions/mitaka/expand/c3e178d4a985_portchain_data_model.py":[{"author":{"_account_id":16788,"name":"Ramanjaneya Reddy Palleti","email":"ramanjaneya.palleti@huawei.com","username":"Ramanjaneya"},"change_message_id":"3d487c5220db90cfd3e85c0e38b8c739aee3ac9c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":51,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003dattr.NAME_MAX_LEN), nullable\u003dTrue),"},{"line_number":52,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003dattr.DESCRIPTION_MAX_LEN),"},{"line_number":53,"context_line":"                  nullable\u003dTrue),"},{"line_number":54,"context_line":"        sa.Column(\u0027ingress\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":55,"context_line":"        sa.Column(\u0027egress\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":56,"context_line":"        sa.Column(\u0027portpairgroup_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_00889ce6","line":53,"updated":"2015-10-19 04:58:10.000000000","message":"nullable--\u003eFalse","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":16788,"name":"Ramanjaneya Reddy Palleti","email":"ramanjaneya.palleti@huawei.com","username":"Ramanjaneya"},"change_message_id":"3d487c5220db90cfd3e85c0e38b8c739aee3ac9c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                  nullable\u003dTrue),"},{"line_number":54,"context_line":"        sa.Column(\u0027ingress\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":55,"context_line":"        sa.Column(\u0027egress\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":56,"context_line":"        sa.Column(\u0027portpairgroup_id\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":57,"context_line":"        sa.ForeignKeyConstraint([\u0027egress\u0027], [\u0027ports.id\u0027],"},{"line_number":58,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":59,"context_line":"        sa.ForeignKeyConstraint([\u0027ingress\u0027], [\u0027ports.id\u0027],"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_a06d2834","line":56,"updated":"2015-10-19 04:58:10.000000000","message":"nullable--\u003eFalse","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":16788,"name":"Ramanjaneya Reddy Palleti","email":"ramanjaneya.palleti@huawei.com","username":"Ramanjaneya"},"change_message_id":"3d487c5220db90cfd3e85c0e38b8c739aee3ac9c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        \u0027chain_group_associations\u0027,"},{"line_number":82,"context_line":"        sa.Column(\u0027portpairgroup_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":83,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":84,"context_line":"        sa.Column(\u0027position\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":85,"context_line":"        sa.ForeignKeyConstraint([\u0027portchain_id\u0027], [\u0027port_chains.id\u0027], ),"},{"line_number":86,"context_line":"        sa.ForeignKeyConstraint([\u0027portpairgroup_id\u0027], [\u0027port_pair_groups.id\u0027],"},{"line_number":87,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_407e94e5","line":84,"updated":"2015-10-19 04:58:10.000000000","message":"nullable--\u003efalse","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":16788,"name":"Ramanjaneya Reddy Palleti","email":"ramanjaneya.palleti@huawei.com","username":"Ramanjaneya"},"change_message_id":"3d487c5220db90cfd3e85c0e38b8c739aee3ac9c","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    op.create_table("},{"line_number":92,"context_line":"        \u0027port_chain_parameters\u0027,"},{"line_number":93,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":94,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":95,"context_line":"        sa.Column(\u0027chain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":96,"context_line":"        sa.ForeignKeyConstraint([\u0027chain_id\u0027], [\u0027port_chains.id\u0027], ),"},{"line_number":97,"context_line":"        sa.PrimaryKeyConstraint(\u0027keyword\u0027, \u0027chain_id\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_801d8cbf","line":94,"updated":"2015-10-19 04:58:10.000000000","message":"nullable--\u003efalse","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":16788,"name":"Ramanjaneya Reddy Palleti","email":"ramanjaneya.palleti@huawei.com","username":"Ramanjaneya"},"change_message_id":"3d487c5220db90cfd3e85c0e38b8c739aee3ac9c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    op.create_table("},{"line_number":101,"context_line":"        \u0027service_function_params\u0027,"},{"line_number":102,"context_line":"        sa.Column(\u0027keyword\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":103,"context_line":"        sa.Column(\u0027value\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":104,"context_line":"        sa.Column(\u0027pair_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":105,"context_line":"        sa.ForeignKeyConstraint([\u0027pair_id\u0027], [\u0027port_pairs.id\u0027], ),"},{"line_number":106,"context_line":"        sa.PrimaryKeyConstraint(\u0027keyword\u0027, \u0027pair_id\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_401774a3","line":103,"updated":"2015-10-19 04:58:10.000000000","message":"nullable\u003dTrue --\u003eFalse","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"ae2535551b1d88cf2c6eeeabb0c16fbca405cf55","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: c3e178d4a985"},{"line_number":18,"context_line":"Revises: 9768e6a66c9"},{"line_number":19,"context_line":"Create Date: 2015-09-11 11:37:19.349951"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba8a016a_4e977d90","line":18,"updated":"2015-11-17 15:44:11.000000000","message":"This revision ID is currently not available after git review -d 238428 - alembic is not able to upgrade the DB without it. Please update the changes to make this stackable.","commit_id":"962c1befabf60387b2f32bbc594a24503699cd47"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"727a6d34d5811ce1d23b5c413295b30eac4c4710","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: c3e178d4a985"},{"line_number":18,"context_line":"Revises: 9768e6a66c9"},{"line_number":19,"context_line":"Create Date: 2015-09-11 11:37:19.349951"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba8a016a_80624215","line":18,"in_reply_to":"ba8a016a_4e977d90","updated":"2015-11-20 22:59:13.000000000","message":"Can you elaborate on the problem here","commit_id":"962c1befabf60387b2f32bbc594a24503699cd47"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"4ca31efd8f19aca13aa690f631731defc13d23ae","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"Defining Port Chain data-model."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Revision ID: c3e178d4a985"},{"line_number":18,"context_line":"Revises: 9768e6a66c9"},{"line_number":19,"context_line":"Create Date: 2015-09-11 11:37:19.349951"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba8a016a_237fb967","line":18,"in_reply_to":"ba8a016a_80624215","updated":"2015-11-23 11:28:52.000000000","message":"This patch is and was okay. It\u0027s just the dependency graph that was incorrect. Patch 238428, like this one, also depended on the revision ID 9768e6a66c9 but it didn\u0027t have that revision ID. The revision ID was in another git history, consequently Alembic DB migration failed.\n\nI see that now, after doing git review -d 238428, both c3e178d4a985 and 9768e6a66c9 revisions are inside /networking-sfc/networking_sfc/db/migration/alembic_migrations/versions/mitaka/expand, so it seems the problem has been fixed!","commit_id":"962c1befabf60387b2f32bbc594a24503699cd47"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4373f865eb71fd9fec057689a23f3bc2bc08c357","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# revision identifiers, used by Alembic."},{"line_number":29,"context_line":"revision \u003d \u0027c3e178d4a985\u0027"},{"line_number":30,"context_line":"down_revision \u003d \u00279768e6a66c9\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def upgrade():"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_5397cceb","line":30,"updated":"2015-12-08 06:44:56.000000000","message":"I believe \"https://review.openstack.org/#/c/233858/\" should be the start of the review chain. \n\nPlease note \" down_revision \u003d \u00279768e6a66c9\u0027 \" is being defined there.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"eef8b7dc423db31bad35e366ef8f5d1a92cb6895","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    )"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    op.create_table("},{"line_number":110,"context_line":"        \u0027chain_classifier_asscociations\u0027,"},{"line_number":111,"context_line":"        sa.Column(\u0027flowclassifier_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":112,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":113,"context_line":"        sa.ForeignKeyConstraint([\u0027flowclassifier_id\u0027],"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_e71967d8","line":110,"updated":"2015-12-07 20:49:11.000000000","message":"Table name typo.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11907,"name":"cathy","email":"cathy.h.zhang@huawei.com","username":"cathy"},"change_message_id":"7cf0bd766b67af50aee21ef208f9297adfe97dbe","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    )"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    op.create_table("},{"line_number":110,"context_line":"        \u0027chain_classifier_asscociations\u0027,"},{"line_number":111,"context_line":"        sa.Column(\u0027flowclassifier_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":112,"context_line":"        sa.Column(\u0027portchain_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":113,"context_line":"        sa.ForeignKeyConstraint([\u0027flowclassifier_id\u0027],"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_780af87a","line":110,"in_reply_to":"7a740942_e71967d8","updated":"2015-12-07 21:50:43.000000000","message":"will correct.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"}],"networking_sfc/db/portchain_db.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ChainParam(model_base.BASEV2):"},{"line_number":41,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027port_chain_params\u0027"},{"line_number":43,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_70db571c","line":40,"updated":"2015-10-06 06:29:29.000000000","message":"-\u003e ChainParamaeter","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ChainParam(model_base.BASEV2):"},{"line_number":41,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027port_chain_params\u0027"},{"line_number":43,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_1ce759b1","line":40,"in_reply_to":"7a2fa921_70db571c","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ChainParam(model_base.BASEV2):"},{"line_number":41,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027port_chain_params\u0027"},{"line_number":43,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_6bdd9a13","line":40,"in_reply_to":"7a2fa921_70db571c","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ChainParam(model_base.BASEV2):"},{"line_number":41,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027port_chain_params\u0027"},{"line_number":43,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"},{"line_number":44,"context_line":"    value \u003d sa.Column(sa.String(255))"},{"line_number":45,"context_line":"    chain_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_50097b94","line":42,"updated":"2015-10-06 06:29:29.000000000","message":"-\u003e port_chain_parameters\n\nI think full spelling is better.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ChainParam(model_base.BASEV2):"},{"line_number":41,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027port_chain_params\u0027"},{"line_number":43,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"},{"line_number":44,"context_line":"    value \u003d sa.Column(sa.String(255))"},{"line_number":45,"context_line":"    chain_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_bc7185e2","line":42,"in_reply_to":"7a2fa921_50097b94","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ChainParam(model_base.BASEV2):"},{"line_number":41,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027port_chain_params\u0027"},{"line_number":43,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"},{"line_number":44,"context_line":"    value \u003d sa.Column(sa.String(255))"},{"line_number":45,"context_line":"    chain_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_2be7a2e5","line":42,"in_reply_to":"7a2fa921_50097b94","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    def _validate_port_pair_groups(self, context, pg_ids):"},{"line_number":192,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":193,"context_line":"            query \u003d self._model_query(context, PortChain)"},{"line_number":194,"context_line":"            for port_chain_db in query.all():"},{"line_number":195,"context_line":"                pc_pg_ids \u003d ["},{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_f034474b","line":194,"updated":"2015-10-06 06:29:29.000000000","message":".all() is necessary? \"query\" is a generator, so I think the following works:\n\n  for port_chain_db in query:","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    def _validate_port_pair_groups(self, context, pg_ids):"},{"line_number":192,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":193,"context_line":"            query \u003d self._model_query(context, PortChain)"},{"line_number":194,"context_line":"            for port_chain_db in query.all():"},{"line_number":195,"context_line":"                pc_pg_ids \u003d ["},{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_7c5bed54","line":194,"in_reply_to":"7a2fa921_f034474b","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    def _validate_port_pair_groups(self, context, pg_ids):"},{"line_number":192,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":193,"context_line":"            query \u003d self._model_query(context, PortChain)"},{"line_number":194,"context_line":"            for port_chain_db in query.all():"},{"line_number":195,"context_line":"                pc_pg_ids \u003d ["},{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_4b03fe73","line":194,"in_reply_to":"7a2fa921_f034474b","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":198,"context_line":"                ]"},{"line_number":199,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"},{"line_number":200,"context_line":"                    raise ext_pc.PortChainInvalidPortPairGroups("},{"line_number":201,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_d0234b04","line":199,"updated":"2015-10-06 06:29:29.000000000","message":"If the orders of members of these list are different, this condition will be False. Is it an expected behavior?\nOtherwise, you need to use set().","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"66f54d34b9908bb218ac2ad644d0874ba4dc3490","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":198,"context_line":"                ]"},{"line_number":199,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"},{"line_number":200,"context_line":"                    raise ext_pc.PortChainInvalidPortPairGroups("},{"line_number":201,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_67d9c621","line":199,"in_reply_to":"7a2fa921_d0234b04","updated":"2015-10-09 01:11:43.000000000","message":"Yes, the order of port pair group is important. the same set of port pair groups but different order can be used by different port chain.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":313,"context_line":"                context.session.delete(pc)"},{"line_number":314,"context_line":"        except ext_pc.PortChainNotFound:"},{"line_number":315,"context_line":"            LOG.error(_(\"Delete a port chain that does not exist!\"))"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    @log_helpers.log_method_call"},{"line_number":318,"context_line":"    def update_port_chain(self, context, id, port_chain):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_b06d6f34","line":315,"updated":"2015-10-06 06:29:29.000000000","message":"Is it an error which operators should take care of?\nIf this can occur as a result of user operation, it should be DEBUG (or INFO).","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":313,"context_line":"                context.session.delete(pc)"},{"line_number":314,"context_line":"        except ext_pc.PortChainNotFound:"},{"line_number":315,"context_line":"            LOG.error(_(\"Delete a port chain that does not exist!\"))"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    @log_helpers.log_method_call"},{"line_number":318,"context_line":"    def update_port_chain(self, context, id, port_chain):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_dc324110","line":315,"in_reply_to":"7a2fa921_b06d6f34","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":313,"context_line":"                context.session.delete(pc)"},{"line_number":314,"context_line":"        except ext_pc.PortChainNotFound:"},{"line_number":315,"context_line":"            LOG.error(_(\"Delete a port chain that does not exist!\"))"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    @log_helpers.log_method_call"},{"line_number":318,"context_line":"    def update_port_chain(self, context, id, port_chain):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_4b3a1e38","line":315,"in_reply_to":"7a2fa921_b06d6f34","updated":"2015-10-06 12:54:37.000000000","message":"I think better to record it as an INFO.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":423,"context_line":"                context.session.delete(pp)"},{"line_number":424,"context_line":"        except ext_pc.PortPairNotFound:"},{"line_number":425,"context_line":"            LOG.error(_(\"Delete a port pair that does not exist!\"))"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def _make_port_pair_group_dict(self, port_pair_group, fields\u003dNone):"},{"line_number":428,"context_line":"        res \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_d06a6b1a","line":425,"updated":"2015-10-06 06:29:29.000000000","message":"Same as the above comment on LOG.error.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":423,"context_line":"                context.session.delete(pp)"},{"line_number":424,"context_line":"        except ext_pc.PortPairNotFound:"},{"line_number":425,"context_line":"            LOG.error(_(\"Delete a port pair that does not exist!\"))"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def _make_port_pair_group_dict(self, port_pair_group, fields\u003dNone):"},{"line_number":428,"context_line":"        res \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_fc35bdf6","line":425,"in_reply_to":"7a2fa921_d06a6b1a","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":423,"context_line":"                context.session.delete(pp)"},{"line_number":424,"context_line":"        except ext_pc.PortPairNotFound:"},{"line_number":425,"context_line":"            LOG.error(_(\"Delete a port pair that does not exist!\"))"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def _make_port_pair_group_dict(self, port_pair_group, fields\u003dNone):"},{"line_number":428,"context_line":"        res \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_ab2092f8","line":425,"in_reply_to":"7a2fa921_d06a6b1a","updated":"2015-10-06 12:54:37.000000000","message":"I think better to record it as an INFO.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":519,"context_line":"                context.session.delete(pg)"},{"line_number":520,"context_line":"        except ext_pc.PortPairGroupNotFound:"},{"line_number":521,"context_line":"            LOG.error(_(\"Delete a port pair group that does not exist!\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_7077d702","line":521,"updated":"2015-10-06 06:29:29.000000000","message":"Same as the above comment on LOG.error.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":519,"context_line":"                context.session.delete(pg)"},{"line_number":520,"context_line":"        except ext_pc.PortPairGroupNotFound:"},{"line_number":521,"context_line":"            LOG.error(_(\"Delete a port pair group that does not exist!\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_5c2711ca","line":521,"in_reply_to":"7a2fa921_7077d702","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":519,"context_line":"                context.session.delete(pg)"},{"line_number":520,"context_line":"        except ext_pc.PortPairGroupNotFound:"},{"line_number":521,"context_line":"            LOG.error(_(\"Delete a port pair group that does not exist!\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_8b7ef6e2","line":521,"in_reply_to":"7a2fa921_7077d702","updated":"2015-10-06 12:54:37.000000000","message":"I think better to record it as an INFO.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7484657a2a8676ce2d5961a3c6e5e10a2daa00e3","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":198,"context_line":"                ]"},{"line_number":199,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"},{"line_number":200,"context_line":"                    raise ext_pc.PortChainInvalidPortPairGroups("},{"line_number":201,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_1fd3c805","line":199,"updated":"2015-10-07 14:56:21.000000000","message":"Address PS12 comment.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4de1473ef258697d89c861a269f5bdb14c254a23","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":198,"context_line":"                ]"},{"line_number":199,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"},{"line_number":200,"context_line":"                    raise ext_pc.PortChainInvalidPortPairGroups("},{"line_number":201,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_2a93d5a4","line":199,"in_reply_to":"7a2fa921_1fd3c805","updated":"2015-10-07 18:25:51.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"b6802d60d581842df7d7eb9519371edcab1b998a","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":198,"context_line":"                ]"},{"line_number":199,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"},{"line_number":200,"context_line":"                    raise ext_pc.PortChainInvalidPortPairGroups("},{"line_number":201,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_3c2c1298","line":199,"in_reply_to":"7a2fa921_1fd3c805","updated":"2015-10-09 20:00:14.000000000","message":"This has been addressed in the response for PS12.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ChainParameter(model_base.BASEV2):"},{"line_number":41,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027port_chain_parameters\u0027"},{"line_number":43,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_ee78ee2d","line":40,"updated":"2015-10-12 15:18:14.000000000","message":"Same comment as elsewhere, the current spec doesn\u0027t list this as an independent resource.","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2f0d3c4ca670f64d9b6e6ecbf7d16ae072486f05","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ChainParameter(model_base.BASEV2):"},{"line_number":41,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027port_chain_parameters\u0027"},{"line_number":43,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_bfda22e8","line":40,"in_reply_to":"7a2fa921_ee78ee2d","updated":"2015-10-12 16:01:58.000000000","message":"AFAIK, API doc only contains the API and data model which are exposed to the user. We don.t need to mention about additional internal DB model which we need for implementation..","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"46a6e2f4315ee98720605c35a8197ac0813b107d","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":198,"context_line":"                ]"},{"line_number":199,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"},{"line_number":200,"context_line":"                    raise ext_pc.PortChainInvalidPortPairGroups("},{"line_number":201,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_a168c788","line":199,"updated":"2015-10-12 15:18:14.000000000","message":"Sorry, I don\u0027t really follow the logic here. What does this scenario represent? Are we checking that pg_ids isn\u0027t a duplicate of what\u0027s already in the database?","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        sa.ForeignKey(\u0027ports.id\u0027, ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":98,"context_line":"        nullable\u003dFalse)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    portgroup_id \u003d sa.Column("},{"line_number":101,"context_line":"        sa.String(36),"},{"line_number":102,"context_line":"        sa.ForeignKey(\u0027port_pair_groups.id\u0027, ondelete\u003d\u0027RESTRICT\u0027))"},{"line_number":103,"context_line":"    service_function_parameters \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_6aeec8b5","line":100,"updated":"2015-10-14 22:39:24.000000000","message":"portgroup_id -\u003e portpairgroup_id","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        sa.ForeignKey(\u0027ports.id\u0027, ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":98,"context_line":"        nullable\u003dFalse)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    portgroup_id \u003d sa.Column("},{"line_number":101,"context_line":"        sa.String(36),"},{"line_number":102,"context_line":"        sa.ForeignKey(\u0027port_pair_groups.id\u0027, ondelete\u003d\u0027RESTRICT\u0027))"},{"line_number":103,"context_line":"    service_function_parameters \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_bf2dc4ff","line":100,"in_reply_to":"5a2ca52d_6aeec8b5","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"class ChainGroupAssoc(model_base.BASEV2):"},{"line_number":118,"context_line":"    __tablename__ \u003d \u0027chain_group_associations\u0027"},{"line_number":119,"context_line":"    portgroup_id \u003d sa.Column("},{"line_number":120,"context_line":"        sa.String(36),"},{"line_number":121,"context_line":"        sa.ForeignKey(\u0027port_pair_groups.id\u0027, ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":122,"context_line":"        primary_key\u003dTrue, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_4a4aecc6","line":119,"updated":"2015-10-14 22:39:24.000000000","message":"portgroup_id -\u003e portpairgroup_id","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"class ChainGroupAssoc(model_base.BASEV2):"},{"line_number":118,"context_line":"    __tablename__ \u003d \u0027chain_group_associations\u0027"},{"line_number":119,"context_line":"    portgroup_id \u003d sa.Column("},{"line_number":120,"context_line":"        sa.String(36),"},{"line_number":121,"context_line":"        sa.ForeignKey(\u0027port_pair_groups.id\u0027, ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":122,"context_line":"        primary_key\u003dTrue, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_9f38083f","line":119,"in_reply_to":"5a2ca52d_4a4aecc6","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027tenant_id\u0027: port_chain[\u0027tenant_id\u0027],"},{"line_number":175,"context_line":"            \u0027description\u0027: port_chain[\u0027description\u0027],"},{"line_number":176,"context_line":"            \u0027port_pair_groups\u0027: ["},{"line_number":177,"context_line":"                assoc[\u0027portgroup_id\u0027]"},{"line_number":178,"context_line":"                for assoc in port_chain[\u0027chain_group_associations\u0027]"},{"line_number":179,"context_line":"            ],"},{"line_number":180,"context_line":"            \u0027flow_classifiers\u0027: ["}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_aa22a0ff","line":177,"updated":"2015-10-14 22:39:24.000000000","message":"portgroup_id -\u003e portpairgroup_id","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027tenant_id\u0027: port_chain[\u0027tenant_id\u0027],"},{"line_number":175,"context_line":"            \u0027description\u0027: port_chain[\u0027description\u0027],"},{"line_number":176,"context_line":"            \u0027port_pair_groups\u0027: ["},{"line_number":177,"context_line":"                assoc[\u0027portgroup_id\u0027]"},{"line_number":178,"context_line":"                for assoc in port_chain[\u0027chain_group_associations\u0027]"},{"line_number":179,"context_line":"            ],"},{"line_number":180,"context_line":"            \u0027flow_classifiers\u0027: ["}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_3f4214af","line":177,"in_reply_to":"5a2ca52d_aa22a0ff","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            ],"},{"line_number":184,"context_line":"            \u0027chain_parameters\u0027: {"},{"line_number":185,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":186,"context_line":"                for k, param in six.iteritems(port_chain[\u0027chain_parameters\u0027])"},{"line_number":187,"context_line":"            }"},{"line_number":188,"context_line":"        }"},{"line_number":189,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_aa694027","line":186,"updated":"2015-10-14 22:39:24.000000000","message":"It seems odd to me to use iteritems instead of values() when the keys are being ignored, but I\u0027m ok with it if this is a Python 3 idiom.","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            query \u003d self._model_query(context, PortChain)"},{"line_number":194,"context_line":"            for port_chain_db in query:"},{"line_number":195,"context_line":"                pc_pg_ids \u003d ["},{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":198,"context_line":"                ]"},{"line_number":199,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_0a615439","line":196,"updated":"2015-10-14 22:39:24.000000000","message":"portgroup_id -\u003e portpairgroup_id","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            query \u003d self._model_query(context, PortChain)"},{"line_number":194,"context_line":"            for port_chain_db in query:"},{"line_number":195,"context_line":"                pc_pg_ids \u003d ["},{"line_number":196,"context_line":"                    assoc[\u0027portgroup_id\u0027]"},{"line_number":197,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":198,"context_line":"                ]"},{"line_number":199,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_5f3fd023","line":196,"in_reply_to":"5a2ca52d_0a615439","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            for pg_id in pg_ids:"},{"line_number":212,"context_line":"                query \u003d self._model_query(context, ChainGroupAssoc)"},{"line_number":213,"context_line":"                chain_group_association \u003d query.filter_by("},{"line_number":214,"context_line":"                    portchain_id\u003dport_chain.id, portgroup_id\u003dpg_id"},{"line_number":215,"context_line":"                ).first()"},{"line_number":216,"context_line":"                if not chain_group_association:"},{"line_number":217,"context_line":"                    chain_group_association \u003d ChainGroupAssoc("}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_6a4a48ae","line":214,"updated":"2015-10-14 22:39:24.000000000","message":"portgroup_id -\u003e portpairgroup_id","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            for pg_id in pg_ids:"},{"line_number":212,"context_line":"                query \u003d self._model_query(context, ChainGroupAssoc)"},{"line_number":213,"context_line":"                chain_group_association \u003d query.filter_by("},{"line_number":214,"context_line":"                    portchain_id\u003dport_chain.id, portgroup_id\u003dpg_id"},{"line_number":215,"context_line":"                ).first()"},{"line_number":216,"context_line":"                if not chain_group_association:"},{"line_number":217,"context_line":"                    chain_group_association \u003d ChainGroupAssoc("}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_9f0fa887","line":214,"in_reply_to":"5a2ca52d_6a4a48ae","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                ).first()"},{"line_number":216,"context_line":"                if not chain_group_association:"},{"line_number":217,"context_line":"                    chain_group_association \u003d ChainGroupAssoc("},{"line_number":218,"context_line":"                        portgroup_id\u003dpg_id"},{"line_number":219,"context_line":"                    )"},{"line_number":220,"context_line":"                chain_group_associations.append(chain_group_association)"},{"line_number":221,"context_line":"            port_chain.chain_group_associations \u003d chain_group_associations"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_0ac87421","line":218,"updated":"2015-10-14 22:39:24.000000000","message":"portgroup_id -\u003e portpairgroup_id","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                ).first()"},{"line_number":216,"context_line":"                if not chain_group_association:"},{"line_number":217,"context_line":"                    chain_group_association \u003d ChainGroupAssoc("},{"line_number":218,"context_line":"                        portgroup_id\u003dpg_id"},{"line_number":219,"context_line":"                    )"},{"line_number":220,"context_line":"                chain_group_associations.append(chain_group_association)"},{"line_number":221,"context_line":"            port_chain.chain_group_associations \u003d chain_group_associations"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_3f29b4e6","line":218,"in_reply_to":"5a2ca52d_0ac87421","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import six"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from gettext import gettext as _"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo_log import helpers as log_helpers"},{"line_number":20,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_c63ab9cd","line":17,"updated":"2015-10-19 07:52:43.000000000","message":"L17 Import not required. Please remove.","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                         sa.ForeignKey(\u0027port_chains.id\u0027),"},{"line_number":47,"context_line":"                         primary_key\u003dTrue)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, keyword, value):"},{"line_number":50,"context_line":"        self.keyword \u003d keyword"},{"line_number":51,"context_line":"        self.value \u003d value"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_63e2b7d7","line":49,"updated":"2015-10-19 07:52:43.000000000","message":"Constructor not required. Please remove.","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                        sa.ForeignKey(\u0027port_pairs.id\u0027),"},{"line_number":61,"context_line":"                        primary_key\u003dTrue)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __init__(self, keyword, value):"},{"line_number":64,"context_line":"        self.keyword \u003d keyword"},{"line_number":65,"context_line":"        self.value \u003d value"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_e3c7a743","line":63,"updated":"2015-10-19 07:52:43.000000000","message":"Constructor not required. Please remove.","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class PortPair(model_base.BASEV2, models_v2.HasId,"},{"line_number":84,"context_line":"               models_v2.HasTenant):"},{"line_number":85,"context_line":"    \"\"\"Represents the ingress and egress ports for a single service function."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    \"\"\""},{"line_number":88,"context_line":"    __tablename__ \u003d \u0027port_pairs\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_03b0a3dc","line":85,"updated":"2015-10-19 07:52:43.000000000","message":"Let\u0027s revisit current doc strings.","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                for assoc in port_chain[\u0027chain_classifier_associations\u0027]"},{"line_number":182,"context_line":"            ],"},{"line_number":183,"context_line":"            \u0027chain_parameters\u0027: {"},{"line_number":184,"context_line":"                param[\u0027keyword\u0027]: param[\u0027value\u0027]"},{"line_number":185,"context_line":"                for k, param in six.iteritems(port_chain[\u0027chain_parameters\u0027])"},{"line_number":186,"context_line":"            }"},{"line_number":187,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_a61a1d6d","line":184,"updated":"2015-10-19 07:52:43.000000000","message":"Address Vikram\u0027s comment @:\n\nhttps://review.openstack.org/#/c/207251/33/networking_sfc/db/portchain_db.py","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    def _validate_flow_classifiers(self, context, fc_ids):"},{"line_number":203,"context_line":"        pass"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _setup_chain_group_associations("},{"line_number":206,"context_line":"        self, context, port_chain, pg_ids"},{"line_number":207,"context_line":"    ):"},{"line_number":208,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_03442372","line":205,"updated":"2015-10-19 07:52:43.000000000","message":"Fix formatting issues as reported by Paul in:\n\nhttps://review.openstack.org/#/c/207251/17/networking_sfc/db/portchain_db.py","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4784e387a95300e6590e1ef0c5eb1e70b401de35","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    def _validate_flow_classifiers(self, context, fc_ids):"},{"line_number":203,"context_line":"        pass"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _setup_chain_group_associations("},{"line_number":206,"context_line":"        self, context, port_chain, pg_ids"},{"line_number":207,"context_line":"    ):"},{"line_number":208,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_c5db9d4e","line":205,"in_reply_to":"3a29b11f_03442372","updated":"2015-10-23 21:02:12.000000000","message":"Done","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            raise ext_pc.PortChainNotFound(id\u003did)"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    @log_helpers.log_method_call"},{"line_number":308,"context_line":"    def delete_port_chain(self, context, id):"},{"line_number":309,"context_line":"        try:"},{"line_number":310,"context_line":"            pc \u003d self._get_port_chain(context, id)"},{"line_number":311,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_03e8a37b","line":308,"updated":"2015-10-19 07:52:43.000000000","message":"Address Armando\u0027s comment @:\n\nhttps://review.openstack.org/#/c/207251/11/networking_sfc/db/portchain_db.py","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4784e387a95300e6590e1ef0c5eb1e70b401de35","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            raise ext_pc.PortChainNotFound(id\u003did)"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    @log_helpers.log_method_call"},{"line_number":308,"context_line":"    def delete_port_chain(self, context, id):"},{"line_number":309,"context_line":"        try:"},{"line_number":310,"context_line":"            pc \u003d self._get_port_chain(context, id)"},{"line_number":311,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_651649f3","line":308,"in_reply_to":"3a29b11f_03e8a37b","updated":"2015-10-23 21:02:12.000000000","message":"Can you expand on that comment","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"}],"networking_sfc/db/sfc_db.py":[{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"2a3152ac9e1a35ea4b6ad5bc967913c54b8801e3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ChainParameter(model_base.BASEV2):"},{"line_number":42,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":43,"context_line":"    __tablename__ \u003d \u0027port_chain_parameters\u0027"},{"line_number":44,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_4c89c1c9","line":41,"updated":"2015-11-15 18:53:58.000000000","message":"This is a problem with the API doc as well, but we need to elaborate on this docstring because it\u0027s not at all clear what the difference between a ChanParameter and a ServiceFunctionParam is. We\u0027ve got these two almost identical tables. This is going to lead to future maintainability issues if we don\u0027t clearly differentiate the purpose of one vs the other.","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"c43b273cda3d0851071943ed71e54a249c9e6c9e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ChainParameter(model_base.BASEV2):"},{"line_number":42,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":43,"context_line":"    __tablename__ \u003d \u0027port_chain_parameters\u0027"},{"line_number":44,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_b682fbc6","line":41,"in_reply_to":"da85f559_4c89c1c9","updated":"2015-11-15 22:53:30.000000000","message":"ChainParameter is intended includes information related to the chain as a whole, while ServiceFunctionParam includes information for only a single SF port-pair.","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"2a3152ac9e1a35ea4b6ad5bc967913c54b8801e3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.value \u003d value"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class ServiceFunctionParam(model_base.BASEV2):"},{"line_number":56,"context_line":"    \"\"\"Represents a service function parameter.\"\"\""},{"line_number":57,"context_line":"    __tablename__ \u003d \u0027service_function_params\u0027"},{"line_number":58,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_0c93b9fb","line":55,"updated":"2015-11-15 18:53:58.000000000","message":"ditto line 41","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"c43b273cda3d0851071943ed71e54a249c9e6c9e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.value \u003d value"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class ServiceFunctionParam(model_base.BASEV2):"},{"line_number":56,"context_line":"    \"\"\"Represents a service function parameter.\"\"\""},{"line_number":57,"context_line":"    __tablename__ \u003d \u0027service_function_params\u0027"},{"line_number":58,"context_line":"    keyword \u003d sa.Column(sa.String(255), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_96681723","line":55,"in_reply_to":"da85f559_0c93b9fb","updated":"2015-11-15 22:53:30.000000000","message":"ditto","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"2a3152ac9e1a35ea4b6ad5bc967913c54b8801e3","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":316,"context_line":"                context.session.delete(pc)"},{"line_number":317,"context_line":"        except ext_sfc.PortChainNotFound:"},{"line_number":318,"context_line":"            LOG.info(_(\"Deleting a non-existing port chain.\"))"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    @log_helpers.log_method_call"},{"line_number":321,"context_line":"    def update_port_chain(self, context, id, port_chain):"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_cc17f152","line":318,"updated":"2015-11-15 18:53:58.000000000","message":"I\u0027d like the id included in the log message but I don\u0027t recall if there was a reason given in one of the prior patch sets for why it isn\u0027t.","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"c43b273cda3d0851071943ed71e54a249c9e6c9e","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":316,"context_line":"                context.session.delete(pc)"},{"line_number":317,"context_line":"        except ext_sfc.PortChainNotFound:"},{"line_number":318,"context_line":"            LOG.info(_(\"Deleting a non-existing port chain.\"))"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    @log_helpers.log_method_call"},{"line_number":321,"context_line":"    def update_port_chain(self, context, id, port_chain):"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_76549353","line":318,"in_reply_to":"da85f559_cc17f152","updated":"2015-11-15 22:53:30.000000000","message":"Add no value as the id itself has been passed to the function as a parameter","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"93bb69c57799b8d1f849c389633fc3d8cdb1335f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                         sa.ForeignKey(\u0027port_chains.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":48,"context_line":"                         primary_key\u003dTrue)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def __init__(self, keyword, value):"},{"line_number":51,"context_line":"        self.keyword \u003d keyword"},{"line_number":52,"context_line":"        self.value \u003d value"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_f3711877","line":50,"updated":"2015-12-08 06:35:28.000000000","message":"Why we need the constructor?","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                         sa.ForeignKey(\u0027port_chains.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":48,"context_line":"                         primary_key\u003dTrue)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def __init__(self, keyword, value):"},{"line_number":51,"context_line":"        self.keyword \u003d keyword"},{"line_number":52,"context_line":"        self.value \u003d value"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_c1489bce","line":50,"in_reply_to":"7a740942_f3711877","updated":"2015-12-08 19:01:44.000000000","message":"will remove","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"93bb69c57799b8d1f849c389633fc3d8cdb1335f","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                        sa.ForeignKey(\u0027port_pairs.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":62,"context_line":"                        primary_key\u003dTrue)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __init__(self, keyword, value):"},{"line_number":65,"context_line":"        self.keyword \u003d keyword"},{"line_number":66,"context_line":"        self.value \u003d value"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_936a1480","line":64,"updated":"2015-12-08 06:35:28.000000000","message":"Why we need the constructor?","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                        sa.ForeignKey(\u0027port_pairs.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":62,"context_line":"                        primary_key\u003dTrue)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __init__(self, keyword, value):"},{"line_number":65,"context_line":"        self.keyword \u003d keyword"},{"line_number":66,"context_line":"        self.value \u003d value"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_a118efd3","line":64,"in_reply_to":"7a740942_936a1480","updated":"2015-12-08 19:01:44.000000000","message":"ditto","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"eef8b7dc423db31bad35e366ef8f5d1a92cb6895","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class ChainClassifierAssoc(model_base.BASEV2):"},{"line_number":70,"context_line":"    __tablename__ \u003d \u0027chain_classifier_asscociations\u0027"},{"line_number":71,"context_line":"    flowclassifier_id \u003d sa.Column("},{"line_number":72,"context_line":"        sa.String(36),"},{"line_number":73,"context_line":"        sa.ForeignKey(\u0027flow_classifiers.id\u0027, ondelete\u003d\u0027RESTRICT\u0027),"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_074833cb","line":70,"updated":"2015-12-07 20:49:11.000000000","message":"Table name typo.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class ChainClassifierAssoc(model_base.BASEV2):"},{"line_number":70,"context_line":"    __tablename__ \u003d \u0027chain_classifier_asscociations\u0027"},{"line_number":71,"context_line":"    flowclassifier_id \u003d sa.Column("},{"line_number":72,"context_line":"        sa.String(36),"},{"line_number":73,"context_line":"        sa.ForeignKey(\u0027flow_classifiers.id\u0027, ondelete\u003d\u0027RESTRICT\u0027),"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_4134ab48","line":70,"in_reply_to":"7a740942_074833cb","updated":"2015-12-08 19:01:44.000000000","message":"Done","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"cd0d050784e74cd396e33e9a1bd909a0d92fa137","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    \"\"\""},{"line_number":90,"context_line":"    __tablename__ \u003d \u0027port_pairs\u0027"},{"line_number":91,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":92,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":93,"context_line":"    ingress \u003d sa.Column("},{"line_number":94,"context_line":"        sa.String(36),"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_01f16acd","line":91,"updated":"2015-11-21 18:19:35.000000000","message":"Can we reuse constants defined in \"neutron/api/v2/attributes.py \" ?   \"https://review.openstack.org/#/c/242230/1\"  patch was raised to make this changes on existing neutron db models .\n\nNAME_MAX_LEN \u003d 255\nTENANT_ID_MAX_LEN \u003d 255\nDESCRIPTION_MAX_LEN \u003d 255\nDEVICE_ID_MAX_LEN \u003d 255\nDEVICE_OWNER_MAX_LEN \u003d 255\n\n(i.e) \n\nfrom neutron.api.v2 import attributes as attr\n\nname \u003d sa.Column(sa.String(255)) \u003d\u003d\u003e name \u003d sa.Column(sa.String(attr.NAME_MAX_LEN))","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11907,"name":"cathy","email":"cathy.h.zhang@huawei.com","username":"cathy"},"change_message_id":"7cf0bd766b67af50aee21ef208f9297adfe97dbe","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    \"\"\""},{"line_number":90,"context_line":"    __tablename__ \u003d \u0027port_pairs\u0027"},{"line_number":91,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":92,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":93,"context_line":"    ingress \u003d sa.Column("},{"line_number":94,"context_line":"        sa.String(36),"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_d8c3eceb","line":91,"in_reply_to":"ba8a016a_01f16acd","updated":"2015-12-07 21:50:43.000000000","message":"will do","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"93bb69c57799b8d1f849c389633fc3d8cdb1335f","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":203,"context_line":"                ]"},{"line_number":204,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"},{"line_number":205,"context_line":"                    raise ext_sfc.InvalidPortPairGroups("},{"line_number":206,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _validate_flow_classifiers(self, context, fc_ids):"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_93c69466","line":205,"updated":"2015-12-08 06:35:28.000000000","message":"Better to use PortPairGroupInUse","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                    for assoc in port_chain_db.chain_group_associations"},{"line_number":203,"context_line":"                ]"},{"line_number":204,"context_line":"                if pc_pg_ids \u003d\u003d pg_ids:"},{"line_number":205,"context_line":"                    raise ext_sfc.InvalidPortPairGroups("},{"line_number":206,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _validate_flow_classifiers(self, context, fc_ids):"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_a17f8fde","line":205,"in_reply_to":"7a740942_93c69466","updated":"2015-12-08 19:01:44.000000000","message":"will change to use PortPairGroupInUse","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ChainParameter(model_base.BASEV2):"},{"line_number":46,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":47,"context_line":"    __tablename__ \u003d \u0027port_chain_parameters\u0027"},{"line_number":48,"context_line":"    keyword \u003d sa.Column(sa.String(PARAM_LEN), primary_key\u003dTrue)"},{"line_number":49,"context_line":"    value \u003d sa.Column(sa.String(PARAM_LEN))"},{"line_number":50,"context_line":"    chain_id \u003d sa.Column(sa.String(UUID_LEN),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_f3850207","line":47,"range":{"start_line":47,"start_character":21,"end_line":47,"end_character":42},"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_port_chain_parameters","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ChainParameter(model_base.BASEV2):"},{"line_number":46,"context_line":"    \"\"\"Represents a single chain parameter.\"\"\""},{"line_number":47,"context_line":"    __tablename__ \u003d \u0027port_chain_parameters\u0027"},{"line_number":48,"context_line":"    keyword \u003d sa.Column(sa.String(PARAM_LEN), primary_key\u003dTrue)"},{"line_number":49,"context_line":"    value \u003d sa.Column(sa.String(PARAM_LEN))"},{"line_number":50,"context_line":"    chain_id \u003d sa.Column(sa.String(UUID_LEN),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_eefdff3a","line":47,"range":{"start_line":47,"start_character":21,"end_line":47,"end_character":42},"in_reply_to":"3a7e1126_f3850207","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class ServiceFunctionParam(model_base.BASEV2):"},{"line_number":56,"context_line":"    \"\"\"Represents a service function parameter.\"\"\""},{"line_number":57,"context_line":"    __tablename__ \u003d \u0027service_function_params\u0027"},{"line_number":58,"context_line":"    keyword \u003d sa.Column(sa.String(PARAM_LEN), primary_key\u003dTrue)"},{"line_number":59,"context_line":"    value \u003d sa.Column(sa.String(PARAM_LEN))"},{"line_number":60,"context_line":"    pair_id \u003d sa.Column(sa.String(UUID_LEN),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_93a4bea6","line":57,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_service_function_params","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class ServiceFunctionParam(model_base.BASEV2):"},{"line_number":56,"context_line":"    \"\"\"Represents a service function parameter.\"\"\""},{"line_number":57,"context_line":"    __tablename__ \u003d \u0027service_function_params\u0027"},{"line_number":58,"context_line":"    keyword \u003d sa.Column(sa.String(PARAM_LEN), primary_key\u003dTrue)"},{"line_number":59,"context_line":"    value \u003d sa.Column(sa.String(PARAM_LEN))"},{"line_number":60,"context_line":"    pair_id \u003d sa.Column(sa.String(UUID_LEN),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_0ef96b4d","line":57,"in_reply_to":"3a7e1126_93a4bea6","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                        primary_key\u003dTrue)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class ChainClassifierAssoc(model_base.BASEV2):"},{"line_number":66,"context_line":"    __tablename__ \u003d \u0027chain_classifier_associations\u0027"},{"line_number":67,"context_line":"    flowclassifier_id \u003d sa.Column("},{"line_number":68,"context_line":"        sa.String(UUID_LEN),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_332f0af8","line":65,"updated":"2015-12-17 14:55:49.000000000","message":"Add a docstring","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                        primary_key\u003dTrue)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class ChainClassifierAssoc(model_base.BASEV2):"},{"line_number":66,"context_line":"    __tablename__ \u003d \u0027chain_classifier_associations\u0027"},{"line_number":67,"context_line":"    flowclassifier_id \u003d sa.Column("},{"line_number":68,"context_line":"        sa.String(UUID_LEN),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_6ea02f44","line":65,"in_reply_to":"3a7e1126_332f0af8","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class ChainClassifierAssoc(model_base.BASEV2):"},{"line_number":66,"context_line":"    __tablename__ \u003d \u0027chain_classifier_associations\u0027"},{"line_number":67,"context_line":"    flowclassifier_id \u003d sa.Column("},{"line_number":68,"context_line":"        sa.String(UUID_LEN),"},{"line_number":69,"context_line":"        sa.ForeignKey(\u0027flow_classifiers.id\u0027, ondelete\u003d\u0027RESTRICT\u0027),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_f3eae2ab","line":66,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_chain_classifier_associations","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    \"\"\"Represents the ingress and egress ports for a single service function."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":"    __tablename__ \u003d \u0027port_pairs\u0027"},{"line_number":87,"context_line":"    name \u003d sa.Column(sa.String(NAME_MAX_LEN))"},{"line_number":88,"context_line":"    description \u003d sa.Column(sa.String(DESCRIPTION_MAX_LEN))"},{"line_number":89,"context_line":"    ingress \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_731cb2c1","line":86,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_port_pairs","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    \"\"\"Represents the ingress and egress ports for a single service function."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":"    __tablename__ \u003d \u0027port_pairs\u0027"},{"line_number":87,"context_line":"    name \u003d sa.Column(sa.String(NAME_MAX_LEN))"},{"line_number":88,"context_line":"    description \u003d sa.Column(sa.String(DESCRIPTION_MAX_LEN))"},{"line_number":89,"context_line":"    ingress \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_8ea31b4f","line":86,"in_reply_to":"3a7e1126_731cb2c1","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    )"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class ChainGroupAssoc(model_base.BASEV2):"},{"line_number":116,"context_line":"    __tablename__ \u003d \u0027chain_group_associations\u0027"},{"line_number":117,"context_line":"    portpairgroup_id \u003d sa.Column("},{"line_number":118,"context_line":"        sa.String(UUID_LEN),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_73735216","line":115,"updated":"2015-12-17 14:55:49.000000000","message":"Add a docstring","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    )"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class ChainGroupAssoc(model_base.BASEV2):"},{"line_number":116,"context_line":"    __tablename__ \u003d \u0027chain_group_associations\u0027"},{"line_number":117,"context_line":"    portpairgroup_id \u003d sa.Column("},{"line_number":118,"context_line":"        sa.String(UUID_LEN),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_2eb22795","line":115,"in_reply_to":"3a7e1126_73735216","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class ChainGroupAssoc(model_base.BASEV2):"},{"line_number":116,"context_line":"    __tablename__ \u003d \u0027chain_group_associations\u0027"},{"line_number":117,"context_line":"    portpairgroup_id \u003d sa.Column("},{"line_number":118,"context_line":"        sa.String(UUID_LEN),"},{"line_number":119,"context_line":"        sa.ForeignKey(\u0027port_pair_groups.id\u0027, ondelete\u003d\u0027RESTRICT\u0027),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_93559e51","line":116,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_chain_group_associations","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":128,"context_line":"class PortPairGroup(model_base.BASEV2, models_v2.HasId,"},{"line_number":129,"context_line":"                    models_v2.HasTenant):"},{"line_number":130,"context_line":"    \"\"\"Represents a port pair group model.\"\"\""},{"line_number":131,"context_line":"    __tablename__ \u003d \u0027port_pair_groups\u0027"},{"line_number":132,"context_line":"    name \u003d sa.Column(sa.String(NAME_MAX_LEN))"},{"line_number":133,"context_line":"    description \u003d sa.Column(sa.String(DESCRIPTION_MAX_LEN))"},{"line_number":134,"context_line":"    port_pairs \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_d3d1e6ce","line":131,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_port_pair_groups","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":128,"context_line":"class PortPairGroup(model_base.BASEV2, models_v2.HasId,"},{"line_number":129,"context_line":"                    models_v2.HasTenant):"},{"line_number":130,"context_line":"    \"\"\"Represents a port pair group model.\"\"\""},{"line_number":131,"context_line":"    __tablename__ \u003d \u0027port_pair_groups\u0027"},{"line_number":132,"context_line":"    name \u003d sa.Column(sa.String(NAME_MAX_LEN))"},{"line_number":133,"context_line":"    description \u003d sa.Column(sa.String(DESCRIPTION_MAX_LEN))"},{"line_number":134,"context_line":"    port_pairs \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_eeabbf1b","line":131,"in_reply_to":"3a7e1126_d3d1e6ce","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class PortChain(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":144,"context_line":"    \"\"\"Represents a Neutron service function Port Chain.\"\"\""},{"line_number":145,"context_line":"    __tablename__ \u003d \u0027port_chains\u0027"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    name \u003d sa.Column(sa.String(NAME_MAX_LEN))"},{"line_number":148,"context_line":"    description \u003d sa.Column(sa.String(DESCRIPTION_MAX_LEN))"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_f3ebc276","line":145,"updated":"2015-12-17 14:55:49.000000000","message":"change table name to sfc_port_chains","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class PortChain(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":144,"context_line":"    \"\"\"Represents a Neutron service function Port Chain.\"\"\""},{"line_number":145,"context_line":"    __tablename__ \u003d \u0027port_chains\u0027"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    name \u003d sa.Column(sa.String(NAME_MAX_LEN))"},{"line_number":148,"context_line":"    description \u003d sa.Column(sa.String(DESCRIPTION_MAX_LEN))"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_4ead3330","line":145,"in_reply_to":"3a7e1126_f3ebc276","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _validate_flow_classifiers(self, context, fc_ids):"},{"line_number":205,"context_line":"        pass"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def _setup_chain_group_associations("},{"line_number":208,"context_line":"        self, context, port_chain, pg_ids"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_fe2389a5","line":205,"updated":"2015-12-17 14:55:49.000000000","message":"Is this a TODO or will this function get implemented in a child class? If this is a TODO, please add a TODO comment in the file.","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                        port_pair_groups\u003dpg_ids, port_chain\u003dport_chain_db.id)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _validate_flow_classifiers(self, context, fc_ids):"},{"line_number":205,"context_line":"        pass"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def _setup_chain_group_associations("},{"line_number":208,"context_line":"        self, context, port_chain, pg_ids"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_0ea72b50","line":205,"in_reply_to":"3a7e1126_fe2389a5","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"}],"networking_sfc/extensions/flowclassifier.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"cfg.CONF.import_opt(\u0027api_extensions_path\u0027, \u0027neutron.common.config\u0027)"},{"line_number":34,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":35,"context_line":"FLOW_CLASSIFIER_EXT \u003d \"flow_classifier\""},{"line_number":36,"context_line":"FLOW_CLASSIFIER_PREFIX \u003d \"/networking_sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"fc_supported_protocols \u003d [const.PROTO_NAME_TCP,"},{"line_number":39,"context_line":"                          const.PROTO_NAME_UDP, const.PROTO_NAME_ICMP]"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_eccecfb6","line":36,"updated":"2015-10-01 14:14:02.000000000","message":"Isn\u0027t this namespace too long? \"/sfc\"?","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"cfg.CONF.import_opt(\u0027api_extensions_path\u0027, \u0027neutron.common.config\u0027)"},{"line_number":34,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":35,"context_line":"FLOW_CLASSIFIER_EXT \u003d \"flow_classifier\""},{"line_number":36,"context_line":"FLOW_CLASSIFIER_PREFIX \u003d \"/networking_sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"fc_supported_protocols \u003d [const.PROTO_NAME_TCP,"},{"line_number":39,"context_line":"                          const.PROTO_NAME_UDP, const.PROTO_NAME_ICMP]"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_4db3190b","line":36,"in_reply_to":"9a1a9d01_eccecfb6","updated":"2015-10-02 05:48:01.000000000","message":"Let\u0027s take up this discussion via \"https://review.openstack.org/#/c/229841/\"","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6c4abffe53f0ce3e4e20c130aa3b800e4c13425","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"fc_supported_protocols \u003d [const.PROTO_NAME_TCP,"},{"line_number":39,"context_line":"                          const.PROTO_NAME_UDP, const.PROTO_NAME_ICMP]"},{"line_number":40,"context_line":"fc_supported_ethertypes \u003d [\u0027IPv4\u0027, \u0027IPv6\u0027]"},{"line_number":41,"context_line":"SUPPORTED_L7_PARAMETERS \u003d []"},{"line_number":42,"context_line":"DEFAULT_L7_PARAMETER \u003d {}"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_f92433c7","line":40,"updated":"2015-10-02 02:55:11.000000000","message":"strictly speaking \u0027IPv4\u0027 and \u0027IPv6\u0027 are not ethertypes\n\nfc_supported_ip_versions would be more accurate.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"fc_supported_protocols \u003d [const.PROTO_NAME_TCP,"},{"line_number":39,"context_line":"                          const.PROTO_NAME_UDP, const.PROTO_NAME_ICMP]"},{"line_number":40,"context_line":"fc_supported_ethertypes \u003d [\u0027IPv4\u0027, \u0027IPv6\u0027]"},{"line_number":41,"context_line":"SUPPORTED_L7_PARAMETERS \u003d []"},{"line_number":42,"context_line":"DEFAULT_L7_PARAMETER \u003d {}"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_2111095e","line":40,"in_reply_to":"9a1a9d01_0de76113","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"fc_supported_protocols \u003d [const.PROTO_NAME_TCP,"},{"line_number":39,"context_line":"                          const.PROTO_NAME_UDP, const.PROTO_NAME_ICMP]"},{"line_number":40,"context_line":"fc_supported_ethertypes \u003d [\u0027IPv4\u0027, \u0027IPv6\u0027]"},{"line_number":41,"context_line":"SUPPORTED_L7_PARAMETERS \u003d []"},{"line_number":42,"context_line":"DEFAULT_L7_PARAMETER \u003d {}"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_0de76113","line":40,"in_reply_to":"9a1a9d01_f92433c7","updated":"2015-10-02 05:48:01.000000000","message":"Please check the discussion @ https://review.openstack.org/#/c/229841/","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# Flow Classifier Exceptions"},{"line_number":46,"context_line":"class FlowClassifierNotFound(neutron_exc.NotFound):"},{"line_number":47,"context_line":"    message \u003d _(\"Flow Classifier %(id)s does not exist\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class FlowClassifierPortNotFound(neutron_exc.NotFound):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_ec032fbd","line":47,"range":{"start_line":47,"start_character":40,"end_line":47,"end_character":55},"updated":"2015-10-01 14:14:02.000000000","message":"\"is not found\" looks better to me.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# Flow Classifier Exceptions"},{"line_number":46,"context_line":"class FlowClassifierNotFound(neutron_exc.NotFound):"},{"line_number":47,"context_line":"    message \u003d _(\"Flow Classifier %(id)s does not exist\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class FlowClassifierPortNotFound(neutron_exc.NotFound):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_2159098f","line":47,"in_reply_to":"9a1a9d01_2de4a50b","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# Flow Classifier Exceptions"},{"line_number":46,"context_line":"class FlowClassifierNotFound(neutron_exc.NotFound):"},{"line_number":47,"context_line":"    message \u003d _(\"Flow Classifier %(id)s does not exist\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class FlowClassifierPortNotFound(neutron_exc.NotFound):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_2de4a50b","line":47,"in_reply_to":"9a1a9d01_ec032fbd","updated":"2015-10-02 05:48:01.000000000","message":"+1.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class FlowClassifierInvalidPortValue(neutron_exc.InvalidInput):"},{"line_number":61,"context_line":"    message \u003d _(\"flow classifier Invalid value for port %(port)s\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class FlowClassifierInvalidIcmpValue(neutron_exc.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_e616f057","line":61,"updated":"2015-10-01 14:14:02.000000000","message":"It is better to capitalize the first word \"flow\".","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class FlowClassifierInvalidPortValue(neutron_exc.InvalidInput):"},{"line_number":61,"context_line":"    message \u003d _(\"flow classifier Invalid value for port %(port)s\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class FlowClassifierInvalidIcmpValue(neutron_exc.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_eded4df0","line":61,"in_reply_to":"9a1a9d01_e616f057","updated":"2015-10-02 05:48:01.000000000","message":"Good catch..","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class FlowClassifierInvalidPortValue(neutron_exc.InvalidInput):"},{"line_number":61,"context_line":"    message \u003d _(\"flow classifier Invalid value for port %(port)s\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class FlowClassifierInvalidIcmpValue(neutron_exc.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_41ec3d8f","line":61,"in_reply_to":"9a1a9d01_eded4df0","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class FlowClassifierInvalidL7Parameter(neutron_exc.InvalidInput):"},{"line_number":90,"context_line":"    message \u003d _("},{"line_number":91,"context_line":"        \"flow classifier parameter (%%(key)s, %%(value)s) is not \""},{"line_number":92,"context_line":"        \"in supported parameter list %(supported_parameters)s\""},{"line_number":93,"context_line":"    ) % {\u0027supported_parameters\u0027: SUPPORTED_L7_PARAMETERS}"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_c615ec49","line":91,"updated":"2015-10-01 14:14:02.000000000","message":"It is better to capitalize the first word \"flow\".","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class FlowClassifierInvalidL7Parameter(neutron_exc.InvalidInput):"},{"line_number":90,"context_line":"    message \u003d _("},{"line_number":91,"context_line":"        \"flow classifier parameter (%%(key)s, %%(value)s) is not \""},{"line_number":92,"context_line":"        \"in supported parameter list %(supported_parameters)s\""},{"line_number":93,"context_line":"    ) % {\u0027supported_parameters\u0027: SUPPORTED_L7_PARAMETERS}"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_219ee907","line":91,"in_reply_to":"9a1a9d01_6db85de6","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class FlowClassifierInvalidL7Parameter(neutron_exc.InvalidInput):"},{"line_number":90,"context_line":"    message \u003d _("},{"line_number":91,"context_line":"        \"flow classifier parameter (%%(key)s, %%(value)s) is not \""},{"line_number":92,"context_line":"        \"in supported parameter list %(supported_parameters)s\""},{"line_number":93,"context_line":"    ) % {\u0027supported_parameters\u0027: SUPPORTED_L7_PARAMETERS}"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_6db85de6","line":91,"in_reply_to":"9a1a9d01_c615ec49","updated":"2015-10-02 05:48:01.000000000","message":"+1","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6c4abffe53f0ce3e4e20c130aa3b800e4c13425","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    ) % {\u0027supported_parameters\u0027: SUPPORTED_L7_PARAMETERS}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def convert_validate_protocol(value):"},{"line_number":97,"context_line":"    if value is None:"},{"line_number":98,"context_line":"        return None"},{"line_number":99,"context_line":"    if isinstance(value, six.string_types):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_1c9315a5","line":96,"updated":"2015-10-02 02:55:11.000000000","message":"normalise_protocol or cleanse_protocol  would be a better name for this function.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    ) % {\u0027supported_parameters\u0027: SUPPORTED_L7_PARAMETERS}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def convert_validate_protocol(value):"},{"line_number":97,"context_line":"    if value is None:"},{"line_number":98,"context_line":"        return None"},{"line_number":99,"context_line":"    if isinstance(value, six.string_types):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_213a69e8","line":96,"in_reply_to":"9a1a9d01_1c9315a5","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6c4abffe53f0ce3e4e20c130aa3b800e4c13425","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        protocol\u003dvalue, values\u003dfc_supported_protocols)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"def convert_ethertype_to_case_insensitive(value):"},{"line_number":107,"context_line":"    if value is None:"},{"line_number":108,"context_line":"        return \u0027IPv4\u0027"},{"line_number":109,"context_line":"    if isinstance(value, six.string_types):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_dcb59d31","line":106,"updated":"2015-10-02 02:55:11.000000000","message":"normalise_ip_version would be a better name for this function.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        protocol\u003dvalue, values\u003dfc_supported_protocols)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"def convert_ethertype_to_case_insensitive(value):"},{"line_number":107,"context_line":"    if value is None:"},{"line_number":108,"context_line":"        return \u0027IPv4\u0027"},{"line_number":109,"context_line":"    if isinstance(value, six.string_types):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_61306108","line":106,"in_reply_to":"9a1a9d01_0dce8183","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        protocol\u003dvalue, values\u003dfc_supported_protocols)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"def convert_ethertype_to_case_insensitive(value):"},{"line_number":107,"context_line":"    if value is None:"},{"line_number":108,"context_line":"        return \u0027IPv4\u0027"},{"line_number":109,"context_line":"    if isinstance(value, six.string_types):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_0dce8183","line":106,"in_reply_to":"9a1a9d01_dcb59d31","updated":"2015-10-02 05:48:01.000000000","message":"Let\u0027s take up this discussion via: \"https://review.openstack.org/#/c/229841/\"","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6c4abffe53f0ce3e4e20c130aa3b800e4c13425","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        ip_version\u003dvalue, values\u003dfc_supported_ethertypes)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def convert_validate_string(value):"},{"line_number":118,"context_line":"    if value is None:"},{"line_number":119,"context_line":"        return \u0027\u0027"},{"line_number":120,"context_line":"    return value"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_dc511dda","line":117,"updated":"2015-10-02 02:55:11.000000000","message":"normalise_string or cleanse_string would be a better name for this function.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        ip_version\u003dvalue, values\u003dfc_supported_ethertypes)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def convert_validate_string(value):"},{"line_number":118,"context_line":"    if value is None:"},{"line_number":119,"context_line":"        return \u0027\u0027"},{"line_number":120,"context_line":"    return value"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_c154cd22","line":117,"in_reply_to":"9a1a9d01_4de799ac","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        ip_version\u003dvalue, values\u003dfc_supported_ethertypes)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def convert_validate_string(value):"},{"line_number":118,"context_line":"    if value is None:"},{"line_number":119,"context_line":"        return \u0027\u0027"},{"line_number":120,"context_line":"    return value"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_4de799ac","line":117,"in_reply_to":"9a1a9d01_dc511dda","updated":"2015-10-02 05:48:01.000000000","message":"+1 for normalize_string","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6c4abffe53f0ce3e4e20c130aa3b800e4c13425","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    return value"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"def convert_validate_port_value(port):"},{"line_number":124,"context_line":"    if port is None:"},{"line_number":125,"context_line":"        return None"},{"line_number":126,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_5c5c2ded","line":123,"updated":"2015-10-02 02:55:11.000000000","message":"normalise_port_value","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    return value"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"def convert_validate_port_value(port):"},{"line_number":124,"context_line":"    if port is None:"},{"line_number":125,"context_line":"        return None"},{"line_number":126,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_6decdd8f","line":123,"in_reply_to":"9a1a9d01_5c5c2ded","updated":"2015-10-02 05:48:01.000000000","message":"+1","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    return value"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"def convert_validate_port_value(port):"},{"line_number":124,"context_line":"    if port is None:"},{"line_number":125,"context_line":"        return None"},{"line_number":126,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_a1575925","line":123,"in_reply_to":"9a1a9d01_6decdd8f","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6c4abffe53f0ce3e4e20c130aa3b800e4c13425","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        raise FlowClassifierInvalidPortValue(port\u003dport)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def convert_validate_l7parameters(parameters):"},{"line_number":138,"context_line":"    parameters \u003d attr.convert_none_to_empty_dict(parameters)"},{"line_number":139,"context_line":"    if not parameters:"},{"line_number":140,"context_line":"        return DEFAULT_L7_PARAMETER"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_dc683d8a","line":137,"updated":"2015-10-02 02:55:11.000000000","message":"normalise_l7parameters\n\nthe convert_validate prefix on the proceeding functions is confusing. \n\nconvert implies that the function will transform its input.\nvalidate implies that it preforms a test and report the boolean result of valid or invaild\n\nthe proceeding functions cleanse the user input and either return the normalised value if valid or raise an error so i think normalised is a better prefix.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        raise FlowClassifierInvalidPortValue(port\u003dport)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def convert_validate_l7parameters(parameters):"},{"line_number":138,"context_line":"    parameters \u003d attr.convert_none_to_empty_dict(parameters)"},{"line_number":139,"context_line":"    if not parameters:"},{"line_number":140,"context_line":"        return DEFAULT_L7_PARAMETER"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_e12471c7","line":137,"in_reply_to":"9a1a9d01_2d86e5b9","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        raise FlowClassifierInvalidPortValue(port\u003dport)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def convert_validate_l7parameters(parameters):"},{"line_number":138,"context_line":"    parameters \u003d attr.convert_none_to_empty_dict(parameters)"},{"line_number":139,"context_line":"    if not parameters:"},{"line_number":140,"context_line":"        return DEFAULT_L7_PARAMETER"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_2d86e5b9","line":137,"in_reply_to":"9a1a9d01_dc683d8a","updated":"2015-10-02 05:48:01.000000000","message":"+1","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":169,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":170,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":171,"context_line":"        \u0027ip_version\u0027: {"},{"line_number":172,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":173,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":174,"context_line":"            \u0027convert_to\u0027: convert_ethertype_to_case_insensitive},"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_d15a842a","line":171,"updated":"2015-10-01 14:14:02.000000000","message":"Isn\u0027t it better to use ether_type rather than ip_version?\n\nIf you prefer to \"ip_server\", I think IP version integer (4 or 6) is better rather than using IPv4/IPv6.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":169,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":170,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":171,"context_line":"        \u0027ip_version\u0027: {"},{"line_number":172,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":173,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":174,"context_line":"            \u0027convert_to\u0027: convert_ethertype_to_case_insensitive},"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_ed8f8dca","line":171,"in_reply_to":"9a1a9d01_bc1f89b6","updated":"2015-10-02 05:48:01.000000000","message":"Let\u0027s take up this discussion @ https://review.openstack.org/#/c/229841/","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6c4abffe53f0ce3e4e20c130aa3b800e4c13425","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":169,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":170,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":171,"context_line":"        \u0027ip_version\u0027: {"},{"line_number":172,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":173,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":174,"context_line":"            \u0027convert_to\u0027: convert_ethertype_to_case_insensitive},"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_bc1f89b6","line":171,"in_reply_to":"9a1a9d01_d15a842a","updated":"2015-10-02 02:55:11.000000000","message":"+1 \ni think either ip_version as a integer 4 or 6 or\nether_type with 0x0800 and 0x86DD would be better.\n\nether_type would allow for non ip protocols to be supported at a later date if desired without requiring the api to be changed.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":169,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":170,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":171,"context_line":"        \u0027ip_version\u0027: {"},{"line_number":172,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":173,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":174,"context_line":"            \u0027convert_to\u0027: convert_ethertype_to_case_insensitive},"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_c12b6d93","line":171,"in_reply_to":"9a1a9d01_ed8f8dca","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":201,"context_line":"            \u0027validate\u0027: {\u0027type:subnet_or_none\u0027: None},"},{"line_number":202,"context_line":"            \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":203,"context_line":"        \u0027source_port_id\u0027: {"},{"line_number":204,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":205,"context_line":"            \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":206,"context_line":"            \u0027default\u0027: None, \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_6cae3fe9","line":203,"updated":"2015-10-01 14:14:02.000000000","message":"As I commented in CLI review, \u0027source_port_id\u0027 is better to be reworded.\nIn many cases, we can use \u0027name\u0027 or other attribute which is more human friendly than UUID to specify some resource.\nThus it is better to choose a resource name which is unique and easy to understand even if \u0027_id\u0027 suffix is dropped.\n\nIn this case, if we drop \u0027_id\u0027 suffix, it will be \u0027source_port\u0027.\n\u0027source_port\u0027 is also used for \u0027source_port_range_min/max\u0027 and it is confusing.\n\nThanks Vikram for proposing API definition change\nand I like the change for better clarification.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":201,"context_line":"            \u0027validate\u0027: {\u0027type:subnet_or_none\u0027: None},"},{"line_number":202,"context_line":"            \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":203,"context_line":"        \u0027source_port_id\u0027: {"},{"line_number":204,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":205,"context_line":"            \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":206,"context_line":"            \u0027default\u0027: None, \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_adc0b5e1","line":203,"in_reply_to":"9a1a9d01_6cae3fe9","updated":"2015-10-02 05:48:01.000000000","message":"Let\u0027s rework on this once \"https://review.openstack.org/#/c/229841/\" gets approved.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":201,"context_line":"            \u0027validate\u0027: {\u0027type:subnet_or_none\u0027: None},"},{"line_number":202,"context_line":"            \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":203,"context_line":"        \u0027source_port_id\u0027: {"},{"line_number":204,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":205,"context_line":"            \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":206,"context_line":"            \u0027default\u0027: None, \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_811c9578","line":203,"in_reply_to":"9a1a9d01_adc0b5e1","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":33,"context_line":"cfg.CONF.import_opt(\u0027api_extensions_path\u0027, \u0027neutron.common.config\u0027)"},{"line_number":34,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":35,"context_line":"FLOW_CLASSIFIER_EXT \u003d \"flow_classifier\""},{"line_number":36,"context_line":"FLOW_CLASSIFIER_PREFIX \u003d \"/networking_sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"fc_supported_protocols \u003d [const.PROTO_NAME_TCP,"},{"line_number":39,"context_line":"                          const.PROTO_NAME_UDP, const.PROTO_NAME_ICMP]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_3512b1b5","line":36,"updated":"2015-10-06 06:29:29.000000000","message":"This prefix is referred to from multiple extensions.\nIt seems better to define it in one place: constants.py?","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"cfg.CONF.import_opt(\u0027api_extensions_path\u0027, \u0027neutron.common.config\u0027)"},{"line_number":34,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":35,"context_line":"FLOW_CLASSIFIER_EXT \u003d \"flow_classifier\""},{"line_number":36,"context_line":"FLOW_CLASSIFIER_PREFIX \u003d \"/networking_sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"fc_supported_protocols \u003d [const.PROTO_NAME_TCP,"},{"line_number":39,"context_line":"                          const.PROTO_NAME_UDP, const.PROTO_NAME_ICMP]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_eb89aacb","line":36,"in_reply_to":"7a2fa921_3512b1b5","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":33,"context_line":"cfg.CONF.import_opt(\u0027api_extensions_path\u0027, \u0027neutron.common.config\u0027)"},{"line_number":34,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":35,"context_line":"FLOW_CLASSIFIER_EXT \u003d \"flow_classifier\""},{"line_number":36,"context_line":"FLOW_CLASSIFIER_PREFIX \u003d \"/networking_sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"fc_supported_protocols \u003d [const.PROTO_NAME_TCP,"},{"line_number":39,"context_line":"                          const.PROTO_NAME_UDP, const.PROTO_NAME_ICMP]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_37310eed","line":36,"in_reply_to":"7a2fa921_eb89aacb","updated":"2015-10-07 14:50:20.000000000","message":"Let\u0027s have it here for now!","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class FlowClassifierPortNotFound(neutron_exc.NotFound):"},{"line_number":51,"context_line":"    message \u003d _(\"Flow Classifier port %(id)s does not exist\")"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class FlowClassifierInvalidPortRange(neutron_exc.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_557e4de5","line":51,"range":{"start_line":51,"start_character":45,"end_line":51,"end_character":59},"updated":"2015-10-06 06:29:29.000000000","message":"\"could not be found\" or \"not found\" looks more consistent with other neutron exception definitions.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class FlowClassifierPortNotFound(neutron_exc.NotFound):"},{"line_number":51,"context_line":"    message \u003d _(\"Flow Classifier port %(id)s does not exist\")"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class FlowClassifierInvalidPortRange(neutron_exc.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_cb906eef","line":51,"in_reply_to":"7a2fa921_557e4de5","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class FlowClassifierPortNotFound(neutron_exc.NotFound):"},{"line_number":51,"context_line":"    message \u003d _(\"Flow Classifier port %(id)s does not exist\")"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class FlowClassifierInvalidPortRange(neutron_exc.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_375fce0f","line":51,"in_reply_to":"7a2fa921_cb906eef","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class FlowClassifierInvalidPortRange(neutron_exc.InvalidInput):"},{"line_number":55,"context_line":"    message \u003d _(\"Invalid IP protocol port range. min_port_range \""},{"line_number":56,"context_line":"                \"%(port_range_min)s must be \u003c\u003d max_port_range \""},{"line_number":57,"context_line":"                \"%(port_range_max)s\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_9574e5fd","line":56,"range":{"start_line":56,"start_character":44,"end_line":56,"end_character":46},"updated":"2015-10-06 06:29:29.000000000","message":"\"\u003c\u003d\" -\u003e \"smaller than or equal to\"","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class FlowClassifierInvalidPortRange(neutron_exc.InvalidInput):"},{"line_number":55,"context_line":"    message \u003d _(\"Invalid IP protocol port range. min_port_range \""},{"line_number":56,"context_line":"                \"%(port_range_min)s must be \u003c\u003d max_port_range \""},{"line_number":57,"context_line":"                \"%(port_range_max)s\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_779306a4","line":56,"in_reply_to":"7a2fa921_9574e5fd","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class FlowClassifierInvalidPortRange(neutron_exc.InvalidInput):"},{"line_number":55,"context_line":"    message \u003d _(\"Invalid IP protocol port range. min_port_range \""},{"line_number":56,"context_line":"                \"%(port_range_min)s must be \u003c\u003d max_port_range \""},{"line_number":57,"context_line":"                \"%(port_range_max)s\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_8bc116e7","line":56,"in_reply_to":"7a2fa921_9574e5fd","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class FlowClassifierInvalidProtocol(neutron_exc.InvalidInput):"},{"line_number":74,"context_line":"    message \u003d _(\"Flow Classifier protocol %(protocol)s not supported. \""},{"line_number":75,"context_line":"                \"Only protocol values %(values)s is supported.\")"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_959065ee","line":74,"updated":"2015-10-06 06:29:29.000000000","message":"\"Flow classifier protocol\" sounds a bit odd.\n\n  Flow classifier does not support protocol %(protocol)s.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class FlowClassifierInvalidProtocol(neutron_exc.InvalidInput):"},{"line_number":74,"context_line":"    message \u003d _(\"Flow Classifier protocol %(protocol)s not supported. \""},{"line_number":75,"context_line":"                \"Only protocol values %(values)s is supported.\")"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_d738daa2","line":74,"in_reply_to":"7a2fa921_959065ee","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class FlowClassifierInvalidProtocol(neutron_exc.InvalidInput):"},{"line_number":74,"context_line":"    message \u003d _(\"Flow Classifier protocol %(protocol)s not supported. \""},{"line_number":75,"context_line":"                \"Only protocol values %(values)s is supported.\")"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_2bb6c28a","line":74,"in_reply_to":"7a2fa921_959065ee","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class FlowClassifierInvalidIPVersion(neutron_exc.InvalidInput):"},{"line_number":79,"context_line":"    message \u003d _(\"Flow Classifier IP version %(ip_version)s not supported. \""},{"line_number":80,"context_line":"                \"Only IP version values %(values)s is supported.\")"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_35bcf16b","line":79,"updated":"2015-10-06 06:29:29.000000000","message":"same as the above.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class FlowClassifierInvalidIPVersion(neutron_exc.InvalidInput):"},{"line_number":79,"context_line":"    message \u003d _(\"Flow Classifier IP version %(ip_version)s not supported. \""},{"line_number":80,"context_line":"                \"Only IP version values %(values)s is supported.\")"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_b75c3eee","line":79,"in_reply_to":"7a2fa921_35bcf16b","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class FlowClassifierInvalidIPVersion(neutron_exc.InvalidInput):"},{"line_number":79,"context_line":"    message \u003d _(\"Flow Classifier IP version %(ip_version)s not supported. \""},{"line_number":80,"context_line":"                \"Only IP version values %(values)s is supported.\")"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_ebb0ca8d","line":79,"in_reply_to":"7a2fa921_35bcf16b","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class FlowClassifierInvalidL7Parameter(neutron_exc.InvalidInput):"},{"line_number":88,"context_line":"    message \u003d _("},{"line_number":89,"context_line":"        \"Flow classifier parameter (%%(key)s, %%(value)s) is not \""},{"line_number":90,"context_line":"        \"supported. Valid parameter list %(supported_parameters)s\""},{"line_number":91,"context_line":"    ) % {\u0027supported_parameters\u0027: SUPPORTED_L7_PARAMETERS}"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_f00e87e4","line":89,"updated":"2015-10-06 06:29:29.000000000","message":"Same as the above.\n\nIn addition, \"L7 parameter\" looks better than \"parameter\".","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class FlowClassifierInvalidL7Parameter(neutron_exc.InvalidInput):"},{"line_number":88,"context_line":"    message \u003d _("},{"line_number":89,"context_line":"        \"Flow classifier parameter (%%(key)s, %%(value)s) is not \""},{"line_number":90,"context_line":"        \"supported. Valid parameter list %(supported_parameters)s\""},{"line_number":91,"context_line":"    ) % {\u0027supported_parameters\u0027: SUPPORTED_L7_PARAMETERS}"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_d77a1af1","line":89,"in_reply_to":"7a2fa921_f00e87e4","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class FlowClassifierInvalidL7Parameter(neutron_exc.InvalidInput):"},{"line_number":88,"context_line":"    message \u003d _("},{"line_number":89,"context_line":"        \"Flow classifier parameter (%%(key)s, %%(value)s) is not \""},{"line_number":90,"context_line":"        \"supported. Valid parameter list %(supported_parameters)s\""},{"line_number":91,"context_line":"    ) % {\u0027supported_parameters\u0027: SUPPORTED_L7_PARAMETERS}"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_cba70e4e","line":89,"in_reply_to":"7a2fa921_f00e87e4","updated":"2015-10-06 12:54:37.000000000","message":"Ok.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            raise FlowClassifierInvalidL7Parameter(key\u003dkey, value\u003dvalue)"},{"line_number":142,"context_line":"    return parameters"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"# Attribute Map"},{"line_number":146,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":147,"context_line":"    \u0027flow_classifiers\u0027: {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_30b63fdd","line":144,"updated":"2015-10-06 06:29:29.000000000","message":"The attribute order (for example, of \"validate\", \"is_visible\", \"default\" and so on) looks random. Could you place them in the consistent ordering? It will ease the maintenance.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            raise FlowClassifierInvalidL7Parameter(key\u003dkey, value\u003dvalue)"},{"line_number":142,"context_line":"    return parameters"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"# Attribute Map"},{"line_number":146,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":147,"context_line":"    \u0027flow_classifiers\u0027: {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_b7719ee2","line":144,"in_reply_to":"7a2fa921_30b63fdd","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            raise FlowClassifierInvalidL7Parameter(key\u003dkey, value\u003dvalue)"},{"line_number":142,"context_line":"    return parameters"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"# Attribute Map"},{"line_number":146,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":147,"context_line":"    \u0027flow_classifiers\u0027: {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_4b721ee7","line":144,"in_reply_to":"7a2fa921_30b63fdd","updated":"2015-10-06 12:54:37.000000000","message":"Ok. Will re-arrange.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8c54cdc0a5eb1d06c702d4911bd8d6e3fc8afcda","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":168,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":169,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":170,"context_line":"        \u0027ip_version\u0027: {"},{"line_number":171,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":172,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":173,"context_line":"            \u0027convert_to\u0027: normalise_ethertype},"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a1a9d01_2dca1b6f","line":170,"updated":"2015-10-05 13:10:16.000000000","message":"Rework as per \"https://review.openstack.org/#/c/229841/\"","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":168,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":169,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":170,"context_line":"        \u0027ip_version\u0027: {"},{"line_number":171,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":172,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":173,"context_line":"            \u0027convert_to\u0027: normalise_ethertype},"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_57792ac7","line":170,"in_reply_to":"9a1a9d01_2dca1b6f","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"a4cea9ca8e4dcc8ff8884453b38307be82bdea50","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":168,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":169,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":170,"context_line":"        \u0027ip_version\u0027: {"},{"line_number":171,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":172,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":173,"context_line":"            \u0027convert_to\u0027: normalise_ethertype},"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_a051b364","line":170,"in_reply_to":"9a1a9d01_2dca1b6f","updated":"2015-10-05 17:21:38.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":217,"context_line":"}"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"flow_classifier_quota_opts \u003d ["},{"line_number":220,"context_line":"    cfg.IntOpt(\u0027maximum_flow_classifiers\u0027,"},{"line_number":221,"context_line":"               default\u003d100,"},{"line_number":222,"context_line":"               help\u003d_(\u0027Maximum number of flow classifiers per tenant. \u0027"},{"line_number":223,"context_line":"                      \u0027A negative value means unlimited.\u0027)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_30d39f3a","line":220,"updated":"2015-10-06 06:29:29.000000000","message":"This option is registered to \"QUOTAS\" section.\nIt is better to follow the naming convention in QUOTAS section \"quota_flow_classifier\" (starting with \"quota_\" and using a singular form)","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":217,"context_line":"}"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"flow_classifier_quota_opts \u003d ["},{"line_number":220,"context_line":"    cfg.IntOpt(\u0027maximum_flow_classifiers\u0027,"},{"line_number":221,"context_line":"               default\u003d100,"},{"line_number":222,"context_line":"               help\u003d_(\u0027Maximum number of flow classifiers per tenant. \u0027"},{"line_number":223,"context_line":"                      \u0027A negative value means unlimited.\u0027)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_4b49be8a","line":220,"in_reply_to":"7a2fa921_30d39f3a","updated":"2015-10-06 12:54:37.000000000","message":"Agreed","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":217,"context_line":"}"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"flow_classifier_quota_opts \u003d ["},{"line_number":220,"context_line":"    cfg.IntOpt(\u0027maximum_flow_classifiers\u0027,"},{"line_number":221,"context_line":"               default\u003d100,"},{"line_number":222,"context_line":"               help\u003d_(\u0027Maximum number of flow classifiers per tenant. \u0027"},{"line_number":223,"context_line":"                      \u0027A negative value means unlimited.\u0027)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_175ad24f","line":220,"in_reply_to":"7a2fa921_30d39f3a","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"48d6d36a9e1c683dff64ecf92dd256d0d2220511","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class FlowClassifierInvalidIcmpValue(neutron_exc.InvalidInput):"},{"line_number":65,"context_line":"    message \u003d _(\"Invalid value for ICMP %(field)s (%(attr)s) \""},{"line_number":66,"context_line":"                \"%(value)s. It must be 0 to 255.\")"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class FlowClassifierInUse(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_025feb0e","line":66,"updated":"2015-10-07 15:14:38.000000000","message":"this error is not required .please remove it","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":16788,"name":"Ramanjaneya Reddy Palleti","email":"ramanjaneya.palleti@huawei.com","username":"Ramanjaneya"},"change_message_id":"0be6d0938929b54387984270e22b56fb64621055","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class FlowClassifierInvalidIcmpValue(neutron_exc.InvalidInput):"},{"line_number":65,"context_line":"    message \u003d _(\"Invalid value for ICMP %(field)s (%(attr)s) \""},{"line_number":66,"context_line":"                \"%(value)s. It must be 0 to 255.\")"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class FlowClassifierInUse(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_4eb5bb7b","line":66,"in_reply_to":"7a2fa921_025feb0e","updated":"2015-10-09 04:20:02.000000000","message":"+1","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4de1473ef258697d89c861a269f5bdb14c254a23","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class FlowClassifierInvalidIcmpValue(neutron_exc.InvalidInput):"},{"line_number":65,"context_line":"    message \u003d _(\"Invalid value for ICMP %(field)s (%(attr)s) \""},{"line_number":66,"context_line":"                \"%(value)s. It must be 0 to 255.\")"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class FlowClassifierInUse(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_aa860563","line":66,"in_reply_to":"7a2fa921_025feb0e","updated":"2015-10-07 18:25:51.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e92df0e07b3f34dda99abdd6e81e80d7e16c3b86","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":165,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":166,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":167,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":168,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":169,"context_line":"        \u0027ethertype\u0027: {"},{"line_number":170,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_70b8cdc8","line":167,"updated":"2015-10-08 06:25:47.000000000","message":"tenant-id cannot be empty.  How about changing it to \n\n\u0027validate\u0027: {\u0027type:not_empty_string\u0027: attr.TENANT_ID_MAX_LEN},\n\nRelated changes in LBaaS: https://review.openstack.org/#/c/219250/2","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"b6802d60d581842df7d7eb9519371edcab1b998a","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":165,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":166,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":167,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":168,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":169,"context_line":"        \u0027ethertype\u0027: {"},{"line_number":170,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_bc1ee209","line":167,"in_reply_to":"7a2fa921_646779b7","updated":"2015-10-09 20:00:14.000000000","message":"agree this will be addressed later","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"da2543d00dd18b1b0fa376ef7f18ae4aa81a9af9","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":165,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":166,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":167,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":168,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":169,"context_line":"        \u0027ethertype\u0027: {"},{"line_number":170,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_887695a2","line":167,"in_reply_to":"7a2fa921_70b8cdc8","updated":"2015-10-08 16:54:23.000000000","message":"Almost all resources defined in Neutron API use \"type:string\".\nI think it is better to change it at once if the change is required.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":165,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":166,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":167,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":168,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":169,"context_line":"        \u0027ethertype\u0027: {"},{"line_number":170,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_877c22b6","line":167,"in_reply_to":"7a2fa921_70b8cdc8","updated":"2015-10-09 00:32:41.000000000","message":"agreed as akihiro\u0027s suggestion. Since the validate field in most neutron projects declared as type:string, I think it is better to keep the use of tenant_id validate the same as other project.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2ae62fa9aeb212811617418e15f1b83f9aa9a75b","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":165,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":166,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":167,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":168,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":169,"context_line":"        \u0027ethertype\u0027: {"},{"line_number":170,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_646779b7","line":167,"in_reply_to":"7a2fa921_877c22b6","updated":"2015-10-09 03:08:50.000000000","message":"Agreed. This change needs to be addressed at much broader level.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":165,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":166,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":167,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":168,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":169,"context_line":"        \u0027ethertype\u0027: {"},{"line_number":170,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_274c2e9d","line":167,"in_reply_to":"7a2fa921_887695a2","updated":"2015-10-09 00:32:41.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d4ae92b58836b147c07f58080e4ba3a227ddb32b","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        return resource_helper.build_resource_info("},{"line_number":265,"context_line":"            plural_mappings,"},{"line_number":266,"context_line":"            RESOURCE_ATTRIBUTE_MAP,"},{"line_number":267,"context_line":"            FLOW_CLASSIFIER_EXT)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def get_extended_resources(self, version):"},{"line_number":270,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_1d69908b","line":267,"updated":"2015-10-07 15:26:59.000000000","message":"Need to register quota here i.e. pass  register_quota\u003dTrue.\n\nRefer to https://review.openstack.org/#/c/231246 for details.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4de1473ef258697d89c861a269f5bdb14c254a23","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        return resource_helper.build_resource_info("},{"line_number":265,"context_line":"            plural_mappings,"},{"line_number":266,"context_line":"            RESOURCE_ATTRIBUTE_MAP,"},{"line_number":267,"context_line":"            FLOW_CLASSIFIER_EXT)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def get_extended_resources(self, version):"},{"line_number":270,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_6a80ed46","line":267,"in_reply_to":"7a2fa921_1d69908b","updated":"2015-10-07 18:25:51.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        return resource_helper.build_resource_info("},{"line_number":265,"context_line":"            plural_mappings,"},{"line_number":266,"context_line":"            RESOURCE_ATTRIBUTE_MAP,"},{"line_number":267,"context_line":"            FLOW_CLASSIFIER_EXT)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def get_extended_resources(self, version):"},{"line_number":270,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_72e50636","line":267,"in_reply_to":"7a2fa921_1d69908b","updated":"2015-10-09 00:32:41.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0de1d14c514430c8dbdc9a63204ec810491e05d0","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":176,"context_line":"            \u0027convert_to\u0027: normalise_protocol},"},{"line_number":177,"context_line":"        \u0027source_port_range_min\u0027: {"},{"line_number":178,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":179,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":180,"context_line":"            \u0027convert_to\u0027: normalise_port_value},"},{"line_number":181,"context_line":"        \u0027source_port_range_max\u0027: {"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_d697e7e9","line":178,"updated":"2015-10-11 06:58:06.000000000","message":"I think we need to revisit the update restriction for most of the attributes. Please note FWaaS allows update for most of the classifier attributes.\n * FWaaS: https://github.com/openstack/neutron-fwaas/blob/master/neutron_fwaas/extensions/firewall.py#L239-L290)","commit_id":"ab97ffd6361de64471e894ac83498da36da7b4d0"}],"networking_sfc/extensions/portchain.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"class PortChainInvalidParameter(neutron_exc.InvalidInput):"},{"line_number":50,"context_line":"    message \u003d _("},{"line_number":51,"context_line":"        \"chain parameter (%%(key)s, %%(value)s) is not \""},{"line_number":52,"context_line":"        \"in supported parameter list %(supported_paramters)s\""},{"line_number":53,"context_line":"    ) % {\u0027supported_paramters\u0027: SUPPORTED_CHAIN_PARAMETERS}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_0cd78324","line":52,"updated":"2015-10-01 14:14:02.000000000","message":"\"is not supported. Valid parameters are %(supported_parameters)s\"","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":49,"context_line":"class PortChainInvalidParameter(neutron_exc.InvalidInput):"},{"line_number":50,"context_line":"    message \u003d _("},{"line_number":51,"context_line":"        \"chain parameter (%%(key)s, %%(value)s) is not \""},{"line_number":52,"context_line":"        \"in supported parameter list %(supported_paramters)s\""},{"line_number":53,"context_line":"    ) % {\u0027supported_paramters\u0027: SUPPORTED_CHAIN_PARAMETERS}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_4db5597c","line":52,"in_reply_to":"9a1a9d01_0cd78324","updated":"2015-10-02 05:48:01.000000000","message":"+1.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":49,"context_line":"class PortChainInvalidParameter(neutron_exc.InvalidInput):"},{"line_number":50,"context_line":"    message \u003d _("},{"line_number":51,"context_line":"        \"chain parameter (%%(key)s, %%(value)s) is not \""},{"line_number":52,"context_line":"        \"in supported parameter list %(supported_paramters)s\""},{"line_number":53,"context_line":"    ) % {\u0027supported_paramters\u0027: SUPPORTED_CHAIN_PARAMETERS}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_a1051915","line":52,"in_reply_to":"9a1a9d01_4db5597c","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \u0027name\u0027: {"},{"line_number":133,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":137,"context_line":"            \u0027default\u0027: None},"},{"line_number":138,"context_line":"        \u0027description\u0027: {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_0cba23c1","line":135,"updated":"2015-10-01 14:14:02.000000000","message":"It is better to specify the maximum length for \"name\" rather than None.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \u0027name\u0027: {"},{"line_number":133,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":137,"context_line":"            \u0027default\u0027: None},"},{"line_number":138,"context_line":"        \u0027description\u0027: {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_2dad8531","line":135,"in_reply_to":"9a1a9d01_0cba23c1","updated":"2015-10-02 05:48:01.000000000","message":"Will add length constrain. Already captured previously as a parent patch but not reworked still.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \u0027name\u0027: {"},{"line_number":133,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":137,"context_line":"            \u0027default\u0027: None},"},{"line_number":138,"context_line":"        \u0027description\u0027: {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_45ce8884","line":135,"in_reply_to":"9a1a9d01_2dad8531","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6c4abffe53f0ce3e4e20c130aa3b800e4c13425","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":137,"context_line":"            \u0027default\u0027: None},"},{"line_number":138,"context_line":"        \u0027description\u0027: {"},{"line_number":139,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_7c301108","line":136,"updated":"2015-10-02 02:55:11.000000000","message":"as with my comments in flowclassifier.py i think it would be \nbetter to rename all  convert_validate_xyz functions to normalise_xyz or a more explicit name.\neg instead of convert_validate_string\n\nnormalise_string or convert_none_to_empty_string","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":137,"context_line":"            \u0027default\u0027: None},"},{"line_number":138,"context_line":"        \u0027description\u0027: {"},{"line_number":139,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_25c5945a","line":136,"in_reply_to":"9a1a9d01_0db0c18a","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":137,"context_line":"            \u0027default\u0027: None},"},{"line_number":138,"context_line":"        \u0027description\u0027: {"},{"line_number":139,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_0db0c18a","line":136,"in_reply_to":"9a1a9d01_7c301108","updated":"2015-10-02 05:48:01.000000000","message":"+1.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        \u0027description\u0027: {"},{"line_number":139,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":140,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":141,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":142,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":143,"context_line":"        },"},{"line_number":144,"context_line":"        \u0027tenant_id\u0027: {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_acae977f","line":141,"updated":"2015-10-01 14:14:02.000000000","message":"ditto","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        \u0027description\u0027: {"},{"line_number":139,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":140,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":141,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":142,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":143,"context_line":"        },"},{"line_number":144,"context_line":"        \u0027tenant_id\u0027: {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_c5a058a8","line":141,"in_reply_to":"9a1a9d01_8d629115","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        \u0027description\u0027: {"},{"line_number":139,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":140,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":141,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":142,"context_line":"            \u0027convert_to\u0027: convert_validate_string,"},{"line_number":143,"context_line":"        },"},{"line_number":144,"context_line":"        \u0027tenant_id\u0027: {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_8d629115","line":141,"in_reply_to":"9a1a9d01_acae977f","updated":"2015-10-02 05:48:01.000000000","message":"Will add length constraint.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dbe59938fe4bb8c5cdcefa951bee64445fa2615d","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":145,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":146,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":147,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":148,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":149,"context_line":"        \u0027ingress\u0027: {"},{"line_number":150,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_8cc63348","line":147,"updated":"2015-10-01 14:14:02.000000000","message":"ditto","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d27f3f1b826ce94b575cc6994dd6a961919cf020","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":145,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":146,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":147,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":148,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":149,"context_line":"        \u0027ingress\u0027: {"},{"line_number":150,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_a5af6493","line":147,"in_reply_to":"9a1a9d01_0d7761d5","updated":"2015-10-02 10:53:35.000000000","message":"Done","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3ac9278289d5ce2df1cf41d5f88fce52e570b37f","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":145,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":146,"context_line":"            \u0027required_by_policy\u0027: True,"},{"line_number":147,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":148,"context_line":"            \u0027is_visible\u0027: True},"},{"line_number":149,"context_line":"        \u0027ingress\u0027: {"},{"line_number":150,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_0d7761d5","line":147,"in_reply_to":"9a1a9d01_8cc63348","updated":"2015-10-02 05:48:01.000000000","message":"Will change as suggested.","commit_id":"b25cb84650d72af2b8140d1a204c83570f9da726"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"PORT_CHAIN_EXT \u003d \"port_chain\""},{"line_number":36,"context_line":"PORT_CHAIN_PREFIX \u003d \"/networking_sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"SUPPORTED_CHAIN_PARAMETERS \u003d [(\u0027correlation\u0027, \u0027mpls\u0027)]"},{"line_number":39,"context_line":"DEFAULT_CHAIN_PARAMETER \u003d {\u0027correlation\u0027: \u0027mpls\u0027}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_cb55ce1d","line":36,"updated":"2015-10-06 12:54:37.000000000","message":"Move to constant.py","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":33,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"PORT_CHAIN_EXT \u003d \"port_chain\""},{"line_number":36,"context_line":"PORT_CHAIN_PREFIX \u003d \"/networking_sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"SUPPORTED_CHAIN_PARAMETERS \u003d [(\u0027correlation\u0027, \u0027mpls\u0027)]"},{"line_number":39,"context_line":"DEFAULT_CHAIN_PARAMETER \u003d {\u0027correlation\u0027: \u0027mpls\u0027}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_570e0a3c","line":36,"in_reply_to":"7a2fa921_cb55ce1d","updated":"2015-10-07 14:50:20.000000000","message":"Let it be here for the time-being.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    return parameters"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":126,"context_line":"    \u0027port_pairs\u0027: {"},{"line_number":127,"context_line":"        \u0027id\u0027: {"},{"line_number":128,"context_line":"            \u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_b0a32f9e","line":125,"updated":"2015-10-06 06:29:29.000000000","message":"The attribute order (for example, of \"validate\", \"is_visible\", \"default\" and so on) looks random. Could you place them in the consistent ordering? It will ease the maintenance.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    return parameters"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":126,"context_line":"    \u0027port_pairs\u0027: {"},{"line_number":127,"context_line":"        \u0027id\u0027: {"},{"line_number":128,"context_line":"            \u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_090076a9","line":125,"in_reply_to":"7a2fa921_b0a32f9e","updated":"2015-10-07 14:50:20.000000000","message":"Done","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    return parameters"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":126,"context_line":"    \u0027port_pairs\u0027: {"},{"line_number":127,"context_line":"        \u0027id\u0027: {"},{"line_number":128,"context_line":"            \u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_8b36f601","line":125,"in_reply_to":"7a2fa921_b0a32f9e","updated":"2015-10-06 12:54:37.000000000","message":"Ok","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8eed7b567ac4040b8e8b784284126fc7a51b4c30","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.NAME_MAX_LEN},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: normalise_string,"},{"line_number":137,"context_line":"            \u0027default\u0027: None},"},{"line_number":138,"context_line":"        \u0027description\u0027: {"},{"line_number":139,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":140,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_69b56aec","line":137,"updated":"2015-10-07 14:50:20.000000000","message":"Defined twice. Remove One!","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dd07ad054501c89d5a8bba8844ee867c495e0527","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"@six.add_metaclass(ABCMeta)"},{"line_number":301,"context_line":"class PortChainPluginBase(service_base.ServicePluginBase):"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def get_plugin_name(self):"},{"line_number":304,"context_line":"        return \u0027port_chain\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_709fd75f","line":301,"updated":"2015-10-06 06:29:29.000000000","message":"I am confusing with the fact that you are adding two service plugins. Is it intended? How about adding one service plugin for SFC and support related extensions in the SFC plugin?","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8a878857cc709490b53b46dbe33be5cc173e31ca","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"@six.add_metaclass(ABCMeta)"},{"line_number":301,"context_line":"class PortChainPluginBase(service_base.ServicePluginBase):"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def get_plugin_name(self):"},{"line_number":304,"context_line":"        return \u0027port_chain\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_3214eb42","line":301,"in_reply_to":"7a2fa921_063f3bb5","updated":"2015-10-06 15:58:23.000000000","message":"Ah,. I understood the background. I think the extension support is pluggable, and personally I don\u0027t think we need to have separate plugins per extension. When the flow classifier feature is implemented in Neutron core, you can simply remove the flow classifiers from the supported extensions list in the service chaining plugin and call methods from neutron core plugin(?). What is your thought?","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":11907,"name":"cathy","email":"cathy.h.zhang@huawei.com","username":"cathy"},"change_message_id":"163ecd86f3788168e07ff9328535aa38e912be35","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"@six.add_metaclass(ABCMeta)"},{"line_number":301,"context_line":"class PortChainPluginBase(service_base.ServicePluginBase):"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def get_plugin_name(self):"},{"line_number":304,"context_line":"        return \u0027port_chain\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_594bbc87","line":301,"in_reply_to":"7a2fa921_3214eb42","updated":"2015-10-07 00:29:13.000000000","message":"We have made the flow classifier independent of the service chain. If people see a  fit, this flow classifier feature can be moved to Neutron core after it is fully tested and reviewed, and maybe extended in Neutron core to be used for other features. I think it is better now to separate the flow classifier API, DB, and testing codes from the SFC API codes. If no objection, I can take this action item and at the same time incorporate some new code update.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d459dfdb5f840e088e3b372166aba5b014123c36","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"@six.add_metaclass(ABCMeta)"},{"line_number":301,"context_line":"class PortChainPluginBase(service_base.ServicePluginBase):"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def get_plugin_name(self):"},{"line_number":304,"context_line":"        return \u0027port_chain\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_72a48aa5","line":301,"in_reply_to":"7a2fa921_594bbc87","updated":"2015-10-07 05:18:13.000000000","message":"One thing to note.\n\nHaving two service plugins is different from separating the flow classifier API/DB and related stuff from the main SFC code. As you see in extension test codes in the neutron repository, extensions are tested separately.\n\nI just commented that we don\u0027t need to use two service plugins: the one for the flow classifier and the other for other SFC stuffs.\n\nI don\u0027t want to stick this discussion and I don\u0027t want to slow down the progress. We can go with the current model. I can investigate the code and if necessary I will propose a patch to convert plugins into a single service plugin.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0135238af9dd8fac41575ccc4f53ac64c7746e7","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"@six.add_metaclass(ABCMeta)"},{"line_number":301,"context_line":"class PortChainPluginBase(service_base.ServicePluginBase):"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def get_plugin_name(self):"},{"line_number":304,"context_line":"        return \u0027port_chain\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_063f3bb5","line":301,"in_reply_to":"7a2fa921_709fd75f","updated":"2015-10-06 12:54:37.000000000","message":"I think Flow-classifier is being designed as a generic model. Better to have it separate plug-in\u0027s. \n\nBut as you suggested, we will only use one service plug-in call port-chain having both the extension\u0027s.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"958eb8a0e4b27dac7f4845fbb1d15789929afaea","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"@six.add_metaclass(ABCMeta)"},{"line_number":301,"context_line":"class PortChainPluginBase(service_base.ServicePluginBase):"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def get_plugin_name(self):"},{"line_number":304,"context_line":"        return \u0027port_chain\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_124e7696","line":301,"in_reply_to":"7a2fa921_72a48aa5","updated":"2015-10-07 05:41:13.000000000","message":"@Akihiro: I agree with you... but IMO, let\u0027s just keep this as it is for now.. and come back to this later.\n\n@Cathy: I do agree that this code can be reused during general classifier development. Having a separate patch for flow-classifier only will make it really simple for the reference.","commit_id":"8dc4e4e2d56c704627e00acac14258c891f37eb6"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"48d6d36a9e1c683dff64ecf92dd256d0d2220511","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_e24aefc4","line":64,"updated":"2015-10-07 15:14:38.000000000","message":"Port pair groups \u003d\u003e Port pair group","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"428f7c66b09c043f296abaf2f9faa6759126a3a7","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_38ebdee0","line":64,"in_reply_to":"7a2fa921_143ef4c0","updated":"2015-10-09 08:40:17.000000000","message":"I feel having port chain information would be beneficial and help debugging.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9a6d3008d1dc9d315f53844d50db38f3eb1ef608","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_2f4a8755","line":64,"in_reply_to":"7a2fa921_1bada39a","updated":"2015-10-10 07:03:10.000000000","message":"Ok. I have no issues, if you feel it can be deduced b6 other means.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"d819e6bc40ed4e2a918c9578c47b56fce517b9c9","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_1bada39a","line":64,"in_reply_to":"7a2fa921_38ebdee0","updated":"2015-10-09 17:12:30.000000000","message":"Agree. But the difficulty is when the exception raises, the code is hard to know what port chain it belongs to. And I do not think it deserve to hack the validation code to get the portchain id for just this purpose.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2ae62fa9aeb212811617418e15f1b83f9aa9a75b","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_a41fd106","line":64,"in_reply_to":"7a2fa921_528faa29","updated":"2015-10-09 03:08:50.000000000","message":"@xiaodongwang: How about a different msg:\n\nmessage \u003d _(\"Port pair group not specified for the port chain %(id)s.\")","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4de1473ef258697d89c861a269f5bdb14c254a23","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_2aac35ec","line":64,"in_reply_to":"7a2fa921_5d79482e","updated":"2015-10-07 18:25:51.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_52a80a8d","line":64,"in_reply_to":"7a2fa921_5d79482e","updated":"2015-10-09 00:32:41.000000000","message":"the exception is raised in port_chain port_pair_groups field validation. The validation function do not know which port chain the port pair groups should belong to.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ac4d8deeb8be87b2ae6122cb742309cca91ace7","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_143ef4c0","line":64,"in_reply_to":"7a2fa921_a41fd106","updated":"2015-10-09 05:06:21.000000000","message":"Two things:\n1, I think msg like `Port pair groups not specified ...\u0027 may be better as port chain should accept port pair groups. But I am OK to rename to `Port pair group ...\u0027.\n2. The exception raises in api validation, the validation function only have parameter of list of port pair group. at that point it does not know which port chain  it belongs to. If you insist the exception msg should contain port chain id, I can move the raising to portchain_db but it conflicts with the principal that raising exception as early as possible.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_528faa29","line":64,"in_reply_to":"7a2fa921_e24aefc4","updated":"2015-10-09 00:32:41.000000000","message":"I think the port pair groups is better since it means the expected input should be the list of port pair group, not a port pair group.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d4ae92b58836b147c07f58080e4ba3a227ddb32b","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_5d79482e","line":64,"in_reply_to":"7a2fa921_e24aefc4","updated":"2015-10-07 15:26:59.000000000","message":"I think we can make this error more meaningful:\n\nmessage \u003d _(\"Port pair group not specified for port chain %(id)s.\")","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e92df0e07b3f34dda99abdd6e81e80d7e16c3b86","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":143,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":145,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":146,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":147,"context_line":"        \u0027ingress\u0027: {"},{"line_number":148,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_30e575db","line":145,"updated":"2015-10-08 06:25:47.000000000","message":"tenant-id cannot be empty. How about changing it to\n\n\u0027validate\u0027: {\u0027type:not_empty_string\u0027: attr.TENANT_ID_MAX_LEN},\n\nRelated changes in LBaaS: https://review.openstack.org/#/c/219250/2","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":143,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":145,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":146,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":147,"context_line":"        \u0027ingress\u0027: {"},{"line_number":148,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_f27fd614","line":145,"in_reply_to":"7a2fa921_30e575db","updated":"2015-10-09 00:32:41.000000000","message":"see commit in flowclassifier.py","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"d819e6bc40ed4e2a918c9578c47b56fce517b9c9","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":143,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":145,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":146,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":147,"context_line":"        \u0027ingress\u0027: {"},{"line_number":148,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_fbe547db","line":145,"in_reply_to":"7a2fa921_84e975e8","updated":"2015-10-09 17:12:30.000000000","message":"Do you suggest to change to \u0027type:not_empty_string\u0027? I think you are agreed it should follow the convention that most other projects did.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2ae62fa9aeb212811617418e15f1b83f9aa9a75b","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":143,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":145,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":146,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":147,"context_line":"        \u0027ingress\u0027: {"},{"line_number":148,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_84e975e8","line":145,"in_reply_to":"7a2fa921_f27fd614","updated":"2015-10-09 03:08:50.000000000","message":"request you to check my view at flowclassifier.py","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"b6802d60d581842df7d7eb9519371edcab1b998a","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":143,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":145,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":146,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":147,"context_line":"        \u0027ingress\u0027: {"},{"line_number":148,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_9c7a06bc","line":145,"in_reply_to":"7a2fa921_fbe547db","updated":"2015-10-09 20:00:14.000000000","message":"this will addressed when this convention is adopted by neutron","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e92df0e07b3f34dda99abdd6e81e80d7e16c3b86","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":178,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":179,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":180,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":181,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":182,"context_line":"        \u0027port_pair_groups\u0027: {"},{"line_number":183,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_f0d37d02","line":180,"updated":"2015-10-08 06:25:47.000000000","message":"ditto.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":178,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":179,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":180,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":181,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":182,"context_line":"        \u0027port_pair_groups\u0027: {"},{"line_number":183,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_1285b205","line":180,"in_reply_to":"7a2fa921_f0d37d02","updated":"2015-10-09 00:32:41.000000000","message":"ditto","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e92df0e07b3f34dda99abdd6e81e80d7e16c3b86","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":215,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":217,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":218,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":219,"context_line":"        \u0027port_pairs\u0027: {"},{"line_number":220,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_10d159fa","line":217,"updated":"2015-10-08 06:25:47.000000000","message":"ditto.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":215,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":217,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.TENANT_ID_MAX_LEN},"},{"line_number":218,"context_line":"            \u0027required_by_policy\u0027: True},"},{"line_number":219,"context_line":"        \u0027port_pairs\u0027: {"},{"line_number":220,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_72742635","line":217,"in_reply_to":"7a2fa921_10d159fa","updated":"2015-10-09 00:32:41.000000000","message":"ditto","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d4ae92b58836b147c07f58080e4ba3a227ddb32b","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        return resource_helper.build_resource_info("},{"line_number":276,"context_line":"            plural_mappings,"},{"line_number":277,"context_line":"            RESOURCE_ATTRIBUTE_MAP,"},{"line_number":278,"context_line":"            PORT_CHAIN_EXT)"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def get_extended_resources(self, version):"},{"line_number":281,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_fdf294d1","line":278,"updated":"2015-10-07 15:26:59.000000000","message":"Need to register quota here i.e. pass register_quota\u003dTrue.\n\nRefer to https://review.openstack.org/#/c/231246 for details.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4de1473ef258697d89c861a269f5bdb14c254a23","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        return resource_helper.build_resource_info("},{"line_number":276,"context_line":"            plural_mappings,"},{"line_number":277,"context_line":"            RESOURCE_ATTRIBUTE_MAP,"},{"line_number":278,"context_line":"            PORT_CHAIN_EXT)"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def get_extended_resources(self, version):"},{"line_number":281,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_8a830956","line":278,"in_reply_to":"7a2fa921_fdf294d1","updated":"2015-10-07 18:25:51.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"3ab3c9a3dc0bffcc9ef61c42c0f3da7f13c0c906","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        return resource_helper.build_resource_info("},{"line_number":276,"context_line":"            plural_mappings,"},{"line_number":277,"context_line":"            RESOURCE_ATTRIBUTE_MAP,"},{"line_number":278,"context_line":"            PORT_CHAIN_EXT)"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def get_extended_resources(self, version):"},{"line_number":281,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_d2a2da98","line":278,"in_reply_to":"7a2fa921_fdf294d1","updated":"2015-10-09 00:32:41.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    return value"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def normalise_port_pair_groups(port_pair_groups):"},{"line_number":99,"context_line":"    port_pair_groups \u003d attr.convert_none_to_empty_list(port_pair_groups)"},{"line_number":100,"context_line":"    if not port_pair_groups:"},{"line_number":101,"context_line":"        raise PortChainEmptyPortPairGroups()"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_2a677026","line":98,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    return value"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def normalise_port_pair_groups(port_pair_groups):"},{"line_number":99,"context_line":"    port_pair_groups \u003d attr.convert_none_to_empty_list(port_pair_groups)"},{"line_number":100,"context_line":"    if not port_pair_groups:"},{"line_number":101,"context_line":"        raise PortChainEmptyPortPairGroups()"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_5fca704f","line":98,"in_reply_to":"5a2ca52d_2a677026","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    return port_pair_groups"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def normalise_chain_parameters(parameters):"},{"line_number":106,"context_line":"    parameters \u003d attr.convert_none_to_empty_dict(parameters)"},{"line_number":107,"context_line":"    if not parameters:"},{"line_number":108,"context_line":"        return DEFAULT_CHAIN_PARAMETER"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_8a7804c6","line":105,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    return port_pair_groups"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def normalise_chain_parameters(parameters):"},{"line_number":106,"context_line":"    parameters \u003d attr.convert_none_to_empty_dict(parameters)"},{"line_number":107,"context_line":"    if not parameters:"},{"line_number":108,"context_line":"        return DEFAULT_CHAIN_PARAMETER"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_ffc25c33","line":105,"in_reply_to":"5a2ca52d_8a7804c6","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    return parameters"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def normalise_sf_parameters(parameters):"},{"line_number":116,"context_line":"    parameters \u003d attr.convert_none_to_empty_dict(parameters)"},{"line_number":117,"context_line":"    if not parameters:"},{"line_number":118,"context_line":"        return DEFAULT_SF_PARAMETER"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_aa7380e6","line":115,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    return parameters"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def normalise_sf_parameters(parameters):"},{"line_number":116,"context_line":"    parameters \u003d attr.convert_none_to_empty_dict(parameters)"},{"line_number":117,"context_line":"    if not parameters:"},{"line_number":118,"context_line":"        return DEFAULT_SF_PARAMETER"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_1fc07829","line":115,"in_reply_to":"5a2ca52d_aa7380e6","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.NAME_MAX_LEN},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":137,"context_line":"        \u0027description\u0027: {"},{"line_number":138,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":139,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_0a4b9488","line":136,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":134,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":135,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.NAME_MAX_LEN},"},{"line_number":136,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":137,"context_line":"        \u0027description\u0027: {"},{"line_number":138,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":139,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_bfdf040c","line":136,"in_reply_to":"5a2ca52d_0a4b9488","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":139,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":140,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":141,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":142,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":143,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"            \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_2a4e9096","line":141,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":139,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":140,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":141,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":142,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":143,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"            \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_dfe440e2","line":141,"in_reply_to":"5a2ca52d_2a4e9096","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":157,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":158,"context_line":"            \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":159,"context_line":"            \u0027convert_to\u0027: normalise_sf_parameters},"},{"line_number":160,"context_line":"    },"},{"line_number":161,"context_line":"    \u0027port_chains\u0027: {"},{"line_number":162,"context_line":"        \u0027id\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_ca44bc75","line":159,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":157,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":158,"context_line":"            \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":159,"context_line":"            \u0027convert_to\u0027: normalise_sf_parameters},"},{"line_number":160,"context_line":"    },"},{"line_number":161,"context_line":"    \u0027port_chains\u0027: {"},{"line_number":162,"context_line":"        \u0027id\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_5fd110f9","line":159,"in_reply_to":"5a2ca52d_ca44bc75","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":169,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":170,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.NAME_MAX_LEN},"},{"line_number":171,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":172,"context_line":"        \u0027description\u0027: {"},{"line_number":173,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":174,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_ea473875","line":171,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":169,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":170,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.NAME_MAX_LEN},"},{"line_number":171,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":172,"context_line":"        \u0027description\u0027: {"},{"line_number":173,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":174,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_ffd9fc22","line":171,"in_reply_to":"5a2ca52d_ea473875","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":174,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":175,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":176,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":177,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":178,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":179,"context_line":"            \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_aa5aa04e","line":176,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":174,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":175,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":176,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":177,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":178,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":179,"context_line":"            \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_1fd718ee","line":176,"in_reply_to":"5a2ca52d_aa5aa04e","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":184,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":185,"context_line":"            \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":186,"context_line":"            \u0027convert_to\u0027: normalise_port_pair_groups},"},{"line_number":187,"context_line":"        \u0027flow_classifiers\u0027: {"},{"line_number":188,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":189,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_4a598c59","line":186,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":184,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":185,"context_line":"            \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":186,"context_line":"            \u0027convert_to\u0027: normalise_port_pair_groups},"},{"line_number":187,"context_line":"        \u0027flow_classifiers\u0027: {"},{"line_number":188,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":189,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_bf062484","line":186,"in_reply_to":"5a2ca52d_4a598c59","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":194,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":195,"context_line":"            \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":196,"context_line":"            \u0027convert_to\u0027: normalise_chain_parameters},"},{"line_number":197,"context_line":"    },"},{"line_number":198,"context_line":"    \u0027port_pair_groups\u0027: {"},{"line_number":199,"context_line":"        \u0027id\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_0a32b410","line":196,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":194,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":195,"context_line":"            \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":196,"context_line":"            \u0027convert_to\u0027: normalise_chain_parameters},"},{"line_number":197,"context_line":"    },"},{"line_number":198,"context_line":"    \u0027port_pair_groups\u0027: {"},{"line_number":199,"context_line":"        \u0027id\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_df0be08c","line":196,"in_reply_to":"5a2ca52d_0a32b410","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":206,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":207,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.NAME_MAX_LEN},"},{"line_number":208,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":209,"context_line":"        \u0027description\u0027: {"},{"line_number":210,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":211,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_2a3530f6","line":208,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":206,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":207,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.NAME_MAX_LEN},"},{"line_number":208,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":209,"context_line":"        \u0027description\u0027: {"},{"line_number":210,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":211,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_7ffc0c72","line":208,"in_reply_to":"5a2ca52d_2a3530f6","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":211,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":212,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":213,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":214,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":215,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"            \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_8a26c4cc","line":213,"updated":"2015-10-14 22:39:24.000000000","message":"normalise -\u003e normalize","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":211,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":212,"context_line":"            \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":213,"context_line":"            \u0027convert_to\u0027: normalise_string},"},{"line_number":214,"context_line":"        \u0027tenant_id\u0027: {"},{"line_number":215,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"            \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_9f01e86c","line":213,"in_reply_to":"5a2ca52d_8a26c4cc","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"1228b29a25fdb15296d1663ec9cb4cfccbaca17c","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        return \"Port Chains extension.\""},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    @classmethod"},{"line_number":253,"context_line":"    def get_namespace(cls):"},{"line_number":254,"context_line":"        return \"http://docs.openstack.org/ext/port_chains/api/v2.0\""},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_0a195488","line":253,"updated":"2015-10-14 22:39:24.000000000","message":"This method isn\u0027t needed. It\u0027s for XML API support.","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1de7f078968325f9b9749fe0652fbe6d69816c0a","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        return \"Port Chains extension.\""},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    @classmethod"},{"line_number":253,"context_line":"    def get_namespace(cls):"},{"line_number":254,"context_line":"        return \"http://docs.openstack.org/ext/port_chains/api/v2.0\""},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a2ca52d_fff01c93","line":253,"in_reply_to":"5a2ca52d_0a195488","updated":"2015-10-16 01:16:30.000000000","message":"Done","commit_id":"4f80f123c5f8d22d3280677323fb7b5616a88d43"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from abc import ABCMeta"},{"line_number":16,"context_line":"from abc import abstractmethod"},{"line_number":17,"context_line":"from gettext import gettext as _"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_63ee3724","line":17,"updated":"2015-10-19 07:52:43.000000000","message":"No need to import L17. Plz remove.","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"SUPPORTED_CHAIN_PARAMETERS \u003d [(\u0027correlation\u0027, \u0027mpls\u0027)]"},{"line_number":39,"context_line":"DEFAULT_CHAIN_PARAMETER \u003d {\u0027correlation\u0027: \u0027mpls\u0027}"},{"line_number":40,"context_line":"SUPPORTED_SF_PARAMETERS \u003d [(\u0027correlation\u0027, None)]"},{"line_number":41,"context_line":"DEFAULT_SF_PARAMETER \u003d {\u0027correlation\u0027: None}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_d06d8f33","line":40,"updated":"2015-10-19 07:52:43.000000000","message":"Addresss open-comment from : https://review.openstack.org/#/c/207251/33/networking_sfc/extensions/portchain.py","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":38,"context_line":"SUPPORTED_CHAIN_PARAMETERS \u003d [(\u0027correlation\u0027, \u0027mpls\u0027)]"},{"line_number":39,"context_line":"DEFAULT_CHAIN_PARAMETER \u003d {\u0027correlation\u0027: \u0027mpls\u0027}"},{"line_number":40,"context_line":"SUPPORTED_SF_PARAMETERS \u003d [(\u0027correlation\u0027, None)]"},{"line_number":41,"context_line":"DEFAULT_SF_PARAMETER \u003d {\u0027correlation\u0027: None}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Port Chain Exceptions"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_f06a0b1a","line":41,"updated":"2015-10-19 07:52:43.000000000","message":"ditto","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    message \u003d _(\"Port chain %(id)s not found.\")"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class PortChainInvalidParameter(neutron_exc.InvalidInput):"},{"line_number":50,"context_line":"    message \u003d _("},{"line_number":51,"context_line":"        \"Chain parameter does not support (%%(key)s, %%(value)s). \""},{"line_number":52,"context_line":"        \"Supported chain parameters are %(supported_paramters)s\""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_d0b02f8e","line":49,"updated":"2015-10-19 07:52:43.000000000","message":"Better to rename it as \"InvalidChainParameter\"","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    ) % {\u0027supported_paramters\u0027: SUPPORTED_CHAIN_PARAMETERS}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class PortPairInvalidParameter(neutron_exc.InvalidInput):"},{"line_number":57,"context_line":"    message \u003d _("},{"line_number":58,"context_line":"        \"Service function parameter does not support (%%(key)s, %%(value)s). \""},{"line_number":59,"context_line":"        \"Supported service function parameters are %(supported_paramters)s\""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_90aab718","line":56,"updated":"2015-10-19 07:52:43.000000000","message":"Better to rename as \"InvalidServiceChainParameter\"","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    ) % {\u0027supported_paramters\u0027: SUPPORTED_SF_PARAMETERS}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_3049638c","line":63,"updated":"2015-10-19 07:52:43.000000000","message":"Better to rename as \"PortPairGroupNotSpecified\"","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"6f0be26a74acf9cfc59975f32ba0eba028d4c9aa","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class PortChainEmptyPortPairGroups(neutron_exc.InvalidInput):"},{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_e2c31389","line":64,"updated":"2015-10-26 09:21:35.000000000","message":"Port pair groups \u003d\u003d\u003e Port pair group","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    message \u003d _(\"Port pair groups is empty.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class PortChainInvalidPortPairGroups(neutron_exc.InUse):"},{"line_number":68,"context_line":"    message \u003d _(\"Port pair groups %(port_pair_groups)s in use by \""},{"line_number":69,"context_line":"                \"port chain %(port_chain)s.\")"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_f0220bb9","line":67,"updated":"2015-10-19 07:52:43.000000000","message":"Better to rename as \"InvalidPortPairGroup\"","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    message \u003d _(\"Port pair %(id)s not found.\")"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class PortPairGroupNotFound(neutron_exc.NotFound):"},{"line_number":81,"context_line":"    message \u003d _(\"Port pair group %(id)s not found.\")"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_0309832c","line":80,"updated":"2015-10-19 07:52:43.000000000","message":"Lets put exception string together for a particular resource.","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"80a4e17b2468baa6cef079e3057de2257f8d6f32","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    message \u003d _(\"Port pair %(id)s in use.\")"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"def normalize_string(value):"},{"line_number":93,"context_line":"    if value is None:"},{"line_number":94,"context_line":"        return \u0027\u0027"},{"line_number":95,"context_line":"    return value"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_f0d8cbf1","line":92,"updated":"2015-10-19 07:52:43.000000000","message":"Already defined in \"https://review.openstack.org/#/c/233858/7/networking_sfc/extensions/sfcflowclassifier.py\" . Please use the existing function.","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"067597c34313be9009f9638d2f9d5ea3700a6fde","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        return resource_helper.build_resource_info("},{"line_number":268,"context_line":"            plural_mappings,"},{"line_number":269,"context_line":"            RESOURCE_ATTRIBUTE_MAP,"},{"line_number":270,"context_line":"            sfc_const.SFC_PLUGIN)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def get_extended_resources(self, version):"},{"line_number":273,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a2ca52d_abd32b03","line":270,"updated":"2015-10-16 14:20:33.000000000","message":"register_quota\u003dTrue","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"}],"networking_sfc/extensions/sfc.py":[{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"2a3152ac9e1a35ea4b6ad5bc967913c54b8801e3","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        return \"service function chains extension.\""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    @classmethod"},{"line_number":261,"context_line":"    def get_namespace(cls):"},{"line_number":262,"context_line":"        return \"http://docs.openstack.org/ext/sfcs/api/v2.0\""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_a0d87180","line":261,"updated":"2015-11-15 18:53:58.000000000","message":"Is there a reason for putting this method back in? I\u0027m pretty sure it isn\u0027t needed.","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4373f865eb71fd9fec057689a23f3bc2bc08c357","unresolved":false,"context_lines":[{"line_number":32,"context_line":"cfg.CONF.import_opt(\u0027api_extensions_path\u0027, \u0027neutron.common.config\u0027)"},{"line_number":33,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"SFC_EXT \u003d \"sfc\""},{"line_number":36,"context_line":"SFC_PREFIX \u003d \"/sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"SUPPORTED_CHAIN_PARAMETERS \u003d [(\u0027correlation\u0027, \u0027mpls\u0027)]"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_d3fadc74","line":35,"updated":"2015-12-08 06:44:56.000000000","message":"Found similar constants in \"networking_sfc/constants.py\" in the next dependent patch. Let\u0027s use that.\n\nhttps://review.openstack.org/#/c/233858/15/networking_sfc/constants.py","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"cfg.CONF.import_opt(\u0027api_extensions_path\u0027, \u0027neutron.common.config\u0027)"},{"line_number":33,"context_line":"neutron_ext.append_api_extensions_path(networking_sfc.extensions.__path__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"SFC_EXT \u003d \"sfc\""},{"line_number":36,"context_line":"SFC_PREFIX \u003d \"/sfc\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"SUPPORTED_CHAIN_PARAMETERS \u003d [(\u0027correlation\u0027, \u0027mpls\u0027)]"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_81637341","line":35,"in_reply_to":"7a740942_d3fadc74","updated":"2015-12-08 19:01:44.000000000","message":"Done","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"93bb69c57799b8d1f849c389633fc3d8cdb1335f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    message \u003d _(\"Port pair group is not specified in port chain\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class InvalidPortPairGroups(neutron_exc.InUse):"},{"line_number":68,"context_line":"    message \u003d _(\"Port pair groups %(port_pair_groups)s in use by \""},{"line_number":69,"context_line":"                \"port chain %(port_chain)s.\")"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_939d3468","line":67,"updated":"2015-12-08 06:35:28.000000000","message":"Almost same as InvalidPortPairGroups","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    message \u003d _(\"Port pair group is not specified in port chain\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class InvalidPortPairGroups(neutron_exc.InUse):"},{"line_number":68,"context_line":"    message \u003d _(\"Port pair groups %(port_pair_groups)s in use by \""},{"line_number":69,"context_line":"                \"port chain %(port_chain)s.\")"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_21539f6c","line":67,"in_reply_to":"7a740942_939d3468","updated":"2015-12-08 19:01:44.000000000","message":"Done","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"eef8b7dc423db31bad35e366ef8f5d1a92cb6895","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":154,"context_line":"            \u0027validate\u0027: {\u0027type:uuid\u0027: None}},"},{"line_number":155,"context_line":"        \u0027service_function_parameters\u0027: {"},{"line_number":156,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":157,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":158,"context_line":"            \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":159,"context_line":"            \u0027convert_to\u0027: normalize_sf_parameters},"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_a744bf1a","line":156,"updated":"2015-12-07 20:49:11.000000000","message":"What are your thoughts regarding the inability to update service function parameters?","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11907,"name":"cathy","email":"cathy.h.zhang@huawei.com","username":"cathy"},"change_message_id":"7cf0bd766b67af50aee21ef208f9297adfe97dbe","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":154,"context_line":"            \u0027validate\u0027: {\u0027type:uuid\u0027: None}},"},{"line_number":155,"context_line":"        \u0027service_function_parameters\u0027: {"},{"line_number":156,"context_line":"            \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":157,"context_line":"            \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":158,"context_line":"            \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":159,"context_line":"            \u0027convert_to\u0027: normalize_sf_parameters},"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_255444fd","line":156,"in_reply_to":"7a740942_a744bf1a","updated":"2015-12-07 21:50:43.000000000","message":"SF parameter currently only has encap which is a relatively static attribute. In the future we will add more SF parameters to support richer functionality and can open the SF parameters up for update with the new mechanisms put in place in the underlying control plane and data plane to support the dynamic change of the SF in a chain. For now, we will restrict the scope to basic support.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    @classmethod"},{"line_number":261,"context_line":"    def get_namespace(cls):"},{"line_number":262,"context_line":"        return \"http://docs.openstack.org/ext/sfcs/api/v2.0\""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @classmethod"},{"line_number":265,"context_line":"    def get_plugin_interface(cls):"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_c1e41bad","line":262,"updated":"2015-12-08 19:01:44.000000000","message":"+1","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"93bb69c57799b8d1f849c389633fc3d8cdb1335f","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    @classmethod"},{"line_number":261,"context_line":"    def get_namespace(cls):"},{"line_number":262,"context_line":"        return \"http://docs.openstack.org/ext/sfcs/api/v2.0\""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @classmethod"},{"line_number":265,"context_line":"    def get_plugin_interface(cls):"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_d37e5c18","line":262,"updated":"2015-12-08 06:35:28.000000000","message":"Is this link correct? Could not open it.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"2ba1825310de676173ce66921ca252a227b714d5","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    @classmethod"},{"line_number":261,"context_line":"    def get_namespace(cls):"},{"line_number":262,"context_line":"        return \"http://docs.openstack.org/ext/sfcs/api/v2.0\""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @classmethod"},{"line_number":265,"context_line":"    def get_plugin_interface(cls):"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_ff29cb9b","line":262,"in_reply_to":"7a740942_d37e5c18","updated":"2015-12-08 12:41:05.000000000","message":"The entire method is unnecessary. It\u0027s the XML namespace, but XML is deprecated in all of Neutron and we have no plans to add XML API support to networking-sfc.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"93bb69c57799b8d1f849c389633fc3d8cdb1335f","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        return \u0027sfc\u0027"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def get_plugin_description(self):"},{"line_number":306,"context_line":"        return \u0027Sfc service plugin for service chaining\u0027"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    @abstractmethod"},{"line_number":309,"context_line":"    def create_port_chain(self, context, port_chain):"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_b3a87078","line":306,"updated":"2015-12-08 06:35:28.000000000","message":"Sfc sounds redundant. \"Service Plugin for Service Function Chaining\" would be better.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"b4ad2da4fd2a174eddacff4bc092074efb0b8050","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        return \u0027sfc\u0027"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def get_plugin_description(self):"},{"line_number":306,"context_line":"        return \u0027Sfc service plugin for service chaining\u0027"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    @abstractmethod"},{"line_number":309,"context_line":"    def create_port_chain(self, context, port_chain):"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_f6f7c688","line":306,"in_reply_to":"7a740942_b3a87078","updated":"2015-12-08 06:57:50.000000000","message":"+1","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"e7de3046beb1b80b01ac3e7ca353bea088c66ab4","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        return \u0027sfc\u0027"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def get_plugin_description(self):"},{"line_number":306,"context_line":"        return \u0027Sfc service plugin for service chaining\u0027"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    @abstractmethod"},{"line_number":309,"context_line":"    def create_port_chain(self, context, port_chain):"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_9fd66e4d","line":306,"in_reply_to":"7a740942_b3a87078","updated":"2015-12-08 19:29:07.000000000","message":"Done","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        return SFC_EXT"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def get_plugin_description(self):"},{"line_number":316,"context_line":"        return \u0027Sfc service plugin for service chaining\u0027"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    @abstractmethod"},{"line_number":319,"context_line":"    def create_port_chain(self, context, port_chain):"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_1e61b539","line":316,"updated":"2015-12-17 14:55:49.000000000","message":"Sfc -\u003e SFC because it\u0027s an acronym and I assume this description is intended to be seen by the end user.","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        return SFC_EXT"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def get_plugin_description(self):"},{"line_number":316,"context_line":"        return \u0027Sfc service plugin for service chaining\u0027"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    @abstractmethod"},{"line_number":319,"context_line":"    def create_port_chain(self, context, port_chain):"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_0e55eb1b","line":316,"in_reply_to":"3a7e1126_1e61b539","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"}],"networking_sfc/tests/unit/db/test_portchain_db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"067597c34313be9009f9638d2f9d5ea3700a6fde","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"},{"line_number":5,"context_line":"#    a copy of the License at"},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a2ca52d_4b329760","line":3,"updated":"2015-10-16 14:20:33.000000000","message":"Add quota related test cases","commit_id":"44052fe111a6726755faca09a9953831d545a1cf"}],"networking_sfc/tests/unit/db/test_sfc_db.py":[{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"2a3152ac9e1a35ea4b6ad5bc967913c54b8801e3","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            fmt \u003d self.fmt"},{"line_number":66,"context_line":"        res \u003d self._create_port_chain(fmt, port_chain, **kwargs)"},{"line_number":67,"context_line":"        if res.status_int \u003e\u003d 400:"},{"line_number":68,"context_line":"            raise webob.exc.HTTPClientError(code\u003dres.status_int)"},{"line_number":69,"context_line":"        port_chain \u003d self.deserialize(fmt or self.fmt, res)"},{"line_number":70,"context_line":"        yield port_chain"},{"line_number":71,"context_line":"        if do_delete:"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_401ae518","line":68,"updated":"2015-11-15 18:53:58.000000000","message":"Isn\u0027t this fmt or self.fmt redundant with line 64-65?","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"81aea357bf199a04d1ad213c0ac48c84c890dfd1","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            fmt \u003d self.fmt"},{"line_number":66,"context_line":"        res \u003d self._create_port_chain(fmt, port_chain, **kwargs)"},{"line_number":67,"context_line":"        if res.status_int \u003e\u003d 400:"},{"line_number":68,"context_line":"            raise webob.exc.HTTPClientError(code\u003dres.status_int)"},{"line_number":69,"context_line":"        port_chain \u003d self.deserialize(fmt or self.fmt, res)"},{"line_number":70,"context_line":"        yield port_chain"},{"line_number":71,"context_line":"        if do_delete:"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_01e851e1","line":68,"in_reply_to":"da85f559_401ae518","updated":"2015-11-23 19:26:03.000000000","message":"I did not see where it is redundant. The code here to return correct value or exception based on the return of api.","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"2a3152ac9e1a35ea4b6ad5bc967913c54b8801e3","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            fmt \u003d self.fmt"},{"line_number":96,"context_line":"        res \u003d self._create_port_pair_group(fmt, port_pair_group, **kwargs)"},{"line_number":97,"context_line":"        if res.status_int \u003e\u003d 400:"},{"line_number":98,"context_line":"            raise webob.exc.HTTPClientError(code\u003dres.status_int)"},{"line_number":99,"context_line":"        port_pair_group \u003d self.deserialize(fmt or self.fmt, res)"},{"line_number":100,"context_line":"        yield port_pair_group"},{"line_number":101,"context_line":"        if do_delete:"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_80e76d11","line":98,"updated":"2015-11-15 18:53:58.000000000","message":"isn\u0027t this redundant with lines 94-95?","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"81aea357bf199a04d1ad213c0ac48c84c890dfd1","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            fmt \u003d self.fmt"},{"line_number":96,"context_line":"        res \u003d self._create_port_pair_group(fmt, port_pair_group, **kwargs)"},{"line_number":97,"context_line":"        if res.status_int \u003e\u003d 400:"},{"line_number":98,"context_line":"            raise webob.exc.HTTPClientError(code\u003dres.status_int)"},{"line_number":99,"context_line":"        port_pair_group \u003d self.deserialize(fmt or self.fmt, res)"},{"line_number":100,"context_line":"        yield port_pair_group"},{"line_number":101,"context_line":"        if do_delete:"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_c1f1e9ce","line":98,"in_reply_to":"da85f559_80e76d11","updated":"2015-11-23 19:26:03.000000000","message":"ditto","commit_id":"1e662b8688eef1a0e92f332fdbb0bf80be79bc06"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"aafa56af9ed2fe2f85e6f63ddad135d9b6963a00","unresolved":false,"context_lines":[{"line_number":1398,"context_line":"                    \u0027ports\u0027, src_port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":1399,"context_line":"                )"},{"line_number":1400,"context_line":"                res \u003d req.get_response(self.api)"},{"line_number":1401,"context_line":"                self.assertEqual(res.status_int, 500)"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    def test_delete_egress_port_pair_exist(self):"},{"line_number":1404,"context_line":"        with self.port("}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_abd9b058","line":1401,"updated":"2015-12-08 18:03:41.000000000","message":"Why is the server returning 500?","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":1398,"context_line":"                    \u0027ports\u0027, src_port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":1399,"context_line":"                )"},{"line_number":1400,"context_line":"                res \u003d req.get_response(self.api)"},{"line_number":1401,"context_line":"                self.assertEqual(res.status_int, 500)"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    def test_delete_egress_port_pair_exist(self):"},{"line_number":1404,"context_line":"        with self.port("}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_e17b57bc","line":1401,"in_reply_to":"7a740942_abd9b058","updated":"2015-12-08 19:01:44.000000000","message":"This is as currently implemented, can you suggest an option?","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"392c0e99df5101a5c849a5de1528d47f0d4617ed","unresolved":false,"context_lines":[{"line_number":1398,"context_line":"                    \u0027ports\u0027, src_port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":1399,"context_line":"                )"},{"line_number":1400,"context_line":"                res \u003d req.get_response(self.api)"},{"line_number":1401,"context_line":"                self.assertEqual(res.status_int, 500)"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    def test_delete_egress_port_pair_exist(self):"},{"line_number":1404,"context_line":"        with self.port("}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_3ad3c561","line":1401,"in_reply_to":"7a740942_e17b57bc","updated":"2015-12-08 20:42:15.000000000","message":"As it is not an internal server error and kind of denotes a conflict, like test_delete_port_pair_port_pair_group_exist, I would go for HTTP 409 as well.","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"aafa56af9ed2fe2f85e6f63ddad135d9b6963a00","unresolved":false,"context_lines":[{"line_number":1414,"context_line":"                    \u0027ports\u0027, dst_port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":1415,"context_line":"                )"},{"line_number":1416,"context_line":"                res \u003d req.get_response(self.api)"},{"line_number":1417,"context_line":"                self.assertEqual(res.status_int, 500)"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_4bdccc45","line":1417,"updated":"2015-12-08 18:03:41.000000000","message":"Why is the server returning 500?","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4e7ca8a066e41bbdb3761a2a357a8301242d783b","unresolved":false,"context_lines":[{"line_number":1414,"context_line":"                    \u0027ports\u0027, dst_port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":1415,"context_line":"                )"},{"line_number":1416,"context_line":"                res \u003d req.get_response(self.api)"},{"line_number":1417,"context_line":"                self.assertEqual(res.status_int, 500)"}],"source_content_type":"text/x-python","patch_set":40,"id":"7a740942_0162230a","line":1417,"in_reply_to":"7a740942_4bdccc45","updated":"2015-12-08 19:01:44.000000000","message":"ditto","commit_id":"87d39094debd6e2aad0a74fe3f8f3346dd8dc6d1"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from networking_sfc.tests.unit.db import test_flowclassifier_db"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"DB_SFC_PLUGIN_KLASS \u003d ("},{"line_number":38,"context_line":"    \"networking_sfc.db.sfc_db.SfcDbPlugin\""},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":"extensions_path \u003d \u0027:\u0027.join(extensions.__path__ + nextensions.__path__)"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_9eb12592","line":37,"range":{"start_line":37,"start_character":0,"end_line":37,"end_character":19},"updated":"2015-12-17 14:55:49.000000000","message":"KLASS? Shouldn\u0027t this be CLASS?","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from networking_sfc.tests.unit.db import test_flowclassifier_db"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"DB_SFC_PLUGIN_KLASS \u003d ("},{"line_number":38,"context_line":"    \"networking_sfc.db.sfc_db.SfcDbPlugin\""},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":"extensions_path \u003d \u0027:\u0027.join(extensions.__path__ + nextensions.__path__)"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_11b66a3d","line":37,"range":{"start_line":37,"start_character":0,"end_line":37,"end_character":19},"in_reply_to":"3a7e1126_9eb12592","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        self.mock_log \u003d mock_log_p.start()"},{"line_number":244,"context_line":"        cfg.CONF.register_opts(sfc.sfc_quota_opts, \u0027QUOTAS\u0027)"},{"line_number":245,"context_line":"        if not sfc_plugin:"},{"line_number":246,"context_line":"            sfc_plugin \u003d DB_SFC_PLUGIN_KLASS"},{"line_number":247,"context_line":"        if not flowclassifier_plugin:"},{"line_number":248,"context_line":"            flowclassifier_plugin \u003d ("},{"line_number":249,"context_line":"                test_flowclassifier_db.DB_FLOWCLASSIFIER_PLUGIN_KLASS)"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_594c3770","line":246,"range":{"start_line":246,"start_character":25,"end_line":246,"end_character":44},"updated":"2015-12-17 14:55:49.000000000","message":"KLASS -\u003e CLASS ?","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        self.mock_log \u003d mock_log_p.start()"},{"line_number":244,"context_line":"        cfg.CONF.register_opts(sfc.sfc_quota_opts, \u0027QUOTAS\u0027)"},{"line_number":245,"context_line":"        if not sfc_plugin:"},{"line_number":246,"context_line":"            sfc_plugin \u003d DB_SFC_PLUGIN_KLASS"},{"line_number":247,"context_line":"        if not flowclassifier_plugin:"},{"line_number":248,"context_line":"            flowclassifier_plugin \u003d ("},{"line_number":249,"context_line":"                test_flowclassifier_db.DB_FLOWCLASSIFIER_PLUGIN_KLASS)"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_b183d655","line":246,"range":{"start_line":246,"start_character":25,"end_line":246,"end_character":44},"in_reply_to":"3a7e1126_594c3770","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"59f479eb7da0da6ac9a4475259088b44c8d881d5","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            sfc_plugin \u003d DB_SFC_PLUGIN_KLASS"},{"line_number":247,"context_line":"        if not flowclassifier_plugin:"},{"line_number":248,"context_line":"            flowclassifier_plugin \u003d ("},{"line_number":249,"context_line":"                test_flowclassifier_db.DB_FLOWCLASSIFIER_PLUGIN_KLASS)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        service_plugins \u003d {"},{"line_number":252,"context_line":"            sfc.SFC_EXT: sfc_plugin,"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_f97163a9","line":249,"updated":"2015-12-17 14:55:49.000000000","message":"KLASS -\u003e CLASS ?","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"},{"author":{"_account_id":17540,"name":"xiaodongwang991481","email":"xiaodongwang991481@gmail.com","username":"xiaodongwang991481"},"change_message_id":"60accb881fe7bcc4e9bc575c20d04dab8d2179fe","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            sfc_plugin \u003d DB_SFC_PLUGIN_KLASS"},{"line_number":247,"context_line":"        if not flowclassifier_plugin:"},{"line_number":248,"context_line":"            flowclassifier_plugin \u003d ("},{"line_number":249,"context_line":"                test_flowclassifier_db.DB_FLOWCLASSIFIER_PLUGIN_KLASS)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        service_plugins \u003d {"},{"line_number":252,"context_line":"            sfc.SFC_EXT: sfc_plugin,"}],"source_content_type":"text/x-python","patch_set":43,"id":"3a7e1126_d186a264","line":249,"in_reply_to":"3a7e1126_f97163a9","updated":"2015-12-18 01:23:29.000000000","message":"Done","commit_id":"8242fcb35acdd890acb3b1c2ab6322799064e0e6"}],"networking_sfc/tests/unit/extensions/test_flowclassifier.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d4ae92b58836b147c07f58080e4ba3a227ddb32b","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                \u0027protocol\u0027)"},{"line_number":110,"context_line":"        }}"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def test_create_flow_classifier(self):"},{"line_number":113,"context_line":"        flowclassifier_id \u003d _uuid()"},{"line_number":114,"context_line":"        data \u003d {\u0027flow_classifier\u0027: {"},{"line_number":115,"context_line":"            \u0027tenant_id\u0027: _uuid(),"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_5dc70845","line":112,"updated":"2015-10-07 15:26:59.000000000","message":"Add quota related test cases. Refer to https://review.openstack.org/#/c/231246 for help.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4de1473ef258697d89c861a269f5bdb14c254a23","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                \u0027protocol\u0027)"},{"line_number":110,"context_line":"        }}"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def test_create_flow_classifier(self):"},{"line_number":113,"context_line":"        flowclassifier_id \u003d _uuid()"},{"line_number":114,"context_line":"        data \u003d {\u0027flow_classifier\u0027: {"},{"line_number":115,"context_line":"            \u0027tenant_id\u0027: _uuid(),"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_eae39d31","line":112,"in_reply_to":"7a2fa921_5dc70845","updated":"2015-10-07 18:25:51.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"}],"networking_sfc/tests/unit/extensions/test_portchain.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d4ae92b58836b147c07f58080e4ba3a227ddb32b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            \u0027tenant_id\u0027: data[\u0027port_chain\u0027][\u0027tenant_id\u0027]"},{"line_number":79,"context_line":"        }}"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_create_port_chain(self):"},{"line_number":82,"context_line":"        portchain_id \u003d _uuid()"},{"line_number":83,"context_line":"        data \u003d {\u0027port_chain\u0027: {"},{"line_number":84,"context_line":"            \u0027port_pair_groups\u0027: [_uuid()],"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_1dc1902e","line":81,"updated":"2015-10-07 15:26:59.000000000","message":"Add quota related test cases. Refer to https://review.openstack.org/#/c/231246 for help.","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"4de1473ef258697d89c861a269f5bdb14c254a23","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            \u0027tenant_id\u0027: data[\u0027port_chain\u0027][\u0027tenant_id\u0027]"},{"line_number":79,"context_line":"        }}"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_create_port_chain(self):"},{"line_number":82,"context_line":"        portchain_id \u003d _uuid()"},{"line_number":83,"context_line":"        data \u003d {\u0027port_chain\u0027: {"},{"line_number":84,"context_line":"            \u0027port_pair_groups\u0027: [_uuid()],"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_0ac6199a","line":81,"in_reply_to":"7a2fa921_1dc1902e","updated":"2015-10-07 18:25:51.000000000","message":"Done","commit_id":"38d5d057b59da1f905385f3d8ff4f1f2ea011289"}],"networking_sfc/tests/unit/neutron/extensions/test_flowclassifier.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d2459ee3d94501f77ca92e837c74847febb86ec0","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":11,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"import copy"},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"from webob import exc"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_c023ddbb","line":13,"updated":"2015-09-24 05:47:38.000000000","message":"Let\u0027s add one blank line for better readability.","commit_id":"82a9746f1e5f25aa1b1d7b38dbbcafea761845ef"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"2073d3c0f8b2288e1ea1559e92a886bad7182eb2","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":11,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"import copy"},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"from webob import exc"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_77ae4782","line":13,"in_reply_to":"ba15a1d1_c023ddbb","updated":"2015-09-24 12:57:44.000000000","message":"Done","commit_id":"82a9746f1e5f25aa1b1d7b38dbbcafea761845ef"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d2459ee3d94501f77ca92e837c74847febb86ec0","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"import copy"},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"from webob import exc"},{"line_number":17,"context_line":"import webtest"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_e00e213c","line":15,"updated":"2015-09-24 05:47:38.000000000","message":"I think neutron sub-folder is not required. \n\nThis file path could be just \u0027networking_sfc/tests/unit/extensions/test_flowclassifier.py\u0027\n\nThis change will make it consistent with the source code folder structure. Please note the source file resides inside \u0027networking_sfc/extensions/\u0027 directly instead of \u0027networking_sfc/neutron/extensions/\u0027","commit_id":"82a9746f1e5f25aa1b1d7b38dbbcafea761845ef"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"2073d3c0f8b2288e1ea1559e92a886bad7182eb2","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"import copy"},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"from webob import exc"},{"line_number":17,"context_line":"import webtest"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_97b19be2","line":15,"in_reply_to":"ba15a1d1_e00e213c","updated":"2015-09-24 12:57:44.000000000","message":"Done","commit_id":"82a9746f1e5f25aa1b1d7b38dbbcafea761845ef"}],"networking_sfc/tests/unit/neutron/extensions/test_portchain.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"d2459ee3d94501f77ca92e837c74847febb86ec0","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":11,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import copy"},{"line_number":16,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_80008503","line":13,"updated":"2015-09-24 05:47:38.000000000","message":"I think neutron sub-folder is not required. \n\nThis file path could be just \u0027networking_sfc/tests/unit/extensions/test_portchain.py\u0027\n\nThis change will make it consistent with the source code folder structure. Please note the source file resides inside \u0027networking_sfc/extensions/\u0027 directly instead of \u0027networking_sfc/neutron/extensions/\u0027","commit_id":"82a9746f1e5f25aa1b1d7b38dbbcafea761845ef"},{"author":{"_account_id":11313,"name":"Louis Fourie","email":"fouriehl70@gmail.com","username":"lfourie"},"change_message_id":"2073d3c0f8b2288e1ea1559e92a886bad7182eb2","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":11,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import copy"},{"line_number":16,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_b7dfff0b","line":13,"in_reply_to":"ba15a1d1_80008503","updated":"2015-09-24 12:57:44.000000000","message":"Done","commit_id":"82a9746f1e5f25aa1b1d7b38dbbcafea761845ef"}]}
