)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ce4f3313803b133f449fef05c11edfbe4987c578","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     James Dempsey \u003cjamesd@catalyst.net.nz\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-21 17:03:09 +1300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add description field to security group rules"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I6e1ef53d7aae7d04a5485810cc1db0a8eb125953"},{"line_number":10,"context_line":"Closes-Bug: #1483480"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a68dd71_11f9904d","line":7,"updated":"2016-01-21 21:50:07.000000000","message":"please see https://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"1ad5d93479bd56a4523d8ee82bd6f8f44f113c52"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"514e3ebb19138131df5c215910ab737912040b4e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     James Dempsey \u003cjamesd@catalyst.net.nz\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-21 17:03:09 +1300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add description field to security group rules"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I6e1ef53d7aae7d04a5485810cc1db0a8eb125953"},{"line_number":10,"context_line":"Closes-Bug: #1483480"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a68dd71_6f6baeb7","line":7,"in_reply_to":"9a68dd71_11f9904d","updated":"2016-01-26 01:37:52.000000000","message":"Will do.  Thanks.","commit_id":"1ad5d93479bd56a4523d8ee82bd6f8f44f113c52"}],"neutron/api/extensions.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"af026d9ca4b79829b9b0a8ebe52c0e827e3abc1f","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        other extensions that should still work for the remaining extensions"},{"line_number":159,"context_line":"        when one is missing."},{"line_number":160,"context_line":"        \"\"\""},{"line_number":161,"context_line":"        return []"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def update_attributes_map(self, extended_attributes,"},{"line_number":164,"context_line":"                              extension_attrs_map\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_221620f1","line":161,"updated":"2016-02-23 03:11:39.000000000","message":"I am blind: where you do use this?\n\nThat said, I have mixed feelings about this addition, even though I can see why you did it: this would enable this to work despite some missing resources. But can we actually expect secgroups and routers to be missing in any real deployment?\n\nWhen you came up with the model for standard attributes you did so to include routers and security groups. Isn\u0027t fair to assume that these are de facto at par with other core resources?","commit_id":"2d3da034b6e873fecb4bd220495a203ea5c9a292"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9ef3fcff1b087a54f630ec1cfb704d1d5d3a9256","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        other extensions that should still work for the remaining extensions"},{"line_number":159,"context_line":"        when one is missing."},{"line_number":160,"context_line":"        \"\"\""},{"line_number":161,"context_line":"        return []"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def update_attributes_map(self, extended_attributes,"},{"line_number":164,"context_line":"                              extension_attrs_map\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_50bb96c4","line":161,"updated":"2016-02-26 07:53:51.000000000","message":"Referenced on L447.\n\nI added them to standard attributes, but we still don\u0027t depend on them for standard attributes to work. It\u0027s quite feasible to deploy Neutron as ML2 only without the L3 plugin for provider networks...","commit_id":"2d3da034b6e873fecb4bd220495a203ea5c9a292"}],"neutron/db/db_base_plugin_common.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"af026d9ca4b79829b9b0a8ebe52c0e827e3abc1f","unresolved":false,"context_lines":[{"line_number":299,"context_line":"                \u0027subnetpool_id\u0027: subnetpool_id,"},{"line_number":300,"context_line":"                \u0027enable_dhcp\u0027: subnet[\u0027enable_dhcp\u0027],"},{"line_number":301,"context_line":"                \u0027gateway_ip\u0027: gateway_ip,"},{"line_number":302,"context_line":"                \u0027description\u0027: subnet.get(\u0027description\u0027)}"},{"line_number":303,"context_line":"        if subnet[\u0027ip_version\u0027] \u003d\u003d 6 and subnet[\u0027enable_dhcp\u0027]:"},{"line_number":304,"context_line":"            if attributes.is_attr_set(subnet[\u0027ipv6_ra_mode\u0027]):"},{"line_number":305,"context_line":"                args[\u0027ipv6_ra_mode\u0027] \u003d subnet[\u0027ipv6_ra_mode\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_62c14854","line":302,"updated":"2016-02-23 03:11:39.000000000","message":"isn\u0027t it possible to add this attribute using a db hook? What am I missing?","commit_id":"2d3da034b6e873fecb4bd220495a203ea5c9a292"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9ef3fcff1b087a54f630ec1cfb704d1d5d3a9256","unresolved":false,"context_lines":[{"line_number":299,"context_line":"                \u0027subnetpool_id\u0027: subnetpool_id,"},{"line_number":300,"context_line":"                \u0027enable_dhcp\u0027: subnet[\u0027enable_dhcp\u0027],"},{"line_number":301,"context_line":"                \u0027gateway_ip\u0027: gateway_ip,"},{"line_number":302,"context_line":"                \u0027description\u0027: subnet.get(\u0027description\u0027)}"},{"line_number":303,"context_line":"        if subnet[\u0027ip_version\u0027] \u003d\u003d 6 and subnet[\u0027enable_dhcp\u0027]:"},{"line_number":304,"context_line":"            if attributes.is_attr_set(subnet[\u0027ipv6_ra_mode\u0027]):"},{"line_number":305,"context_line":"                args[\u0027ipv6_ra_mode\u0027] \u003d subnet[\u0027ipv6_ra_mode\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_90b51ecf","line":302,"updated":"2016-02-26 07:53:51.000000000","message":"no, the description comes from the API payload the user has specified. DB hooks only give us the ability to add stuff derived internally.","commit_id":"2d3da034b6e873fecb4bd220495a203ea5c9a292"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9ef3fcff1b087a54f630ec1cfb704d1d5d3a9256","unresolved":false,"context_lines":[{"line_number":82,"context_line":"class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,"},{"line_number":83,"context_line":"                        neutron_plugin_base_v2.NeutronPluginBaseV2,"},{"line_number":84,"context_line":"                        rbac_mixin.RbacPluginMixin,"},{"line_number":85,"context_line":"                        stattr_db.StandardAttrDescriptionMixin):"},{"line_number":86,"context_line":"    \"\"\"V2 Neutron plugin interface implementation using SQLAlchemy models."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Whenever a non-read call happens the plugin will call an event handler"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_70b69add","line":85,"updated":"2016-02-26 07:53:51.000000000","message":"I\u0027ll look into switching to the mixout service plugin model you added. :)","commit_id":"2d3da034b6e873fecb4bd220495a203ea5c9a292"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"af026d9ca4b79829b9b0a8ebe52c0e827e3abc1f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,"},{"line_number":83,"context_line":"                        neutron_plugin_base_v2.NeutronPluginBaseV2,"},{"line_number":84,"context_line":"                        rbac_mixin.RbacPluginMixin,"},{"line_number":85,"context_line":"                        stattr_db.StandardAttrDescriptionMixin):"},{"line_number":86,"context_line":"    \"\"\"V2 Neutron plugin interface implementation using SQLAlchemy models."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Whenever a non-read call happens the plugin will call an event handler"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_628f882a","line":85,"updated":"2016-02-23 03:11:39.000000000","message":"please, pretty please, let\u0027s figure out a way not to rely on mixins anymore, especially when there\u0027s really no behavior being added here.","commit_id":"2d3da034b6e873fecb4bd220495a203ea5c9a292"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"af026d9ca4b79829b9b0a8ebe52c0e827e3abc1f","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    \u0027admin_state_up\u0027: n[\u0027admin_state_up\u0027],"},{"line_number":323,"context_line":"                    \u0027mtu\u0027: n.get(\u0027mtu\u0027, constants.DEFAULT_NETWORK_MTU),"},{"line_number":324,"context_line":"                    \u0027status\u0027: n.get(\u0027status\u0027, constants.NET_STATUS_ACTIVE),"},{"line_number":325,"context_line":"                    \u0027description\u0027: n.get(\u0027description\u0027)}"},{"line_number":326,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":327,"context_line":"            if n[\u0027shared\u0027]:"},{"line_number":328,"context_line":"                entry \u003d rbac_db.NetworkRBAC("}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_a2b7d0f3","line":325,"updated":"2016-02-23 03:11:39.000000000","message":"same question here in this file.","commit_id":"2d3da034b6e873fecb4bd220495a203ea5c9a292"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"6e04b6de5b47c459ecb94dabb36688bc8b6aceb3","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        for key in [\u0027id\u0027, \u0027name\u0027, \u0027ip_version\u0027, \u0027min_prefixlen\u0027,"},{"line_number":1032,"context_line":"                    \u0027max_prefixlen\u0027, \u0027default_prefixlen\u0027, \u0027is_default\u0027,"},{"line_number":1033,"context_line":"                    \u0027shared\u0027, \u0027default_quota\u0027, \u0027address_scope_id\u0027,"},{"line_number":1034,"context_line":"                    \u0027standard_attr\u0027]:"},{"line_number":1035,"context_line":"            self._write_key(key, updated, model, new_pool)"},{"line_number":1036,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETPOOLS,"},{"line_number":1037,"context_line":"                                          updated, model)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7af24918_083dbd8e","line":1034,"range":{"start_line":1034,"start_character":20,"end_line":1034,"end_character":37},"updated":"2016-03-03 23:40:59.000000000","message":"Why do you change it?\n\nThis patch doesn\u0027t allow us to update description of subnetpool ;)","commit_id":"322e89b7cfe98b010b84e032e9e1f0016846e70b"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"83b7b8d067a089ab9d7185cfd95dbf8b40e9c444","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        for key in [\u0027id\u0027, \u0027name\u0027, \u0027ip_version\u0027, \u0027min_prefixlen\u0027,"},{"line_number":1032,"context_line":"                    \u0027max_prefixlen\u0027, \u0027default_prefixlen\u0027, \u0027is_default\u0027,"},{"line_number":1033,"context_line":"                    \u0027shared\u0027, \u0027default_quota\u0027, \u0027address_scope_id\u0027,"},{"line_number":1034,"context_line":"                    \u0027standard_attr\u0027]:"},{"line_number":1035,"context_line":"            self._write_key(key, updated, model, new_pool)"},{"line_number":1036,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETPOOLS,"},{"line_number":1037,"context_line":"                                          updated, model)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7af24918_08bc9db9","line":1034,"range":{"start_line":1034,"start_character":20,"end_line":1034,"end_character":37},"in_reply_to":"7af24918_083dbd8e","updated":"2016-03-04 00:04:30.000000000","message":"Anyway, why does subnetpool fail?\n\nBecause other resources call _apply_dict_extend_functions() after updating DB and updated description is extracted in _extend_standard_attr_description(). On the other hand subnetpool calls _updated_subnetpool_dict() and _apply_dict_extend_functions() before updating DB and non-updated description is extracted in _extend_standard_attr_description().","commit_id":"322e89b7cfe98b010b84e032e9e1f0016846e70b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5d001b2d944d42f8b2337d2ccc61ad776b2b296b","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        for key in [\u0027id\u0027, \u0027name\u0027, \u0027ip_version\u0027, \u0027min_prefixlen\u0027,"},{"line_number":1032,"context_line":"                    \u0027max_prefixlen\u0027, \u0027default_prefixlen\u0027, \u0027is_default\u0027,"},{"line_number":1033,"context_line":"                    \u0027shared\u0027, \u0027default_quota\u0027, \u0027address_scope_id\u0027,"},{"line_number":1034,"context_line":"                    \u0027standard_attr\u0027]:"},{"line_number":1035,"context_line":"            self._write_key(key, updated, model, new_pool)"},{"line_number":1036,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETPOOLS,"},{"line_number":1037,"context_line":"                                          updated, model)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7af24918_f8e59cdb","line":1034,"range":{"start_line":1034,"start_character":20,"end_line":1034,"end_character":37},"in_reply_to":"7af24918_083dbd8e","updated":"2016-03-04 15:58:05.000000000","message":"Because the change you made to special case for descriptions already existing wasn\u0027t consistent with how all of the other descriptions were updated. I will need to fix the call to the extension function here.","commit_id":"322e89b7cfe98b010b84e032e9e1f0016846e70b"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"254644c42eb1a442cb590e7f7b9db6deb31a6eed","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        for key in [\u0027id\u0027, \u0027name\u0027, \u0027ip_version\u0027, \u0027min_prefixlen\u0027,"},{"line_number":1032,"context_line":"                    \u0027max_prefixlen\u0027, \u0027default_prefixlen\u0027, \u0027is_default\u0027,"},{"line_number":1033,"context_line":"                    \u0027shared\u0027, \u0027default_quota\u0027, \u0027address_scope_id\u0027,"},{"line_number":1034,"context_line":"                    \u0027standard_attr\u0027]:"},{"line_number":1035,"context_line":"            self._write_key(key, updated, model, new_pool)"},{"line_number":1036,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETPOOLS,"},{"line_number":1037,"context_line":"                                          updated, model)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7af24918_fb5c5df2","line":1034,"range":{"start_line":1034,"start_character":20,"end_line":1034,"end_character":37},"in_reply_to":"7af24918_f8e59cdb","updated":"2016-03-05 01:57:04.000000000","message":"make sense :)","commit_id":"322e89b7cfe98b010b84e032e9e1f0016846e70b"}],"neutron/db/l3_db.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"af026d9ca4b79829b9b0a8ebe52c0e827e3abc1f","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class L3_NAT_dbonly_mixin(l3.RouterPluginBase,"},{"line_number":136,"context_line":"                          st_attr.StandardAttrDescriptionMixin):"},{"line_number":137,"context_line":"    \"\"\"Mixin class to add L3/NAT router methods to db_base_plugin_v2.\"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    router_device_owners \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_e2a27898","line":136,"updated":"2016-02-23 03:11:39.000000000","message":"another of my pleas.","commit_id":"2d3da034b6e873fecb4bd220495a203ea5c9a292"}],"neutron/db/migration/alembic_migrations/versions/mitaka/contract/4ffceebfcdc_standard_desc.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e074ef1b661f823902e12b4ce07941887a6f427","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def migrate_values():"},{"line_number":52,"context_line":"    session \u003d sa.orm.Session(bind\u003dop.get_bind())"},{"line_number":53,"context_line":"    values \u003d []"},{"line_number":54,"context_line":"    for row in session.query(securitygroups).all():"},{"line_number":55,"context_line":"        values.append({\u0027id\u0027: row[0],"},{"line_number":56,"context_line":"                       \u0027description\u0027: row[1]})"},{"line_number":57,"context_line":"    with session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7af24918_c26c94d2","line":54,"range":{"start_line":54,"start_character":15,"end_line":54,"end_character":50},"updated":"2016-03-03 05:09:57.000000000","message":"I think .all() is unnecessary and should be avoided. session.query() is a generator. A returned list can be long, so it is better to use a generator.\n\n(but we are creating a list \"values\", so I am not sure how removing .all() contributes)","commit_id":"a84e9901d6e80c768f2af8f25e3cff75b25e228d"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ba6afc684882f4803833050f91696df2c14c1c0d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def migrate_values():"},{"line_number":52,"context_line":"    session \u003d sa.orm.Session(bind\u003dop.get_bind())"},{"line_number":53,"context_line":"    values \u003d []"},{"line_number":54,"context_line":"    for row in session.query(securitygroups).all():"},{"line_number":55,"context_line":"        values.append({\u0027id\u0027: row[0],"},{"line_number":56,"context_line":"                       \u0027description\u0027: row[1]})"},{"line_number":57,"context_line":"    with session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7af24918_42a9a423","line":54,"range":{"start_line":54,"start_character":15,"end_line":54,"end_character":50},"in_reply_to":"7af24918_c26c94d2","updated":"2016-03-03 05:16:01.000000000","message":"well it will cut the memory usage in half at least","commit_id":"a84e9901d6e80c768f2af8f25e3cff75b25e228d"}],"neutron/db/migration/alembic_migrations/versions/mitaka/expand/0e66c5227a8a_add_desc_to_secgroup_rule.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e074ef1b661f823902e12b4ce07941887a6f427","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"7af24918_6206601e","updated":"2016-03-03 05:09:57.000000000","message":"Is the filename correct? This migration add description field to standardattributes. It does not touch security group rule.\n\nIt seems the filenames needs to be swapped...","commit_id":"a84e9901d6e80c768f2af8f25e3cff75b25e228d"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ba6afc684882f4803833050f91696df2c14c1c0d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"7af24918_027afcbc","in_reply_to":"7af24918_6206601e","updated":"2016-03-03 05:16:01.000000000","message":"ah yes, this is old.","commit_id":"a84e9901d6e80c768f2af8f25e3cff75b25e228d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e074ef1b661f823902e12b4ce07941887a6f427","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Add desc to secgroup rule"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 0e66c5227a8a"},{"line_number":19,"context_line":"Revises: 2f9e956e7532"}],"source_content_type":"text/x-python","patch_set":21,"id":"7af24918_c21e545e","line":16,"updated":"2016-03-03 05:09:57.000000000","message":"Needs to update description too.","commit_id":"a84e9901d6e80c768f2af8f25e3cff75b25e228d"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ba6afc684882f4803833050f91696df2c14c1c0d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Add desc to secgroup rule"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 0e66c5227a8a"},{"line_number":19,"context_line":"Revises: 2f9e956e7532"}],"source_content_type":"text/x-python","patch_set":21,"id":"7af24918_4280848b","line":16,"in_reply_to":"7af24918_c21e545e","updated":"2016-03-03 05:16:01.000000000","message":"Done","commit_id":"a84e9901d6e80c768f2af8f25e3cff75b25e228d"}],"neutron/db/migration/alembic_migrations/versions/mitaka/expand/f2fd23c55f6c_add_desc_to_secgroup_rule.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"09fd7c5438c38c9ab42cecb7e78e167835efc489","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    ### commands auto generated by Alembic - please adjust! ###"},{"line_number":34,"context_line":"    op.add_column(\u0027securitygrouprules\u0027, sa.Column(\u0027description\u0027,"},{"line_number":35,"context_line":"                  sa.String(length\u003d255), nullable\u003dTrue))"},{"line_number":36,"context_line":"    ### end Alembic commands ###"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_69c4b05e","line":33,"updated":"2016-01-20 00:11:28.000000000","message":"I think this comment should be removed.","commit_id":"8872ba3c678c51f8905769da20957d80c9599086"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"09fd7c5438c38c9ab42cecb7e78e167835efc489","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    ### commands auto generated by Alembic - please adjust! ###"},{"line_number":34,"context_line":"    op.add_column(\u0027securitygrouprules\u0027, sa.Column(\u0027description\u0027,"},{"line_number":35,"context_line":"                  sa.String(length\u003d255), nullable\u003dTrue))"},{"line_number":36,"context_line":"    ### end Alembic commands ###"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_c9ab5c88","line":36,"updated":"2016-01-20 00:11:28.000000000","message":"ditto","commit_id":"8872ba3c678c51f8905769da20957d80c9599086"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ee73e5d1f3fe5415c58df6ef958d419c552e2cd3","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.add_column(\u0027securitygrouprules\u0027, sa.Column(\u0027description\u0027,"},{"line_number":34,"context_line":"                  sa.String(length\u003d255), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_4f00ef34","line":34,"updated":"2016-01-21 08:13:43.000000000","message":"How about using DESCRIPTION_MAX_LEN instead of 255?","commit_id":"1ad5d93479bd56a4523d8ee82bd6f8f44f113c52"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"514e3ebb19138131df5c215910ab737912040b4e","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.add_column(\u0027securitygrouprules\u0027, sa.Column(\u0027description\u0027,"},{"line_number":34,"context_line":"                  sa.String(length\u003d255), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_0f7a3288","line":34,"in_reply_to":"9a68dd71_4f00ef34","updated":"2016-01-26 01:37:52.000000000","message":"I used 255 because the vast majority of the other migrations use numeric constants, as opposed to symbolic ones.","commit_id":"1ad5d93479bd56a4523d8ee82bd6f8f44f113c52"}],"neutron/db/securitygroups_db.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"d32a75cc65ce6e4ad0cd0f1b5746f39808c09354","unresolved":false,"context_lines":[{"line_number":525,"context_line":"               \u0027security_group_id\u0027: [sgr[\u0027security_group_id\u0027]],"},{"line_number":526,"context_line":"               \u0027direction\u0027: [sgr[\u0027direction\u0027]]}"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        include_if_present \u003d [\u0027description\u0027, \u0027protocol\u0027, \u0027port_range_max\u0027,"},{"line_number":529,"context_line":"                              \u0027port_range_min\u0027, \u0027ethertype\u0027,"},{"line_number":530,"context_line":"                              \u0027remote_ip_prefix\u0027, \u0027remote_group_id\u0027]"},{"line_number":531,"context_line":"        for key in include_if_present:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_80d56344","line":528,"updated":"2016-01-21 01:45:42.000000000","message":"_make_security_group_rule_filter_dict is only used in  _check_for_duplicate_rules_in_db. If you add description here, you can create sg rules with same content but not the same description. I don\u0027t think that is an expected behavior.","commit_id":"9d6b57e1215eb84ea7bc70c812c9529bcea88feb"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"3b0cdbf736487928f11fa844d5c06353e1ed003b","unresolved":false,"context_lines":[{"line_number":525,"context_line":"               \u0027security_group_id\u0027: [sgr[\u0027security_group_id\u0027]],"},{"line_number":526,"context_line":"               \u0027direction\u0027: [sgr[\u0027direction\u0027]]}"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        include_if_present \u003d [\u0027description\u0027, \u0027protocol\u0027, \u0027port_range_max\u0027,"},{"line_number":529,"context_line":"                              \u0027port_range_min\u0027, \u0027ethertype\u0027,"},{"line_number":530,"context_line":"                              \u0027remote_ip_prefix\u0027, \u0027remote_group_id\u0027]"},{"line_number":531,"context_line":"        for key in include_if_present:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_60606f36","line":528,"in_reply_to":"9a68dd71_80d56344","updated":"2016-01-21 03:35:12.000000000","message":"Agreed, I think there is no value in two identical rules with different descriptions.  Thanks for pointing this out.","commit_id":"9d6b57e1215eb84ea7bc70c812c9529bcea88feb"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9ef3fcff1b087a54f630ec1cfb704d1d5d3a9256","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        # below to check for these corner cases."},{"line_number":560,"context_line":"        for db_rule in db_rules:"},{"line_number":561,"context_line":"            # need to remove id from db_rule for matching"},{"line_number":562,"context_line":"            id \u003d db_rule.pop(\u0027id\u0027)"},{"line_number":563,"context_line":"            if (security_group_rule[\u0027security_group_rule\u0027] \u003d\u003d db_rule):"},{"line_number":564,"context_line":"                raise ext_sg.SecurityGroupRuleExists(id\u003did)"},{"line_number":565,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_b0b022df","side":"PARENT","line":562,"updated":"2016-02-26 07:53:51.000000000","message":"aye, the new addition on L555 ensures that only the fields provided are compared","commit_id":"18bc556bd44c5f73e37dbc9687c7792065440722"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"af026d9ca4b79829b9b0a8ebe52c0e827e3abc1f","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        # below to check for these corner cases."},{"line_number":560,"context_line":"        for db_rule in db_rules:"},{"line_number":561,"context_line":"            # need to remove id from db_rule for matching"},{"line_number":562,"context_line":"            id \u003d db_rule.pop(\u0027id\u0027)"},{"line_number":563,"context_line":"            if (security_group_rule[\u0027security_group_rule\u0027] \u003d\u003d db_rule):"},{"line_number":564,"context_line":"                raise ext_sg.SecurityGroupRuleExists(id\u003did)"},{"line_number":565,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_82760ca2","side":"PARENT","line":562,"updated":"2016-02-23 03:11:39.000000000","message":"is this removal intentional?","commit_id":"18bc556bd44c5f73e37dbc9687c7792065440722"}],"neutron/db/standardattrdescription_db.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"39cc3062c62ca92522770fa3d3622113c22175f3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                     attributes.SUBNETS, attributes.SUBNETPOOLS,"},{"line_number":29,"context_line":"                     securitygroup.SECURITYGROUPS,"},{"line_number":30,"context_line":"                     securitygroup.SECURITYGROUPRULES,"},{"line_number":31,"context_line":"                     l3.ROUTERS, l3.FLOATINGIPS]:"},{"line_number":32,"context_line":"        db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":33,"context_line":"            resource, [\u0027_extend_standard_attr_description\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_04624bad","line":31,"updated":"2016-02-21 14:01:23.000000000","message":"It seems appropriate to apply this to qos_policy as well","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"db825b1f1f95a152552f3770e294c09ae1f4766f","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                     attributes.SUBNETS, attributes.SUBNETPOOLS,"},{"line_number":29,"context_line":"                     securitygroup.SECURITYGROUPS,"},{"line_number":30,"context_line":"                     securitygroup.SECURITYGROUPRULES,"},{"line_number":31,"context_line":"                     l3.ROUTERS, l3.FLOATINGIPS]:"},{"line_number":32,"context_line":"        db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":33,"context_line":"            resource, [\u0027_extend_standard_attr_description\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_64d237d4","line":31,"in_reply_to":"bae84128_04624bad","updated":"2016-02-21 14:31:55.000000000","message":"qospolicy does not use the standard attribute table","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"}],"neutron/extensions/securitygroup.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ce4f3313803b133f449fef05c11edfbe4987c578","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                              \u0027is_visible\u0027: True, \u0027required_by_policy\u0027: True},"},{"line_number":245,"context_line":"        \u0027remote_group_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":246,"context_line":"                            \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":247,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":248,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":249,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":250,"context_line":"        \u0027direction\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_f182bc93","line":247,"updated":"2016-01-21 21:50:07.000000000","message":"this is an API change so we need APIImpact and DocImpact","commit_id":"1ad5d93479bd56a4523d8ee82bd6f8f44f113c52"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"514e3ebb19138131df5c215910ab737912040b4e","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                              \u0027is_visible\u0027: True, \u0027required_by_policy\u0027: True},"},{"line_number":245,"context_line":"        \u0027remote_group_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":246,"context_line":"                            \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":247,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":248,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":249,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":250,"context_line":"        \u0027direction\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_cf6f3ac2","line":247,"in_reply_to":"9a68dd71_f182bc93","updated":"2016-01-26 01:37:52.000000000","message":"Thanks, I\u0027ll add that.","commit_id":"1ad5d93479bd56a4523d8ee82bd6f8f44f113c52"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ef831050868b8aaa5f26b08cfaa209bd62bc00ec","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                              \u0027is_visible\u0027: True, \u0027required_by_policy\u0027: True},"},{"line_number":245,"context_line":"        \u0027remote_group_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":246,"context_line":"                            \u0027default\u0027: None, \u0027is_visible\u0027: True},"},{"line_number":247,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":248,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: attr.DESCRIPTION_MAX_LEN},"},{"line_number":249,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":250,"context_line":"        \u0027direction\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a5ae5dd_82dcab75","line":247,"updated":"2016-02-09 02:34:09.000000000","message":"You cannot change the API in place like this, otherwise there\u0027s no way for a client to discover whether a server does indeed have the ability to expose/store the description attribute for security groups.","commit_id":"5a428efd4a505611e80843e68db74310f8255d39"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"39cc3062c62ca92522770fa3d3622113c22175f3","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"sg_supported_protocols \u003d [None] + list(const.IP_PROTOCOL_MAP.keys())"},{"line_number":215,"context_line":"sg_supported_ethertypes \u003d [\u0027IPv4\u0027, \u0027IPv6\u0027]"},{"line_number":216,"context_line":"SECURITYGROUPS \u003d \u0027security_groups\u0027"},{"line_number":217,"context_line":"SECURITYGROUPRULES \u003d \u0027security_group_rules\u0027"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"# Attribute Map"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_c468638a","line":216,"updated":"2016-02-21 14:01:23.000000000","message":"not related change","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"db825b1f1f95a152552f3770e294c09ae1f4766f","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"sg_supported_protocols \u003d [None] + list(const.IP_PROTOCOL_MAP.keys())"},{"line_number":215,"context_line":"sg_supported_ethertypes \u003d [\u0027IPv4\u0027, \u0027IPv6\u0027]"},{"line_number":216,"context_line":"SECURITYGROUPS \u003d \u0027security_groups\u0027"},{"line_number":217,"context_line":"SECURITYGROUPRULES \u003d \u0027security_group_rules\u0027"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"# Attribute Map"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_a4dc3fe5","line":216,"in_reply_to":"bae84128_c468638a","updated":"2016-02-21 14:31:55.000000000","message":"These are referenced in other files. I moved this one up here since I added the one for security_group_rules.","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"39cc3062c62ca92522770fa3d3622113c22175f3","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                extradhcpopt_db.ExtraDhcpOptMixin,"},{"line_number":103,"context_line":"                netmtu_db.Netmtu_db_mixin,"},{"line_number":104,"context_line":"                address_scope_db.AddressScopeDbMixin,"},{"line_number":105,"context_line":"                stattr_db.StandardAttrDescriptionMixin):"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    \"\"\"Implement the Neutron L2 abstractions using modules."},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_24066fce","line":105,"updated":"2016-02-21 14:01:23.000000000","message":"why not to apply this as part of db_base_plugin_v2.NeutronDbPluginV2?","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"db825b1f1f95a152552f3770e294c09ae1f4766f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                extradhcpopt_db.ExtraDhcpOptMixin,"},{"line_number":103,"context_line":"                netmtu_db.Netmtu_db_mixin,"},{"line_number":104,"context_line":"                address_scope_db.AddressScopeDbMixin,"},{"line_number":105,"context_line":"                stattr_db.StandardAttrDescriptionMixin):"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    \"\"\"Implement the Neutron L2 abstractions using modules."},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_c4e1839c","line":105,"in_reply_to":"bae84128_24066fce","updated":"2016-02-21 14:31:55.000000000","message":"Done","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"}],"neutron/tests/unit/extensions/test_securitygroup.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"09fd7c5438c38c9ab42cecb7e78e167835efc489","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                context.Context(\u0027\u0027, kwargs[\u0027tenant_id\u0027]))"},{"line_number":71,"context_line":"        return security_group_req.get_response(self.ext_api)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _build_security_group_rule(self, security_group_id, description,"},{"line_number":74,"context_line":"                                   direction, proto, port_range_min\u003dNone,"},{"line_number":75,"context_line":"                                   port_range_max\u003dNone, remote_ip_prefix\u003dNone,"},{"line_number":76,"context_line":"                                   remote_group_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_a93b8837","line":73,"range":{"start_line":73,"start_character":60,"end_line":73,"end_character":71},"updated":"2016-01-20 00:11:28.000000000","message":"Given the fact that description is not a required field, could you add a default value to it, so that the caller of this method will not need to set description everytime.","commit_id":"8872ba3c678c51f8905769da20957d80c9599086"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"3f58b48fab9af5b2fc1296214ce788c016a6be87","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                context.Context(\u0027\u0027, kwargs[\u0027tenant_id\u0027]))"},{"line_number":71,"context_line":"        return security_group_req.get_response(self.ext_api)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _build_security_group_rule(self, security_group_id, description,"},{"line_number":74,"context_line":"                                   direction, proto, port_range_min\u003dNone,"},{"line_number":75,"context_line":"                                   port_range_max\u003dNone, remote_ip_prefix\u003dNone,"},{"line_number":76,"context_line":"                                   remote_group_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_22c00de0","line":73,"range":{"start_line":73,"start_character":60,"end_line":73,"end_character":71},"in_reply_to":"ba63e191_a93b8837","updated":"2016-01-20 02:07:08.000000000","message":"I didn\u0027t add a default value to keep this function consistent with _create_security_group.  Would you rather have a default value and have the behaviour be slightly different to _create_security_group?","commit_id":"8872ba3c678c51f8905769da20957d80c9599086"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"09fd7c5438c38c9ab42cecb7e78e167835efc489","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        # Verify that default egress rules have been created"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        sg_rules \u003d security_group[\u0027security_group\u0027][\u0027security_group_rules\u0027]"},{"line_number":249,"context_line":"        self.assertEqual(len(sg_rules), 2)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        v4_rules \u003d [r for r in sg_rules if r[\u0027ethertype\u0027] \u003d\u003d const.IPv4]"},{"line_number":252,"context_line":"        self.assertEqual(len(v4_rules), 1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_a922a8ff","line":249,"updated":"2016-01-20 00:11:28.000000000","message":"I think the original pattern is right, we should use assertEqual(expected, observed), so your change here and similar changes below are not necessary.","commit_id":"8872ba3c678c51f8905769da20957d80c9599086"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"3f58b48fab9af5b2fc1296214ce788c016a6be87","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        # Verify that default egress rules have been created"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        sg_rules \u003d security_group[\u0027security_group\u0027][\u0027security_group_rules\u0027]"},{"line_number":249,"context_line":"        self.assertEqual(len(sg_rules), 2)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        v4_rules \u003d [r for r in sg_rules if r[\u0027ethertype\u0027] \u003d\u003d const.IPv4]"},{"line_number":252,"context_line":"        self.assertEqual(len(v4_rules), 1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_6202850d","line":249,"in_reply_to":"ba63e191_a922a8ff","updated":"2016-01-20 02:07:08.000000000","message":"Sorry, this wasn\u0027t intentional.  I\u0027ll revert these changes.","commit_id":"8872ba3c678c51f8905769da20957d80c9599086"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"09fd7c5438c38c9ab42cecb7e78e167835efc489","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                                          data,"},{"line_number":310,"context_line":"                                          sg[\u0027security_group\u0027][\u0027id\u0027])"},{"line_number":311,"context_line":"            res \u003d self.deserialize(self.fmt, req.get_response(self.ext_api))"},{"line_number":312,"context_line":"            self.assertEqual(res[\u0027security_group\u0027][\u0027name\u0027],"},{"line_number":313,"context_line":"                             data[\u0027security_group\u0027][\u0027name\u0027])"},{"line_number":314,"context_line":"            self.assertEqual(res[\u0027security_group\u0027][\u0027description\u0027],"},{"line_number":315,"context_line":"                             data[\u0027security_group\u0027][\u0027description\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_a9ace835","line":312,"updated":"2016-01-20 00:11:28.000000000","message":"I think you should add a test(or modify existing one) to assert the description of securitygroup_rule is the one that you write to the server.","commit_id":"8872ba3c678c51f8905769da20957d80c9599086"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"3f58b48fab9af5b2fc1296214ce788c016a6be87","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                                          data,"},{"line_number":310,"context_line":"                                          sg[\u0027security_group\u0027][\u0027id\u0027])"},{"line_number":311,"context_line":"            res \u003d self.deserialize(self.fmt, req.get_response(self.ext_api))"},{"line_number":312,"context_line":"            self.assertEqual(res[\u0027security_group\u0027][\u0027name\u0027],"},{"line_number":313,"context_line":"                             data[\u0027security_group\u0027][\u0027name\u0027])"},{"line_number":314,"context_line":"            self.assertEqual(res[\u0027security_group\u0027][\u0027description\u0027],"},{"line_number":315,"context_line":"                             data[\u0027security_group\u0027][\u0027description\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_dd0c723d","line":312,"in_reply_to":"ba63e191_a9ace835","updated":"2016-01-20 02:07:08.000000000","message":"Good point.  I\u0027ll add that.","commit_id":"8872ba3c678c51f8905769da20957d80c9599086"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"d32a75cc65ce6e4ad0cd0f1b5746f39808c09354","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                context.Context(\u0027\u0027, kwargs[\u0027tenant_id\u0027]))"},{"line_number":71,"context_line":"        return security_group_req.get_response(self.ext_api)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _build_security_group_rule(self, security_group_id, description,"},{"line_number":74,"context_line":"                                   direction, proto, port_range_min\u003dNone,"},{"line_number":75,"context_line":"                                   port_range_max\u003dNone, remote_ip_prefix\u003dNone,"},{"line_number":76,"context_line":"                                   remote_group_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_402beb30","line":73,"range":{"start_line":73,"start_character":60,"end_line":73,"end_character":71},"updated":"2016-01-21 01:45:42.000000000","message":"I am now mix feeling about the \u0027description\u0027 field. As you have stated, security group in UT are created with description. On the other side, hundred of lines are added to just pass meaningless description to the method. Anyway, I won\u0027t insist on it.","commit_id":"9d6b57e1215eb84ea7bc70c812c9529bcea88feb"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"3b0cdbf736487928f11fa844d5c06353e1ed003b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                context.Context(\u0027\u0027, kwargs[\u0027tenant_id\u0027]))"},{"line_number":71,"context_line":"        return security_group_req.get_response(self.ext_api)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _build_security_group_rule(self, security_group_id, description,"},{"line_number":74,"context_line":"                                   direction, proto, port_range_min\u003dNone,"},{"line_number":75,"context_line":"                                   port_range_max\u003dNone, remote_ip_prefix\u003dNone,"},{"line_number":76,"context_line":"                                   remote_group_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_3103a775","line":73,"range":{"start_line":73,"start_character":60,"end_line":73,"end_character":71},"in_reply_to":"9a68dd71_402beb30","updated":"2016-01-21 03:35:12.000000000","message":"I think you are right.  I\u0027ll add a default value.","commit_id":"9d6b57e1215eb84ea7bc70c812c9529bcea88feb"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"d32a75cc65ce6e4ad0cd0f1b5746f39808c09354","unresolved":false,"context_lines":[{"line_number":994,"context_line":"                                          direction, protocol, port_range_min,"},{"line_number":995,"context_line":"                                          port_range_max,"},{"line_number":996,"context_line":"                                          remote_ip_prefix) as rule:"},{"line_number":997,"context_line":"                for k, v, in keys:"},{"line_number":998,"context_line":"                    self.assertEqual(rule[\u0027security_group_rule\u0027][k], v)"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":"    def test_create_security_group_rule_duplicate_rules(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_c53fed23","line":997,"updated":"2016-01-21 01:45:42.000000000","message":"My mistake in previous comment. It seems like line 768, 798, 825 has verified the \u0027description\u0027. So, no need to add explicit UT for description here","commit_id":"9d6b57e1215eb84ea7bc70c812c9529bcea88feb"},{"author":{"_account_id":15867,"name":"James Dempsey","email":"jamesd@catalyst.net.nz","username":"jdempsey"},"change_message_id":"3b0cdbf736487928f11fa844d5c06353e1ed003b","unresolved":false,"context_lines":[{"line_number":994,"context_line":"                                          direction, protocol, port_range_min,"},{"line_number":995,"context_line":"                                          port_range_max,"},{"line_number":996,"context_line":"                                          remote_ip_prefix) as rule:"},{"line_number":997,"context_line":"                for k, v, in keys:"},{"line_number":998,"context_line":"                    self.assertEqual(rule[\u0027security_group_rule\u0027][k], v)"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":"    def test_create_security_group_rule_duplicate_rules(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_51041b7d","line":997,"in_reply_to":"9a68dd71_c53fed23","updated":"2016-01-21 03:35:12.000000000","message":"I\u0027ll remove this.","commit_id":"9d6b57e1215eb84ea7bc70c812c9529bcea88feb"}],"releasenotes/notes/add-securitygroup-rule-descriptions-1ba0d7a454c3fd8f.yaml":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"39cc3062c62ca92522770fa3d3622113c22175f3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Add description field to security group rules, networks, ports, routers,"},{"line_number":4,"context_line":"    floating IPs, and subnet pools."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"bae84128_04d7eb23","line":1,"updated":"2016-02-21 14:01:23.000000000","message":"yaml name seems not reflecting the content of the description.","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"db825b1f1f95a152552f3770e294c09ae1f4766f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Add description field to security group rules, networks, ports, routers,"},{"line_number":4,"context_line":"    floating IPs, and subnet pools."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"bae84128_c4f8634c","line":1,"in_reply_to":"bae84128_04d7eb23","updated":"2016-02-21 14:31:55.000000000","message":"Done","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"39cc3062c62ca92522770fa3d3622113c22175f3","unresolved":false,"context_lines":[{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - Security group rules, networks, ports, routers, floating IPs, and subnet"},{"line_number":7,"context_line":"    pools may now contain an optional description which allows users to more"},{"line_number":8,"context_line":"    easily store details about devices."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"bae84128_e41be719","line":8,"range":{"start_line":8,"start_character":31,"end_line":8,"end_character":38},"updated":"2016-02-21 14:01:23.000000000","message":"about managed entities/elements","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"db825b1f1f95a152552f3770e294c09ae1f4766f","unresolved":false,"context_lines":[{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - Security group rules, networks, ports, routers, floating IPs, and subnet"},{"line_number":7,"context_line":"    pools may now contain an optional description which allows users to more"},{"line_number":8,"context_line":"    easily store details about devices."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"bae84128_e4fda73b","line":8,"range":{"start_line":8,"start_character":31,"end_line":8,"end_character":38},"in_reply_to":"bae84128_e41be719","updated":"2016-02-21 14:31:55.000000000","message":"Done","commit_id":"1bd184a8074629f06357f1bab922de0c564cd399"}]}
