)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"5288b55265e340bb72b234714493065ef90832fe","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: I2412c1689683da9d7ec884a4cea506d4eed99453"},{"line_number":33,"context_line":"Partially-Implements: blueprint bgp-dynamic-routing"},{"line_number":34,"context_line":"Co-Authored-By: Ryan Tidwell \u003cryan.tidwell@hp.com\u003e"},{"line_number":35,"context_line":"Co-Authored-By: Jaume Devesa \u003cdevvesa@gmail.com\u003e"},{"line_number":36,"context_line":"Co-Authored-By: Vikram Choudhary \u003cvikram.choudhary@huawei.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a41bdd9_52321ea8","line":34,"updated":"2015-07-16 04:56:14.000000000","message":"This is un-necessary as you are the owner of the patch.","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"12d58be1b2ccd70222a4ff3d36fa229fef09b241","unresolved":false,"context_lines":[{"line_number":24,"context_line":"admin users."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Outstanding Items:"},{"line_number":27,"context_line":"- Address scope awareness of route lookups"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: I2412c1689683da9d7ec884a4cea506d4eed99453"},{"line_number":30,"context_line":"Partially-Implements: blueprint bgp-dynamic-routing"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"da20952f_b6fb6a78","line":27,"updated":"2015-09-01 02:10:57.000000000","message":"please add： Implements: blueprint xxx","commit_id":"5f538b151c3a0d81d2040b5d3f143357a4c30342"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"892e55d68bd374b57939e84699b370d69997a70d","unresolved":false,"context_lines":[{"line_number":24,"context_line":"admin users."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Outstanding Items:"},{"line_number":27,"context_line":"- Address scope awareness of route lookups"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: I2412c1689683da9d7ec884a4cea506d4eed99453"},{"line_number":30,"context_line":"Partially-Implements: blueprint bgp-dynamic-routing"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"da20952f_f6332260","line":27,"in_reply_to":"da20952f_b6fb6a78","updated":"2015-09-01 02:11:46.000000000","message":"sorry, my fault.","commit_id":"5f538b151c3a0d81d2040b5d3f143357a4c30342"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e354c749f00cdf8f7aa80f999411d1c153b3d3aa","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This is the first patch to provide BGP dynamic route"},{"line_number":10,"context_line":"advertisement functionality in Neutron."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch provides a new extension (\"bgp_speaker\") with"},{"line_number":13,"context_line":"support for basic CRUD on bgp_speaker and bgp_peer, as"},{"line_number":14,"context_line":"well as bgp_speaker-bgp_peer and bgp_speaker-network"},{"line_number":15,"context_line":"bindings."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"ba15a1d1_d61c0368","line":12,"updated":"2015-09-24 06:30:35.000000000","message":"nit: (bgp_speaker) \u003d\u003d\u003e (bgp)","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fe22c9348256fa8cc3330b12fc2b592e843bb7b0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This is the first patch to provide BGP dynamic route"},{"line_number":10,"context_line":"advertisement functionality in Neutron."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch provides a new extension (\"bgp_speaker\") with"},{"line_number":13,"context_line":"support for basic CRUD on bgp_speaker and bgp_peer, as"},{"line_number":14,"context_line":"well as bgp_speaker-bgp_peer and bgp_speaker-network"},{"line_number":15,"context_line":"bindings."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"9a1a9d01_3748985b","line":12,"in_reply_to":"ba15a1d1_d61c0368","updated":"2015-09-24 13:51:17.000000000","message":"Done","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"14a8634ad4a5361f18ca147a86ae966b89a216a1","unresolved":false,"context_lines":[{"line_number":24,"context_line":"admin users."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Outstanding Items:"},{"line_number":27,"context_line":"- Address scope awareness of route lookups"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: I2412c1689683da9d7ec884a4cea506d4eed99453"},{"line_number":30,"context_line":"Partially-Implements: blueprint bgp-dynamic-routing"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"9a1a9d01_4b13e0b8","line":27,"updated":"2015-09-26 07:52:27.000000000","message":"- Add status field to BgpSpeaker and BgpPeer Model.","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     30fb32cf (Ensure agent binding modules are loaded)"},{"line_number":2,"context_line":"Author:     vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2016-01-03 20:11:54 +0530"},{"line_number":4,"context_line":"Commit:     Ryan Tidwell \u003cryan.tidwell@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-06 16:55:24 -0800"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":47,"id":"fa69d971_622f25f7","line":2,"range":{"start_line":2,"start_character":12,"end_line":2,"end_character":58},"updated":"2016-01-07 19:44:15.000000000","message":"Vikram, you really need to figure out what it is about your workflow which resets the author.  Git won\u0027t normally reset the author unless you add --reset-author to the commit --amend line.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dd8dcbd351561e8631bff724e099b043c4f8d85f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     30fb32cf (Ensure agent binding modules are loaded)"},{"line_number":2,"context_line":"Author:     vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2016-01-03 20:11:54 +0530"},{"line_number":4,"context_line":"Commit:     Ryan Tidwell \u003cryan.tidwell@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-06 16:55:24 -0800"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":47,"id":"fa69d971_892a632b","line":2,"range":{"start_line":2,"start_character":12,"end_line":2,"end_character":58},"in_reply_to":"fa69d971_622f25f7","updated":"2016-01-08 03:43:18.000000000","message":"@Carl: my bad, will figure it out!","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"}],"etc/policy.json":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    \"get_rbac_policy\": \"rule:admin_or_owner\","},{"line_number":200,"context_line":"    \"delete_rbac_policy\": \"rule:admin_or_owner\","},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    \"get_bgp_speaker\": \"rule:admin_only\","},{"line_number":203,"context_line":"    \"create_bgp_speaker\": \"rule:admin_only\","},{"line_number":204,"context_line":"    \"update_bgp_speaker\": \"rule:admin_only\","},{"line_number":205,"context_line":"    \"delete_bgp_speaker\": \"rule:admin_only\","}],"source_content_type":"application/json","patch_set":32,"id":"9a1a9d01_29b88bc7","line":202,"updated":"2015-09-29 23:11:06.000000000","message":"piconit:  Does it make sense to list these in CRUD order.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    \"delete_bgp_peer\": \"rule:admin_only\","},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    \"add_bgp_peer\": \"rule:admin_only\","},{"line_number":219,"context_line":"    \"remove_bgp_peer\": \"rule:admin_only\","},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    \"add_gateway_network\": \"rule:admin_only\","},{"line_number":222,"context_line":"    \"remove_gateway_network\": \"rule:admin_only\","}],"source_content_type":"application/json","patch_set":47,"id":"fa69d971_222a8d2d","line":219,"updated":"2016-01-07 19:44:15.000000000","message":"I think these will be confused with create_bgp_peer and delete_bgp_peer.  Could you add something to help make a distinction?","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"460d41caf668b844a4e4eb2b8bc213d6363cdea2","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    \"delete_bgp_peer\": \"rule:admin_only\","},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    \"add_bgp_peer\": \"rule:admin_only\","},{"line_number":219,"context_line":"    \"remove_bgp_peer\": \"rule:admin_only\","},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    \"add_gateway_network\": \"rule:admin_only\","},{"line_number":222,"context_line":"    \"remove_gateway_network\": \"rule:admin_only\","}],"source_content_type":"application/json","patch_set":47,"id":"5a5ae5dd_8e793a32","line":219,"in_reply_to":"7a5de9d1_053745e4","updated":"2016-02-03 03:54:06.000000000","message":"ok, either way.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dd8dcbd351561e8631bff724e099b043c4f8d85f","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    \"delete_bgp_peer\": \"rule:admin_only\","},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    \"add_bgp_peer\": \"rule:admin_only\","},{"line_number":219,"context_line":"    \"remove_bgp_peer\": \"rule:admin_only\","},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    \"add_gateway_network\": \"rule:admin_only\","},{"line_number":222,"context_line":"    \"remove_gateway_network\": \"rule:admin_only\","}],"source_content_type":"application/json","patch_set":47,"id":"fa69d971_c9be1bd4","line":219,"in_reply_to":"fa69d971_222a8d2d","updated":"2016-01-08 03:43:18.000000000","message":"nice catch! how about using associate and disassociate instead.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"21b5530b3afaac12a6b1a72d35b1914646111e29","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    \"delete_bgp_peer\": \"rule:admin_only\","},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    \"add_bgp_peer\": \"rule:admin_only\","},{"line_number":219,"context_line":"    \"remove_bgp_peer\": \"rule:admin_only\","},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    \"add_gateway_network\": \"rule:admin_only\","},{"line_number":222,"context_line":"    \"remove_gateway_network\": \"rule:admin_only\","}],"source_content_type":"application/json","patch_set":47,"id":"7a5de9d1_053745e4","line":219,"in_reply_to":"fa69d971_c9be1bd4","updated":"2016-02-02 22:48:21.000000000","message":"I suppose I can make this change (grumble grumble).  When you look at the URI path these correspond to, I don\u0027t see any confusion.  These are subresources of/v2.0/ bgp-speakers.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"}],"neutron/callbacks/resources.py":[{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"219fb87db448a0082e9aa9fd9594e32711b942bf","unresolved":false,"context_lines":[{"line_number":20,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":21,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"VALID \u003d ("},{"line_number":24,"context_line":"    FLOATING_IP,"},{"line_number":25,"context_line":"    PORT,"},{"line_number":26,"context_line":"    ROUTER,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_8f1ff4b6","line":23,"updated":"2015-08-22 06:59:34.000000000","message":"The commit https://github.com/openstack/neutron/commit/6d004c41449a84bfb00d1bbc9affdbd8b08f2fa8  has deleted this.\n\nPlease delete this. This is the side effect of ps 13","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":20,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":21,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"VALID \u003d ("},{"line_number":24,"context_line":"    FLOATING_IP,"},{"line_number":25,"context_line":"    PORT,"},{"line_number":26,"context_line":"    ROUTER,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_2a93f9fb","line":23,"in_reply_to":"fa1b9901_8f1ff4b6","updated":"2015-08-24 19:17:35.000000000","message":"This is required so we can be notified of floating IP associate/disassociate.  Leaving as is.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"520eaf9551d0df7303008d916f476af7c731b9c1","unresolved":false,"context_lines":[{"line_number":20,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":21,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"VALID \u003d ("},{"line_number":24,"context_line":"    FLOATING_IP,"},{"line_number":25,"context_line":"    PORT,"},{"line_number":26,"context_line":"    ROUTER,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_0788b4e6","line":23,"updated":"2015-08-26 21:38:15.000000000","message":"Bad rebase? Based on our conversation I took action and got rid of this requirement in [1].\n\n[1] https://review.openstack.org/#/c/211798/","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"118419e2eebddaf594cbef6df47bb9bf393447eb","unresolved":false,"context_lines":[{"line_number":20,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":21,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"VALID \u003d ("},{"line_number":24,"context_line":"    FLOATING_IP,"},{"line_number":25,"context_line":"    PORT,"},{"line_number":26,"context_line":"    ROUTER,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_cd6f3b91","line":23,"in_reply_to":"da20952f_0788b4e6","updated":"2015-08-26 22:21:39.000000000","message":"Yep, bad rebase.  Good catch, I was waiting on that change and must have missed it.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":20,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":21,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"VALID \u003d ("},{"line_number":24,"context_line":"    FLOATING_IP,"},{"line_number":25,"context_line":"    PORT,"},{"line_number":26,"context_line":"    ROUTER,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_d546d8be","line":23,"in_reply_to":"da20952f_cd6f3b91","updated":"2015-08-27 06:31:16.000000000","message":"+1","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"}],"neutron/common/constants.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":180,"context_line":"DEFAULT_NETWORK_MTU \u003d 0"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"# Length of a UUID string"},{"line_number":183,"context_line":"UUID_STRING_LENGTH \u003d 32"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"# String length required for storing IP address as a string"},{"line_number":186,"context_line":"DB_IP_ADDR_STRING_LENGTH \u003d 64"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_4d66132b","line":183,"updated":"2015-07-15 20:34:20.000000000","message":"36","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"aad53ccf885aefbc8677964cf9cb78fc768956b5","unresolved":false,"context_lines":[{"line_number":180,"context_line":"DEFAULT_NETWORK_MTU \u003d 0"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"# Length of a UUID string"},{"line_number":183,"context_line":"UUID_STRING_LENGTH \u003d 32"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"# String length required for storing IP address as a string"},{"line_number":186,"context_line":"DB_IP_ADDR_STRING_LENGTH \u003d 64"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_466d4a03","line":183,"updated":"2015-07-20 12:52:32.000000000","message":"should be 36.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":180,"context_line":"DEFAULT_NETWORK_MTU \u003d 0"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"# Length of a UUID string"},{"line_number":183,"context_line":"UUID_STRING_LENGTH \u003d 32"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"# String length required for storing IP address as a string"},{"line_number":186,"context_line":"DB_IP_ADDR_STRING_LENGTH \u003d 64"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_49ca191c","line":183,"in_reply_to":"3a50d1a3_466d4a03","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS4.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e354c749f00cdf8f7aa80f999411d1c153b3d3aa","unresolved":false,"context_lines":[{"line_number":198,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"# Length of a UUID string"},{"line_number":201,"context_line":"UUID_STRING_LENGTH \u003d 36"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"# String length required for storing IP address as a string"},{"line_number":204,"context_line":"DB_IP_ADDR_STRING_LENGTH \u003d 64"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba15a1d1_9378ddc5","line":201,"updated":"2015-09-24 06:30:35.000000000","message":"I can find TENANT_ID_MAX_LEN is defined in https://github.com/openstack/neutron/blob/b6139484245c1e4d29a49f8bc055faca32ecbc38/neutron/api/v2/attributes.py#L41.\n\nIs UUID_STRING_LENGTH and TENANT_ID_MAX_LEN different?","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fe22c9348256fa8cc3330b12fc2b592e843bb7b0","unresolved":false,"context_lines":[{"line_number":198,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"# Length of a UUID string"},{"line_number":201,"context_line":"UUID_STRING_LENGTH \u003d 36"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"# String length required for storing IP address as a string"},{"line_number":204,"context_line":"DB_IP_ADDR_STRING_LENGTH \u003d 64"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a1a9d01_d7d27c34","line":201,"in_reply_to":"ba15a1d1_9378ddc5","updated":"2015-09-24 13:51:17.000000000","message":"I added this so I could have a constant available in the migration file, turns out this is the wrong value for what I was trying to use it for.  I\u0027ll double check if this is even used now.","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":205,"context_line":"UUID_STRING_LENGTH \u003d 36"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"# String length required for storing IP address as a string"},{"line_number":208,"context_line":"DB_IP_ADDR_STRING_LENGTH \u003d 64"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_0f126709","line":208,"updated":"2015-09-29 23:11:06.000000000","message":"Maximum is 45 but this will be fine.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"feb36d322c6ddb129e93c88319cd1f712cfd9389","unresolved":false,"context_lines":[{"line_number":222,"context_line":"UUID_STRING_LENGTH \u003d 36"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"# String length required for storing IP address as a string"},{"line_number":225,"context_line":"DB_IP_ADDR_STRING_LENGTH \u003d 64"}],"source_content_type":"text/x-python","patch_set":39,"id":"7a740942_2db1b7e1","line":225,"updated":"2015-12-07 09:11:40.000000000","message":"why 64? the maximum ipv6 string length is 45? no?","commit_id":"442fb9e331e296908ae65ad850f54d4577858a0d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"735da9f3beecad40f6e487f14f35203fc8c6632d","unresolved":false,"context_lines":[{"line_number":209,"context_line":"# WARNING: THESE MUST BE THE LAST TWO LINES IN THIS MODULE"},{"line_number":210,"context_line":"_OLD_REF \u003d sys.modules[__name__]"},{"line_number":211,"context_line":"sys.modules[__name__] \u003d _deprecate._DeprecateSubset(globals(), lib_constants)"},{"line_number":212,"context_line":"# WARNING: THESE MUST BE THE LAST TWO LINES IN THIS MODULE"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"# Length of a UUID string"},{"line_number":215,"context_line":"UUID_STRING_LENGTH \u003d 36"}],"source_content_type":"text/x-python","patch_set":66,"id":"3a57f1b5_97c23633","line":212,"range":{"start_line":212,"start_character":11,"end_line":212,"end_character":58},"updated":"2016-02-11 16:51:29.000000000","message":"I just noticed this.  I guess my rebase wasn\u0027t so trivial afterall.\n\nGiven the move to neutron_lib, we probably shouldn\u0027t add these new constants to this file in this patch.","commit_id":"457e8c3af386545b422b34a350242ddf32394141"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"03035ad3aedae881c6d6116f1c91434a2c413c2d","unresolved":false,"context_lines":[{"line_number":212,"context_line":"# WARNING: THESE MUST BE THE LAST TWO LINES IN THIS MODULE"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"# Length of a UUID string"},{"line_number":215,"context_line":"UUID_STRING_LENGTH \u003d 36"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"# String length required for storing IP address as a string"},{"line_number":218,"context_line":"DB_IP_ADDR_STRING_LENGTH \u003d 64"}],"source_content_type":"text/x-python","patch_set":66,"id":"3a57f1b5_377022dc","line":215,"range":{"start_line":215,"start_character":0,"end_line":215,"end_character":18},"updated":"2016-02-11 16:56:19.000000000","message":"While I think these two constants were a pretty good idea, the neutron-lib work has made adding them here impractical.\n\nBoth these constants would be good project-wide constants.  So, I\u0027ll leave it to some enterprising contributor to make that happen.  Though, I don\u0027t necessarily encourage or endorse that right now because we have other things to do with our time.  :)\n\nI\u0027m going to hard-code both constants and call it good.","commit_id":"457e8c3af386545b422b34a350242ddf32394141"}],"neutron/common/utils.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":447,"context_line":"    if ip_addr.version !\u003d 6:"},{"line_number":448,"context_line":"        return False"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":451,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":452,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":453,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_a83355aa","line":450,"updated":"2015-09-29 11:34:04.000000000","message":"I\u0027ve downloaded the code and made a \u0027git grep\u0027 and I can not see any place where you use this function. Is still needed?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":447,"context_line":"    if ip_addr.version !\u003d 6:"},{"line_number":448,"context_line":"        return False"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":451,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":452,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":453,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_1634a047","line":450,"in_reply_to":"9a1a9d01_24a740ab","updated":"2015-10-07 15:55:27.000000000","message":"Because this patch is a work-in-progress :)  I\u0027ll move this around.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":447,"context_line":"    if ip_addr.version !\u003d 6:"},{"line_number":448,"context_line":"        return False"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":451,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":452,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":453,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_cc000f69","line":450,"in_reply_to":"9a1a9d01_a83355aa","updated":"2015-09-29 15:02:34.000000000","message":"Yes, we\u0027ll need this.  This is a prefix we don\u0027t want to advertise.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"9f2218adf69c8b2867226a318ac25628c16cf1ba","unresolved":false,"context_lines":[{"line_number":447,"context_line":"    if ip_addr.version !\u003d 6:"},{"line_number":448,"context_line":"        return False"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":451,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":452,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":453,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_24a740ab","line":450,"in_reply_to":"9a1a9d01_cc000f69","updated":"2015-09-30 09:40:16.000000000","message":"My point is: if it is not needed on this patch.. why not move this function to the patch that needs it?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":451,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":452,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":453,"context_line":"        return False"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_be792fca","line":452,"updated":"2015-09-29 23:11:06.000000000","message":"Seems like this could more straight-forward:\n\n  def ip_address_is_ipv6_link_local(ip):\n      return netaddr.IPAddress(ip) in netaddr.IPSet([\u0027fe80::/10\u0027])\n\nOr, maybe a little better self-documenting version:\n\n  def ip_address_is_ipv6_link_local(ip):\n      address \u003d netaddr.IPAddress(ip)\n      lla_subnet \u003d netaddr.IPSet([\u0027fe80::/10\u0027])\n      return address in lla_subnet\n\nNo ipv4 address is going to satisfy the condition.  Also, the __contains__ special method is just to make the \"in\" operator work.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"964822389b558ee36781ebc7ad99815e5fdb5c0e","unresolved":false,"context_lines":[{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":451,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":452,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":453,"context_line":"        return False"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_b69f56b3","line":452,"in_reply_to":"9a1a9d01_be792fca","updated":"2015-10-07 16:52:39.000000000","message":"What about using is_link_local() :\n\n\u003e\u003e\u003e netaddr.IPAddress(\u0027fe80::1\u0027).is_link_local()\nTrue\n\nYou would want to keep the version check as is _link_local() can return True for IPv4 link-locals as well.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"71e5d5b5622e94192c086c47c97b8b50748e8a89","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":452,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":453,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":454,"context_line":"        return False"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    return True"},{"line_number":457,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5a2ca52d_98c10c57","line":454,"updated":"2015-10-15 19:52:00.000000000","message":"I still think you can replace this with:\n\nif ip_addr.is_link_local():\n    return True\n\nreturn False","commit_id":"b9dcc8a29509ff099903157bee7759c899c23467"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"51bde03bc1b8d6aa5512e674589d8cb61488f187","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":452,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":453,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":454,"context_line":"        return False"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    return True"},{"line_number":457,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"fa80f949_aebe5bfd","line":454,"in_reply_to":"5a2ca52d_98c10c57","updated":"2015-11-03 21:54:42.000000000","message":"Done","commit_id":"b9dcc8a29509ff099903157bee7759c899c23467"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"547fe80ac9b82948da3ceb88de250576caf6861c","unresolved":false,"context_lines":[{"line_number":456,"context_line":"    if ip_addr.version !\u003d 6:"},{"line_number":457,"context_line":"        return False"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    # TODO(tidwellr) fe80::/10 should be a constant"},{"line_number":460,"context_line":"    ipset \u003d netaddr.IPSet([netaddr.IPNetwork(\u0027fe80::/10\u0027)])"},{"line_number":461,"context_line":"    if not ipset.__contains__(ip_addr):"},{"line_number":462,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":35,"id":"fa80f949_4b2c764a","line":459,"updated":"2015-11-04 05:11:13.000000000","message":"TODO: Get rid of this method","commit_id":"7eb7a18176779d63f4ff6c961f7e86027bf36190"}],"neutron/db/bgp/bgp_db.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class BgpSpeakerPeerBinding(model_base.BASEV2):"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    \"\"\"Represents a mapping between BGP speaker and BGP peer\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    __tablename__ \u003d \u0027bgp_speaker_peer_bindings\u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_a88fd528","line":45,"updated":"2015-09-29 11:34:04.000000000","message":"Why empty rows between function name and docstrings?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class BgpSpeakerPeerBinding(model_base.BASEV2):"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    \"\"\"Represents a mapping between BGP speaker and BGP peer\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    __tablename__ \u003d \u0027bgp_speaker_peer_bindings\u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_58ff1634","line":45,"in_reply_to":"9a1a9d01_a88fd528","updated":"2015-10-07 15:55:27.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    ip_version \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    __table_args__ \u003d ("},{"line_number":81,"context_line":"        sa.UniqueConstraint("},{"line_number":82,"context_line":"            network_id,"},{"line_number":83,"context_line":"            ip_version,"},{"line_number":84,"context_line":"            name\u003d\u0027unique_bgp_speaker_network_bindings0network_id\u0027),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ef57f357","line":81,"updated":"2015-09-29 23:11:06.000000000","message":"I\u0027m wondering why this isn\u0027t just the primary key (network_id, ip_version).\n\nMaybe add an index on bgp_speaker_id too since it wouldn\u0027t be part of the primary key.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    ip_version \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    __table_args__ \u003d ("},{"line_number":81,"context_line":"        sa.UniqueConstraint("},{"line_number":82,"context_line":"            network_id,"},{"line_number":83,"context_line":"            ip_version,"},{"line_number":84,"context_line":"            name\u003d\u0027unique_bgp_speaker_network_bindings0network_id\u0027),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_94976747","line":81,"in_reply_to":"9a1a9d01_ef57f357","updated":"2015-09-30 00:34:39.000000000","message":"Good catch, I\u0027m so mired in this code that I\u0027ve become a little code-blind.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    __tablename__ \u003d \u0027bgp_speakers\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    # TODO(tidwellr) local_as should be unique within an address scope"},{"line_number":98,"context_line":"    local_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":99,"context_line":"    advertise_floating_ip_host_routes \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":100,"context_line":"    advertise_tenant_networks \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":101,"context_line":"    peers \u003d orm.relationship(BgpSpeakerPeerBinding,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_4a7b6d8c","line":98,"updated":"2015-09-29 23:11:06.000000000","message":"I don\u0027t think autoincrement\u003dFalse should be needed here since this isn\u0027t an integer primary key.  Did you find otherwise?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6370d544ca95ff5b56ea0fcb16856afca7115fd5","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    __tablename__ \u003d \u0027bgp_speakers\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    # TODO(tidwellr) local_as should be unique within an address scope"},{"line_number":98,"context_line":"    local_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":99,"context_line":"    advertise_floating_ip_host_routes \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":100,"context_line":"    advertise_tenant_networks \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":101,"context_line":"    peers \u003d orm.relationship(BgpSpeakerPeerBinding,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_aff4915a","line":98,"in_reply_to":"9a1a9d01_4a7b6d8c","updated":"2015-09-30 06:04:13.000000000","message":"Agreeing with Carl on this.. I think we can remove it.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    __tablename__ \u003d \u0027bgp_speakers\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    # TODO(tidwellr) local_as should be unique within an address scope"},{"line_number":98,"context_line":"    local_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":99,"context_line":"    advertise_floating_ip_host_routes \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":100,"context_line":"    advertise_tenant_networks \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":101,"context_line":"    peers \u003d orm.relationship(BgpSpeakerPeerBinding,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_384b6189","line":98,"in_reply_to":"9a1a9d01_aff4915a","updated":"2015-10-07 15:55:27.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    peer_ip \u003d sa.Column(sa.String(constants.DB_IP_ADDR_STRING_LENGTH),"},{"line_number":121,"context_line":"                        nullable\u003dFalse)"},{"line_number":122,"context_line":"    remote_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":123,"context_line":"    auth_type \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":124,"context_line":"    password \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_2a6079a4","line":122,"updated":"2015-09-29 23:11:06.000000000","message":"ditto (autoincrement)","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    peer_ip \u003d sa.Column(sa.String(constants.DB_IP_ADDR_STRING_LENGTH),"},{"line_number":121,"context_line":"                        nullable\u003dFalse)"},{"line_number":122,"context_line":"    remote_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":123,"context_line":"    auth_type \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":124,"context_line":"    password \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_d899e620","line":122,"in_reply_to":"9a1a9d01_2a6079a4","updated":"2015-10-07 15:55:27.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self._post_bgp_speaker_db_create(context, uuid)"},{"line_number":135,"context_line":"        return self.get_bgp_speaker(context, uuid)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _post_bgp_speaker_db_create(self, context, bgp_speaker_id):"},{"line_number":138,"context_line":"        pass"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_28266515","line":137,"updated":"2015-09-29 11:34:04.000000000","message":"What\u0027s the purpose of this method?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self._post_bgp_speaker_db_create(context, uuid)"},{"line_number":135,"context_line":"        return self.get_bgp_speaker(context, uuid)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _post_bgp_speaker_db_create(self, context, bgp_speaker_id):"},{"line_number":138,"context_line":"        pass"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_b84bca86","line":137,"in_reply_to":"9a1a9d01_28266515","updated":"2015-10-07 15:55:27.000000000","message":"This is a hook used by the plugin implementation.  I may move away from this as I refactor.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @log_helpers.log_method_call"},{"line_number":141,"context_line":"    def get_bgp_speakers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":142,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":143,"context_line":"            return self._get_collection(context, BgpSpeaker,"},{"line_number":144,"context_line":"                                        self._make_bgp_speaker_dict,"},{"line_number":145,"context_line":"                                        filters\u003dfilters,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ea7fe114","line":142,"updated":"2015-09-29 23:11:06.000000000","message":"I\u0027ve seen autonested_transaction [1] come up a bit recently.  Have you considered the difference and whether it should be used here?  I can\u0027t say I fully understand when we should use one over the other.  Many one of our DB experts in Neutron can explain.  I guess that you\u0027d want autonested if you want a savepoint to roll back to.\n\n [1] https://github.com/openstack/neutron/blob/e2358e0487/neutron/db/api.py#L69","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @log_helpers.log_method_call"},{"line_number":141,"context_line":"    def get_bgp_speakers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":142,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":143,"context_line":"            return self._get_collection(context, BgpSpeaker,"},{"line_number":144,"context_line":"                                        self._make_bgp_speaker_dict,"},{"line_number":145,"context_line":"                                        filters\u003dfilters,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_749ad36f","line":142,"in_reply_to":"9a1a9d01_ea7fe114","updated":"2015-09-30 00:34:39.000000000","message":"Thanks for the tip, I\u0027m not aware of this.  I\u0027ll take a look.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @log_helpers.log_method_call"},{"line_number":155,"context_line":"    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):"},{"line_number":156,"context_line":"        bp \u003d bgp_speaker[bgp_ext.BGP_SPEAKER_BODY_KEY_NAME]"},{"line_number":157,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":158,"context_line":"            bgp_speaker_db \u003d self._get_bgp_speaker(context, bgp_speaker_id)"},{"line_number":159,"context_line":"            bgp_speaker_db.update(bp)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_889771eb","line":156,"updated":"2015-09-29 11:34:04.000000000","message":"This constant is only used on this module. Have you considered to define it here?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @log_helpers.log_method_call"},{"line_number":155,"context_line":"    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):"},{"line_number":156,"context_line":"        bp \u003d bgp_speaker[bgp_ext.BGP_SPEAKER_BODY_KEY_NAME]"},{"line_number":157,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":158,"context_line":"            bgp_speaker_db \u003d self._get_bgp_speaker(context, bgp_speaker_id)"},{"line_number":159,"context_line":"            bgp_speaker_db.update(bp)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_d84ec695","line":156,"in_reply_to":"9a1a9d01_889771eb","updated":"2015-10-07 15:55:27.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        bgp_speaker_dict \u003d self._make_bgp_speaker_dict(bgp_speaker_db)"},{"line_number":162,"context_line":"        return bgp_speaker_dict"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _save_bgp_speaker(self, context, bgp_speaker, uuid):"},{"line_number":165,"context_line":"        ri \u003d bgp_speaker[bgp_ext.BGP_SPEAKER_BODY_KEY_NAME]"},{"line_number":166,"context_line":"        ri[\u0027tenant_id\u0027] \u003d context.tenant_id"},{"line_number":167,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_f3461e4e","line":164,"updated":"2015-09-29 11:34:04.000000000","message":"I would prefer _add_bgp_speaker as function name. _save_ it may be interpreted as it can be used for updates as well.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        bgp_speaker_dict \u003d self._make_bgp_speaker_dict(bgp_speaker_db)"},{"line_number":162,"context_line":"        return bgp_speaker_dict"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _save_bgp_speaker(self, context, bgp_speaker, uuid):"},{"line_number":165,"context_line":"        ri \u003d bgp_speaker[bgp_ext.BGP_SPEAKER_BODY_KEY_NAME]"},{"line_number":166,"context_line":"        ri[\u0027tenant_id\u0027] \u003d context.tenant_id"},{"line_number":167,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_d8acad37","line":164,"in_reply_to":"9a1a9d01_f3461e4e","updated":"2015-10-07 15:55:27.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            res_keys \u003d [\u0027local_as\u0027, \u0027tenant_id\u0027, \u0027ip_version\u0027,"},{"line_number":169,"context_line":"                        \u0027advertise_floating_ip_host_routes\u0027,"},{"line_number":170,"context_line":"                        \u0027advertise_tenant_networks\u0027]"},{"line_number":171,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":172,"context_line":"            res[\u0027id\u0027] \u003d uuid"},{"line_number":173,"context_line":"            bgp_speaker_db \u003d BgpSpeaker(**res)"},{"line_number":174,"context_line":"            context.session.add(bgp_speaker_db)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_6a1e71bc","line":171,"updated":"2015-09-29 23:11:06.000000000","message":"nit:  dict comprehension is preferred\n\n  {k: ri[k] for k in res_keys}","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            res_keys \u003d [\u0027local_as\u0027, \u0027tenant_id\u0027, \u0027ip_version\u0027,"},{"line_number":169,"context_line":"                        \u0027advertise_floating_ip_host_routes\u0027,"},{"line_number":170,"context_line":"                        \u0027advertise_tenant_networks\u0027]"},{"line_number":171,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":172,"context_line":"            res[\u0027id\u0027] \u003d uuid"},{"line_number":173,"context_line":"            bgp_speaker_db \u003d BgpSpeaker(**res)"},{"line_number":174,"context_line":"            context.session.add(bgp_speaker_db)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_f484a30b","line":171,"in_reply_to":"9a1a9d01_6a1e71bc","updated":"2015-09-30 00:34:39.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                        \u0027advertise_tenant_networks\u0027]"},{"line_number":171,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":172,"context_line":"            res[\u0027id\u0027] \u003d uuid"},{"line_number":173,"context_line":"            bgp_speaker_db \u003d BgpSpeaker(**res)"},{"line_number":174,"context_line":"            context.session.add(bgp_speaker_db)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ca53fd69","line":173,"updated":"2015-09-29 23:11:06.000000000","message":"piconit:  Could replace the last two lines with this I think:\n\n  bgp_speaker_db \u003d BgpSpeaker(id\u003duuid, **res)","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                        \u0027advertise_tenant_networks\u0027]"},{"line_number":171,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":172,"context_line":"            res[\u0027id\u0027] \u003d uuid"},{"line_number":173,"context_line":"            bgp_speaker_db \u003d BgpSpeaker(**res)"},{"line_number":174,"context_line":"            context.session.add(bgp_speaker_db)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_b47b8b27","line":173,"in_reply_to":"9a1a9d01_ca53fd69","updated":"2015-09-30 00:34:39.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        self._remove_bgp_speaker_peer_binding(context,"},{"line_number":188,"context_line":"                                              bgp_speaker_id,"},{"line_number":189,"context_line":"                                              bgp_peer_id)"},{"line_number":190,"context_line":"        return {\u0027bgp_peer_id\u0027: bgp_peer_id}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    @log_helpers.log_method_call"},{"line_number":193,"context_line":"    def add_gateway_network(self, context, bgp_speaker_id, network_info):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_a2293139","line":190,"updated":"2015-09-29 11:34:04.000000000","message":"A remove method that returns the id of the removed entity?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        self._remove_bgp_speaker_peer_binding(context,"},{"line_number":188,"context_line":"                                              bgp_speaker_id,"},{"line_number":189,"context_line":"                                              bgp_peer_id)"},{"line_number":190,"context_line":"        return {\u0027bgp_peer_id\u0027: bgp_peer_id}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    @log_helpers.log_method_call"},{"line_number":193,"context_line":"    def add_gateway_network(self, context, bgp_speaker_id, network_info):"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_333cbbc7","line":190,"in_reply_to":"9a1a9d01_a2293139","updated":"2015-10-07 15:55:27.000000000","message":"Yeah, this is how the add_router_interface API\u0027s work and I just used that as a reference.  I\u0027ll re-think this.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        return {\u0027network_id\u0027: network_id}"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def _post_add_gateway_network(self, context, bgp_speaker_id, network_id):"},{"line_number":210,"context_line":"        pass"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_e2a2c9fc","line":209,"updated":"2015-09-29 11:34:04.000000000","message":"What\u0027s that method for?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"9f2218adf69c8b2867226a318ac25628c16cf1ba","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        return {\u0027network_id\u0027: network_id}"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def _post_add_gateway_network(self, context, bgp_speaker_id, network_id):"},{"line_number":210,"context_line":"        pass"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_24fc206f","line":209,"in_reply_to":"9a1a9d01_0c54c7fc","updated":"2015-09-30 09:40:16.000000000","message":"Ok. Thanks for the explanation.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        return {\u0027network_id\u0027: network_id}"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def _post_add_gateway_network(self, context, bgp_speaker_id, network_id):"},{"line_number":210,"context_line":"        pass"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_0c54c7fc","line":209,"in_reply_to":"9a1a9d01_e2a2c9fc","updated":"2015-09-29 15:02:34.000000000","message":"Needs a comment I suppose.  This a hook for triggering events after adding a gateway network.  See the plugin implementation.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            self._post_remove_gateway_network(context, bgp_speaker_id, routes)"},{"line_number":223,"context_line":"        return {\u0027network_id\u0027: network_id}"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def _post_remove_gateway_network(self, context, bgp_speaker_id, routes):"},{"line_number":226,"context_line":"        pass"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_a2f611f7","line":225,"updated":"2015-09-29 11:34:04.000000000","message":"What\u0027s that method for?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            self._post_remove_gateway_network(context, bgp_speaker_id, routes)"},{"line_number":223,"context_line":"        return {\u0027network_id\u0027: network_id}"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def _post_remove_gateway_network(self, context, bgp_speaker_id, routes):"},{"line_number":226,"context_line":"        pass"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ec75d397","line":225,"in_reply_to":"9a1a9d01_a2f611f7","updated":"2015-09-29 15:02:34.000000000","message":"See L209","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    def delete_bgp_speaker(self, context, bgp_speaker_id):"},{"line_number":230,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":231,"context_line":"            bgp_speaker_db \u003d self._get_bgp_speaker(context, bgp_speaker_id)"},{"line_number":232,"context_line":"            context.session.delete(bgp_speaker_db)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    @log_helpers.log_method_call"},{"line_number":235,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_4a6a8def","line":232,"updated":"2015-09-29 23:11:06.000000000","message":"Any way to delete it without actually querying it first?  This effectively calls:\n\n  thing \u003d query.one()\n  session.delete(thing)\n\nWhen I\u0027d think this is preferred:\n\n  query.delete()","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    def delete_bgp_speaker(self, context, bgp_speaker_id):"},{"line_number":230,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":231,"context_line":"            bgp_speaker_db \u003d self._get_bgp_speaker(context, bgp_speaker_id)"},{"line_number":232,"context_line":"            context.session.delete(bgp_speaker_db)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    @log_helpers.log_method_call"},{"line_number":235,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_d4963f3d","line":232,"in_reply_to":"9a1a9d01_4a6a8def","updated":"2015-09-30 00:34:39.000000000","message":"Yes, in the spirit of https://review.openstack.org/#/c/224351/ I\u0027ve been meaning to get to this.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        except sa_exc.NoResultFound:"},{"line_number":283,"context_line":"            raise bgp_ext.BgpSpeakerNotFound(id\u003dbgp_speaker_id)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def _get_bgp_speakers_by_binding_network(self, context, network_id):"},{"line_number":286,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":287,"context_line":"            query \u003d context.session.query(BgpSpeakerNetworkBinding)"},{"line_number":288,"context_line":"            query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_73868edc","line":285,"updated":"2015-09-29 11:34:04.000000000","message":"This method is not called.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        except sa_exc.NoResultFound:"},{"line_number":283,"context_line":"            raise bgp_ext.BgpSpeakerNotFound(id\u003dbgp_speaker_id)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def _get_bgp_speakers_by_binding_network(self, context, network_id):"},{"line_number":286,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":287,"context_line":"            query \u003d context.session.query(BgpSpeakerNetworkBinding)"},{"line_number":288,"context_line":"            query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_8cae97e4","line":285,"in_reply_to":"9a1a9d01_73868edc","updated":"2015-09-29 15:02:34.000000000","message":"It should be called in the plugin implementation.  If not, I\u0027ll get to it, this is definitely needed.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                                                       bgp_speaker_id)"},{"line_number":295,"context_line":"        return self._make_advertised_routes_dict(routes)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def _get_id_for(self, resource, id_name):"},{"line_number":298,"context_line":"        try:"},{"line_number":299,"context_line":"            return resource.get(id_name)"},{"line_number":300,"context_line":"        except AttributeError:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ae2d9d96","line":297,"updated":"2015-09-29 11:34:04.000000000","message":"This method should exist in another kind of \u0027utils\u0027 module... If not, should be moved there.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                                                       bgp_speaker_id)"},{"line_number":295,"context_line":"        return self._make_advertised_routes_dict(routes)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def _get_id_for(self, resource, id_name):"},{"line_number":298,"context_line":"        try:"},{"line_number":299,"context_line":"            return resource.get(id_name)"},{"line_number":300,"context_line":"        except AttributeError:"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_b39c4bc1","line":297,"in_reply_to":"9a1a9d01_ae2d9d96","updated":"2015-10-07 15:55:27.000000000","message":"I keep getting hammered about this method, I do intend to do away with it.  I\u0027ve been dealing with more weighty issues :)","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                     BgpSpeakerPeerBinding.bgp_peer_id \u003d\u003d BgpPeer.id)"},{"line_number":311,"context_line":"            return query.all()"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":314,"context_line":"                                       bgp_peer_id):"},{"line_number":315,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":316,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_d3b75a38","line":313,"updated":"2015-09-29 11:34:04.000000000","message":"same here for naming: I like more _add_bgp_speaker than _save_bgp_speaker","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                     BgpSpeakerPeerBinding.bgp_peer_id \u003d\u003d BgpPeer.id)"},{"line_number":311,"context_line":"            return query.all()"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":314,"context_line":"                                       bgp_peer_id):"},{"line_number":315,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":316,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_d670680d","line":313,"in_reply_to":"9a1a9d01_d3b75a38","updated":"2015-10-07 15:55:27.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"            peers \u003d self._get_bgp_peers_by_bgp_speaker_binding(context,"},{"line_number":329,"context_line":"                                                               bgp_speaker_id)"},{"line_number":330,"context_line":"            self._validate_peer_ips(bgp_speaker_id, peers, bgp_peer)"},{"line_number":331,"context_line":"            binding \u003d BgpSpeakerPeerBinding(bgp_speaker_id\u003dbgp_speaker.id,"},{"line_number":332,"context_line":"                                            bgp_peer_id\u003dbgp_peer.id)"},{"line_number":333,"context_line":"            context.session.add(binding)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_73e0cefa","line":330,"updated":"2015-09-29 11:34:04.000000000","message":"You have the function: _get_bgp_speaker_peer_binding() here. You don\u0027t need to retrieve all peers and iterate looking for a duplicate. Why not:\n\n  try:\n     self._get_bgp_speaker_peer_binding(bgp_speaker_id, bgp_peer[\u0027id\u0027])\n     raise Duplicated...\n  except NotFound..:\n     pass\n\nThis way you can remove the _validate_peer_ips and _get_bgp_peers_by_bgp_speaker_binding methods and also the execution will be faster.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"9f2218adf69c8b2867226a318ac25628c16cf1ba","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"            peers \u003d self._get_bgp_peers_by_bgp_speaker_binding(context,"},{"line_number":329,"context_line":"                                                               bgp_speaker_id)"},{"line_number":330,"context_line":"            self._validate_peer_ips(bgp_speaker_id, peers, bgp_peer)"},{"line_number":331,"context_line":"            binding \u003d BgpSpeakerPeerBinding(bgp_speaker_id\u003dbgp_speaker.id,"},{"line_number":332,"context_line":"                                            bgp_peer_id\u003dbgp_peer.id)"},{"line_number":333,"context_line":"            context.session.add(binding)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_e4e4e8ac","line":330,"in_reply_to":"9a1a9d01_0c3e078c","updated":"2015-09-30 09:40:16.000000000","message":"Oh, I see. In this case, you made a function/query database that retrieves all the peers for a bgp speaker to iterate later (_get_bgp_peers_by_bgp_speaker_binding)... why don\u0027t modify that function and filter for the IP of the peers?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"            peers \u003d self._get_bgp_peers_by_bgp_speaker_binding(context,"},{"line_number":329,"context_line":"                                                               bgp_speaker_id)"},{"line_number":330,"context_line":"            self._validate_peer_ips(bgp_speaker_id, peers, bgp_peer)"},{"line_number":331,"context_line":"            binding \u003d BgpSpeakerPeerBinding(bgp_speaker_id\u003dbgp_speaker.id,"},{"line_number":332,"context_line":"                                            bgp_peer_id\u003dbgp_peer.id)"},{"line_number":333,"context_line":"            context.session.add(binding)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_0c3e078c","line":330,"in_reply_to":"9a1a9d01_73e0cefa","updated":"2015-09-29 15:02:34.000000000","message":"We need to check the IP address of the peer, not just the ID.  Should collapse both checks into a single loop, but we still need to iterate all the peers.  I don\u0027t expect it to be a large list in deployment.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"            peers \u003d self._get_bgp_peers_by_bgp_speaker_binding(context,"},{"line_number":329,"context_line":"                                                               bgp_speaker_id)"},{"line_number":330,"context_line":"            self._validate_peer_ips(bgp_speaker_id, peers, bgp_peer)"},{"line_number":331,"context_line":"            binding \u003d BgpSpeakerPeerBinding(bgp_speaker_id\u003dbgp_speaker.id,"},{"line_number":332,"context_line":"                                            bgp_peer_id\u003dbgp_peer.id)"},{"line_number":333,"context_line":"            context.session.add(binding)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_f391639a","line":330,"in_reply_to":"9a1a9d01_e4e4e8ac","updated":"2015-10-07 15:55:27.000000000","message":"Good suggestion, I\u0027ll look into that approach as I refactor.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        res[\u0027networks\u0027] \u003d [x.network_id for x in network_bindings]"},{"line_number":404,"context_line":"        return self._fields(res, fields)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"    def _make_advertised_routes_dict(self, routes):"},{"line_number":407,"context_line":"        return {\u0027advertised_routes\u0027: list(routes)}"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def _make_advertised_routes_list(self, routes):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_2e6d0d31","line":406,"updated":"2015-09-29 11:34:04.000000000","message":"This is only called once... do you think is worth to create a method?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    def _make_advertised_routes_list(self, routes):"},{"line_number":410,"context_line":"        route_list \u003d ({\u0027destination\u0027: x,"},{"line_number":411,"context_line":"                       \u0027next_hop\u0027: y} for x, y in routes)"},{"line_number":412,"context_line":"        return route_list"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def _route_list_from_prefixes_and_next_hop(self, routes, next_hop):"},{"line_number":415,"context_line":"        route_list \u003d [{\u0027destination\u0027: x,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ee1b95c8","line":412,"updated":"2015-09-29 11:34:04.000000000","message":"That\u0027s a tuple, not a list... right?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    def _make_advertised_routes_list(self, routes):"},{"line_number":410,"context_line":"        route_list \u003d ({\u0027destination\u0027: x,"},{"line_number":411,"context_line":"                       \u0027next_hop\u0027: y} for x, y in routes)"},{"line_number":412,"context_line":"        return route_list"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def _route_list_from_prefixes_and_next_hop(self, routes, next_hop):"},{"line_number":415,"context_line":"        route_list \u003d [{\u0027destination\u0027: x,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_7e5dd213","line":412,"in_reply_to":"9a1a9d01_6cfb03c2","updated":"2015-09-29 23:11:06.000000000","message":"These methods are inconsistent with returning lists and generators (e.g. the next method returns a list).\n\nImportant differences between a list and a generator are that 1) len(...) doesn\u0027t work on a generator and 2) you can\u0027t iterate a generator more than once.\n\nI tend to think if a method has list in the name, it should probably return a list.  The term iterable could be used if you want to return a generator.  But, if it is a performance optimization I\u0027d say just forget it and return a list.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    def _make_advertised_routes_list(self, routes):"},{"line_number":410,"context_line":"        route_list \u003d ({\u0027destination\u0027: x,"},{"line_number":411,"context_line":"                       \u0027next_hop\u0027: y} for x, y in routes)"},{"line_number":412,"context_line":"        return route_list"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def _route_list_from_prefixes_and_next_hop(self, routes, next_hop):"},{"line_number":415,"context_line":"        route_list \u003d [{\u0027destination\u0027: x,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_34bd3bb7","line":412,"in_reply_to":"9a1a9d01_7e5dd213","updated":"2015-09-30 00:34:39.000000000","message":"The reason for going with a generator is that this could return a lot of data in practice.  I agree, it is poorly named and conveys that you\u0027re actually getting a list when you\u0027re not.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    def _make_advertised_routes_list(self, routes):"},{"line_number":410,"context_line":"        route_list \u003d ({\u0027destination\u0027: x,"},{"line_number":411,"context_line":"                       \u0027next_hop\u0027: y} for x, y in routes)"},{"line_number":412,"context_line":"        return route_list"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def _route_list_from_prefixes_and_next_hop(self, routes, next_hop):"},{"line_number":415,"context_line":"        route_list \u003d [{\u0027destination\u0027: x,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_6cfb03c2","line":412,"in_reply_to":"9a1a9d01_ee1b95c8","updated":"2015-09-29 15:02:34.000000000","message":"No, it\u0027s a generator (It\u0027s iterable like a list).","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                binding_alias.network_id \u003d\u003d models_v2.Subnet.network_id,"},{"line_number":497,"context_line":"                binding_alias.bgp_speaker_id \u003d\u003d BgpSpeaker.id,"},{"line_number":498,"context_line":"                BgpSpeaker.advertise_floating_ip_host_routes \u003d\u003d sa.sql.true())"},{"line_number":499,"context_line":"            return self._host_route_list_from_tuples(query.all())"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"    def _get_fip_host_routes_by_binding(self, context,"},{"line_number":502,"context_line":"                                        network_id, bgp_speaker_id):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_7e8b9268","line":499,"updated":"2015-09-29 23:11:06.000000000","message":"techinically no need to call .all().  The query should be iterable.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                binding_alias.network_id \u003d\u003d models_v2.Subnet.network_id,"},{"line_number":497,"context_line":"                binding_alias.bgp_speaker_id \u003d\u003d BgpSpeaker.id,"},{"line_number":498,"context_line":"                BgpSpeaker.advertise_floating_ip_host_routes \u003d\u003d sa.sql.true())"},{"line_number":499,"context_line":"            return self._host_route_list_from_tuples(query.all())"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"    def _get_fip_host_routes_by_binding(self, context,"},{"line_number":502,"context_line":"                                        network_id, bgp_speaker_id):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_f4b263e4","line":499,"in_reply_to":"9a1a9d01_7e8b9268","updated":"2015-09-30 00:34:39.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":612,"context_line":"        join_query \u003d join_query.join(right_subq, and_cond)"},{"line_number":613,"context_line":"        return join_query"},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"    def _tenant_networks_by_network_query(self, context,"},{"line_number":616,"context_line":"                                          network_id, bgp_speaker_id):"},{"line_number":617,"context_line":"        \"\"\"Return subquery for tenant networks by binding network ID\"\"\""},{"line_number":618,"context_line":"        tenant_networks_query \u003d context.session.query("}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_2272014a","line":615,"updated":"2015-09-29 11:34:04.000000000","message":"I know that the functions can became big, but I would prefer to put this code inside the function that calls them... I find it more readable.\n\nAnyway. I know it\u0027s a matter of tastes, and I don\u0027t have a strong opinion. So do what you feel more comfortable.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":612,"context_line":"        join_query \u003d join_query.join(right_subq, and_cond)"},{"line_number":613,"context_line":"        return join_query"},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"    def _tenant_networks_by_network_query(self, context,"},{"line_number":616,"context_line":"                                          network_id, bgp_speaker_id):"},{"line_number":617,"context_line":"        \"\"\"Return subquery for tenant networks by binding network ID\"\"\""},{"line_number":618,"context_line":"        tenant_networks_query \u003d context.session.query("}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_3ebd1ab7","line":615,"in_reply_to":"9a1a9d01_2272014a","updated":"2015-09-29 23:11:06.000000000","message":"I don\u0027t think I\u0027d mind that if you\u0027re just breaking it up to shorten the methods.  I don\u0027t know, I could go either way.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":612,"context_line":"        join_query \u003d join_query.join(right_subq, and_cond)"},{"line_number":613,"context_line":"        return join_query"},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"    def _tenant_networks_by_network_query(self, context,"},{"line_number":616,"context_line":"                                          network_id, bgp_speaker_id):"},{"line_number":617,"context_line":"        \"\"\"Return subquery for tenant networks by binding network ID\"\"\""},{"line_number":618,"context_line":"        tenant_networks_query \u003d context.session.query("}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_74bf33aa","line":615,"in_reply_to":"9a1a9d01_3ebd1ab7","updated":"2015-09-30 00:34:39.000000000","message":"Just trying to shorten up methods.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":661,"context_line":"        nexthops_query \u003d nexthops_query.filter(*filters)"},{"line_number":662,"context_line":"        return nexthops_query"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    def _next_hop_ip_addresses_by_binding_filters(self,"},{"line_number":665,"context_line":"                                                  network_id,"},{"line_number":666,"context_line":"                                                  bgp_speaker_id):"},{"line_number":667,"context_line":"        \"\"\"Return the filters for querying nexthops by binding network\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_2230c1e7","line":664,"updated":"2015-09-29 11:34:04.000000000","message":"This is only called once from the previous function.. Do you think is worth to create a function for it? I think it makes the code more confusing, because even the function names are so similar... I would put together in a single function.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        nexthops_query \u003d nexthops_query.filter(*filters)"},{"line_number":686,"context_line":"        return nexthops_query"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    def _next_hop_ip_addresses_by_bgp_speaker_filters(self):"},{"line_number":689,"context_line":"        \"\"\"Return the filters for querying nexthops by BGP speaker\"\"\""},{"line_number":690,"context_line":"        return [l3_db.RouterPort.port_type \u003d\u003d DEVICE_OWNER_ROUTER_GW,"},{"line_number":691,"context_line":"           BgpSpeakerNetworkBinding.network_id \u003d\u003d models_v2.Subnet.network_id,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_82550dfb","line":688,"updated":"2015-09-29 11:34:04.000000000","message":"Ditto.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":737,"context_line":"                l3_db.RouterPort.port_type \u003d\u003d DEVICE_OWNER_ROUTER_INTF,"},{"line_number":738,"context_line":"                models_v2.IPAllocation.port_id \u003d\u003d l3_db.RouterPort.port_id]"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    def _bgp_speakers_for_gateway_network(self, context, network_id):"},{"line_number":741,"context_line":"        \"\"\"Return all BgpSpeakers for the given gateway network\"\"\""},{"line_number":742,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":743,"context_line":"            query \u003d context.session.query(BgpSpeaker)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_739c4e5d","line":740,"updated":"2015-09-29 11:34:04.000000000","message":"This method is not called.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"77092dd2dff9373fc563f6d6eb9aa2c92c549543","unresolved":false,"context_lines":[{"line_number":737,"context_line":"                l3_db.RouterPort.port_type \u003d\u003d DEVICE_OWNER_ROUTER_INTF,"},{"line_number":738,"context_line":"                models_v2.IPAllocation.port_id \u003d\u003d l3_db.RouterPort.port_id]"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    def _bgp_speakers_for_gateway_network(self, context, network_id):"},{"line_number":741,"context_line":"        \"\"\"Return all BgpSpeakers for the given gateway network\"\"\""},{"line_number":742,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":743,"context_line":"            query \u003d context.session.query(BgpSpeaker)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_b35f6be4","line":740,"in_reply_to":"9a1a9d01_643a18e9","updated":"2015-10-07 15:55:27.000000000","message":"This isn\u0027t a plugin-specific method, it has utility for any class extending the mixin.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":737,"context_line":"                l3_db.RouterPort.port_type \u003d\u003d DEVICE_OWNER_ROUTER_INTF,"},{"line_number":738,"context_line":"                models_v2.IPAllocation.port_id \u003d\u003d l3_db.RouterPort.port_id]"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    def _bgp_speakers_for_gateway_network(self, context, network_id):"},{"line_number":741,"context_line":"        \"\"\"Return all BgpSpeakers for the given gateway network\"\"\""},{"line_number":742,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":743,"context_line":"            query \u003d context.session.query(BgpSpeaker)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ec895327","line":740,"in_reply_to":"9a1a9d01_739c4e5d","updated":"2015-09-29 15:02:34.000000000","message":"This is called in the plugin implementation","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"9f2218adf69c8b2867226a318ac25628c16cf1ba","unresolved":false,"context_lines":[{"line_number":737,"context_line":"                l3_db.RouterPort.port_type \u003d\u003d DEVICE_OWNER_ROUTER_INTF,"},{"line_number":738,"context_line":"                models_v2.IPAllocation.port_id \u003d\u003d l3_db.RouterPort.port_id]"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    def _bgp_speakers_for_gateway_network(self, context, network_id):"},{"line_number":741,"context_line":"        \"\"\"Return all BgpSpeakers for the given gateway network\"\"\""},{"line_number":742,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":743,"context_line":"            query \u003d context.session.query(BgpSpeaker)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_643a18e9","line":740,"in_reply_to":"9a1a9d01_ec895327","updated":"2015-09-30 09:40:16.000000000","message":"Shouldn\u0027t be moved to plugin then? My reasoning is: I assume that the db_mixin should provide functions useful for any implementation and plugin then implement the ones specific for it.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":750,"context_line":"                raise bgp_ext.NetworkNotBound(network_id\u003dnetwork_id)"},{"line_number":751,"context_line":""},{"line_number":752,"context_line":"    def _bgp_speaker_for_gateway_network(self, context,"},{"line_number":753,"context_line":"                                         network_id, ip_version):"},{"line_number":754,"context_line":"        \"\"\"Return the BgpSpeaker by given gateway network and ip_version\"\"\""},{"line_number":755,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":756,"context_line":"            query \u003d context.session.query(BgpSpeaker)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_9391e249","line":753,"updated":"2015-09-29 11:34:04.000000000","message":"This method is not called.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":750,"context_line":"                raise bgp_ext.NetworkNotBound(network_id\u003dnetwork_id)"},{"line_number":751,"context_line":""},{"line_number":752,"context_line":"    def _bgp_speaker_for_gateway_network(self, context,"},{"line_number":753,"context_line":"                                         network_id, ip_version):"},{"line_number":754,"context_line":"        \"\"\"Return the BgpSpeaker by given gateway network and ip_version\"\"\""},{"line_number":755,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":756,"context_line":"            query \u003d context.session.query(BgpSpeaker)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ec907345","line":753,"in_reply_to":"9a1a9d01_9391e249","updated":"2015-09-29 15:02:34.000000000","message":"This is called in the plugin implementation","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":18855,"name":"Siddanagouda Khot","email":"siddanmk@yahoo.co.in","username":"siddanmk"},"change_message_id":"f97cc7b82dac2c9094f8918ded1c6c5a7ad0028d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    # TODO(tidwellr) local_as should be unique within an address scope"},{"line_number":98,"context_line":"    local_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":99,"context_line":"    advertise_floating_ip_host_routes \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":100,"context_line":"    advertise_tenant_networks \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":101,"context_line":"    peers \u003d orm.relationship(BgpSpeakerPeerBinding,"},{"line_number":102,"context_line":"                             backref\u003d\u0027bgp_speaker_peer_bindings\u0027,"},{"line_number":103,"context_line":"                             cascade\u003d\u0027all, delete, delete-orphan\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"5a2ca52d_68b775f5","line":100,"updated":"2015-11-12 23:34:30.000000000","message":"Advertise_tenant_networks will interfere with snat_flag in l3 agent. May not work as expected.","commit_id":"b9dcc8a29509ff099903157bee7759c899c23467"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a2609aa65854f52392f5536dae46d73be8a577fe","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    # TODO(tidwellr) local_as should be unique within an address scope"},{"line_number":98,"context_line":"    local_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":99,"context_line":"    advertise_floating_ip_host_routes \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":100,"context_line":"    advertise_tenant_networks \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":101,"context_line":"    peers \u003d orm.relationship(BgpSpeakerPeerBinding,"},{"line_number":102,"context_line":"                             backref\u003d\u0027bgp_speaker_peer_bindings\u0027,"},{"line_number":103,"context_line":"                             cascade\u003d\u0027all, delete, delete-orphan\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_d3b35fe8","line":100,"in_reply_to":"5a2ca52d_68b775f5","updated":"2015-11-13 00:10:02.000000000","message":"I\u0027ll have to run my tests again, but I\u0027ve tried this out and conntrack might  be allowing this to work.  SNAT wasn\u0027t getting in the way for me.  I could SSH to the fixed IP just fine from outside.  Sort of an implementation detail, but this might slide with some good docs if there is a problem.  I don\u0027t suspect people who want directly routable tenant networks care about SNAT for their instances anyway (think IPv6) if it has to be disabled somehow.","commit_id":"b9dcc8a29509ff099903157bee7759c899c23467"}],"neutron/db/bgp_db.py":[{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"d264cabb96f095ca4ace3d79b26b9dc3fb0e6d6b","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @log_helpers.log_method_call"},{"line_number":114,"context_line":"    def create_bgp_speaker(self, context, bgp_speaker):"},{"line_number":115,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":116,"context_line":"        self._save_bgp_speaker(context, bgp_speaker, uuid)"},{"line_number":117,"context_line":"        return self.get_bgp_speaker(context, uuid)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"9a8ffd7b_ed507cd6","line":115,"updated":"2015-11-26 13:51:58.000000000","message":"I think should check whether the same bgpspeaker (same as and ip version) already exists here, right?","commit_id":"7ac3f4aaadb50e3abae08bc5d4962192679ccf67"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"97f636e82185fc4e24ce4a6b8c042092ee796740","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @log_helpers.log_method_call"},{"line_number":114,"context_line":"    def create_bgp_speaker(self, context, bgp_speaker):"},{"line_number":115,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":116,"context_line":"        self._save_bgp_speaker(context, bgp_speaker, uuid)"},{"line_number":117,"context_line":"        return self.get_bgp_speaker(context, uuid)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"9a8ffd7b_b5c6b647","line":115,"in_reply_to":"9a8ffd7b_ed507cd6","updated":"2015-11-30 18:16:21.000000000","message":"No, this is intentional.  The idea is that the operator may want to run identical BGP processes on different agents for HA purposes.  There may be a better way to handle that though.\n\nI also think that there may be use cases where the operator will want to re-use a local ASN across racks and \"hide\" the ASN with peering configuration.","commit_id":"7ac3f4aaadb50e3abae08bc5d4962192679ccf67"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"823b35c511ebeecc8dee0d523ce65fa0b26f77f1","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            return self._make_bgp_speaker_dict(bgp_speaker, fields)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    @log_helpers.log_method_call"},{"line_number":140,"context_line":"    @log_helpers.log_method_call"},{"line_number":141,"context_line":"    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):"},{"line_number":142,"context_line":"        bp \u003d bgp_speaker[bgp_ext.BGP_SPEAKER_BODY_KEY_NAME]"},{"line_number":143,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a7b0d38_5a2d9bfc","line":140,"updated":"2015-12-29 12:52:13.000000000","message":"Remove this","commit_id":"8b5506d2de7fb17cbe6b73bc0e02589bff398347"},{"author":{"_account_id":17609,"name":"steve","email":"ruansx@cn.ibm.com","username":"steve.ruan"},"change_message_id":"f06d762f86081e31921420d0474c54ae0507f316","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @log_helpers.log_method_call"},{"line_number":162,"context_line":"    def add_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":163,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":164,"context_line":"        self._save_bgp_speaker_peer_binding(context,"},{"line_number":165,"context_line":"                                            bgp_speaker_id,"},{"line_number":166,"context_line":"                                            bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":46,"id":"fa69d971_fcc31136","line":163,"range":{"start_line":163,"start_character":27,"end_line":163,"end_character":38},"updated":"2016-01-06 08:24:27.000000000","message":"should check whether this peer is added to other speakers","commit_id":"eb5a62d2f4e9f9d49bfb060822dd7cadee1a87de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9c7f33bf4d3de3ee5e2d43814d4f4a88863f8a64","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @log_helpers.log_method_call"},{"line_number":162,"context_line":"    def add_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":163,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":164,"context_line":"        self._save_bgp_speaker_peer_binding(context,"},{"line_number":165,"context_line":"                                            bgp_speaker_id,"},{"line_number":166,"context_line":"                                            bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":46,"id":"fa69d971_62cd3384","line":163,"range":{"start_line":163,"start_character":27,"end_line":163,"end_character":38},"in_reply_to":"fa69d971_fcc31136","updated":"2016-01-06 10:33:54.000000000","message":"I think we should not have such restrictions. If we check this then how we can ensure HA where same peer needs to be associated with 2 speakers.","commit_id":"eb5a62d2f4e9f9d49bfb060822dd7cadee1a87de"},{"author":{"_account_id":17609,"name":"steve","email":"ruansx@cn.ibm.com","username":"steve.ruan"},"change_message_id":"713c51570bfec57fca07cf861d42faefa9807e84","unresolved":false,"context_lines":[{"line_number":389,"context_line":"    def _get_bgp_speaker_network_binding(self, context,"},{"line_number":390,"context_line":"                                         bgp_speaker_id, network_id):"},{"line_number":391,"context_line":"        query \u003d self._model_query(context, BgpSpeakerNetworkBinding)"},{"line_number":392,"context_line":"        return query.filter(bgp_speaker_id \u003d\u003d bgp_speaker_id,"},{"line_number":393,"context_line":"                            network_id \u003d\u003d network_id).one()"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def _make_bgp_peer_dict(self, bgp_peer, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":46,"id":"fa69d971_bc50390c","line":392,"range":{"start_line":392,"start_character":28,"end_line":392,"end_character":42},"updated":"2016-01-06 08:11:16.000000000","message":"bgp_speaker_id should be BgpSpeakerNetworkBinding.bgp_speaker_id  and network_id should BgpSpeakerNetworkBinding.network_id","commit_id":"eb5a62d2f4e9f9d49bfb060822dd7cadee1a87de"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_62bac5c2","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":17},"updated":"2016-01-07 19:44:15.000000000","message":"nit: 2016  :)  Also, we are now Hewlett Packard Enterprise.  :)","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6e1ab23b4938fbba3b2a1886b834c73e9a921a9e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_8a1fc4b6","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":17},"in_reply_to":"fa69d971_62bac5c2","updated":"2016-02-02 22:34:09.000000000","message":"Done","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"DEVICE_OWNER_ROUTER_GW \u003d constants.DEVICE_OWNER_ROUTER_GW"},{"line_number":35,"context_line":"DEVICE_OWNER_ROUTER_INTF \u003d constants.DEVICE_OWNER_ROUTER_INTF"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class BgpSpeakerPeerBinding(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_821fb9b6","line":35,"range":{"start_line":34,"start_character":0,"end_line":35,"end_character":61},"updated":"2016-01-07 19:44:15.000000000","message":"These don\u0027t seem to be reference anywhere in this file.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6e1ab23b4938fbba3b2a1886b834c73e9a921a9e","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"DEVICE_OWNER_ROUTER_GW \u003d constants.DEVICE_OWNER_ROUTER_GW"},{"line_number":35,"context_line":"DEVICE_OWNER_ROUTER_INTF \u003d constants.DEVICE_OWNER_ROUTER_INTF"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class BgpSpeakerPeerBinding(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_aa1c00c2","line":35,"range":{"start_line":34,"start_character":0,"end_line":35,"end_character":61},"in_reply_to":"fa69d971_821fb9b6","updated":"2016-02-02 22:34:09.000000000","message":"Done","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class BgpSpeaker(model_base.BASEV2,"},{"line_number":75,"context_line":"                 models_v2.HasId,"},{"line_number":76,"context_line":"                 models_v2.HasTenant):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    \"\"\"Represents a BGP speaker\"\"\""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_02b3c90b","line":76,"range":{"start_line":75,"start_character":17,"end_line":76,"end_character":36},"updated":"2016-01-07 19:44:15.000000000","message":"These should come from model_base instead of models_v2.  See https://review.openstack.org/#/c/264420/.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6e1ab23b4938fbba3b2a1886b834c73e9a921a9e","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class BgpSpeaker(model_base.BASEV2,"},{"line_number":75,"context_line":"                 models_v2.HasId,"},{"line_number":76,"context_line":"                 models_v2.HasTenant):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    \"\"\"Represents a BGP speaker\"\"\""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_0ae674e8","line":76,"range":{"start_line":75,"start_character":17,"end_line":76,"end_character":36},"in_reply_to":"fa69d971_02b3c90b","updated":"2016-02-02 22:34:09.000000000","message":"Done","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f91cee35d2df7d018842d83f40bc945d18ee7f84","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                                backref\u003d\u0027bgp_speaker_network_bindings\u0027,"},{"line_number":92,"context_line":"                                cascade\u003d\u0027all, delete, delete-orphan\u0027,"},{"line_number":93,"context_line":"                                lazy\u003d\u0027joined\u0027)"},{"line_number":94,"context_line":"    address_scope_id \u003d sa.Column(sa.String(length\u003d36),"},{"line_number":95,"context_line":"                                 sa.ForeignKey(\u0027address_scopes.id\u0027,"},{"line_number":96,"context_line":"                                               ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":97,"context_line":"                                 nullable\u003dFalse, index\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_9224eec6","line":94,"range":{"start_line":94,"start_character":52,"end_line":94,"end_character":54},"updated":"2016-01-07 18:12:19.000000000","message":"This is implicit in the network binding. Locking into a single address scope will preclude using this mechanism for announcing VPN\u0027s via BGP.  Will undo in the next patch set.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dd8dcbd351561e8631bff724e099b043c4f8d85f","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                                backref\u003d\u0027bgp_speaker_network_bindings\u0027,"},{"line_number":92,"context_line":"                                cascade\u003d\u0027all, delete, delete-orphan\u0027,"},{"line_number":93,"context_line":"                                lazy\u003d\u0027joined\u0027)"},{"line_number":94,"context_line":"    address_scope_id \u003d sa.Column(sa.String(length\u003d36),"},{"line_number":95,"context_line":"                                 sa.ForeignKey(\u0027address_scopes.id\u0027,"},{"line_number":96,"context_line":"                                               ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":97,"context_line":"                                 nullable\u003dFalse, index\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_a9872711","line":94,"range":{"start_line":94,"start_character":52,"end_line":94,"end_character":54},"in_reply_to":"fa69d971_9224eec6","updated":"2016-01-08 03:43:18.000000000","message":"+1","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"class BgpPeer(model_base.BASEV2,"},{"line_number":101,"context_line":"              models_v2.HasId,"},{"line_number":102,"context_line":"              models_v2.HasTenant):"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    \"\"\"Represents a BGP routing peer.\"\"\""},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_22b84de5","line":102,"range":{"start_line":101,"start_character":14,"end_line":102,"end_character":33},"updated":"2016-01-07 19:44:15.000000000","message":"ditto","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6e1ab23b4938fbba3b2a1886b834c73e9a921a9e","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"class BgpPeer(model_base.BASEV2,"},{"line_number":101,"context_line":"              models_v2.HasId,"},{"line_number":102,"context_line":"              models_v2.HasTenant):"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    \"\"\"Represents a BGP routing peer.\"\"\""},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_0a82f4c8","line":102,"range":{"start_line":101,"start_character":14,"end_line":102,"end_character":33},"in_reply_to":"fa69d971_22b84de5","updated":"2016-02-02 22:34:09.000000000","message":"Done","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":116,"context_line":"class BgpDbMixin(common_db.CommonDbMixin,"},{"line_number":117,"context_line":"                 extraroute_db.ExtraRoute_dbonly_mixin):"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @log_helpers.log_method_call"},{"line_number":120,"context_line":"    def create_bgp_speaker(self, context, bgp_speaker):"},{"line_number":121,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":122,"context_line":"        self._save_bgp_speaker(context, bgp_speaker, uuid)"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_9519357c","line":119,"updated":"2016-01-07 19:44:15.000000000","message":"Do you want these to remain permanently?","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dd8dcbd351561e8631bff724e099b043c4f8d85f","unresolved":false,"context_lines":[{"line_number":116,"context_line":"class BgpDbMixin(common_db.CommonDbMixin,"},{"line_number":117,"context_line":"                 extraroute_db.ExtraRoute_dbonly_mixin):"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @log_helpers.log_method_call"},{"line_number":120,"context_line":"    def create_bgp_speaker(self, context, bgp_speaker):"},{"line_number":121,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":122,"context_line":"        self._save_bgp_speaker(context, bgp_speaker, uuid)"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_a9b5e7d0","line":119,"in_reply_to":"fa69d971_9519357c","updated":"2016-01-08 03:43:18.000000000","message":"IMO, this helps debugging. Let\u0027s keep it.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6e1ab23b4938fbba3b2a1886b834c73e9a921a9e","unresolved":false,"context_lines":[{"line_number":116,"context_line":"class BgpDbMixin(common_db.CommonDbMixin,"},{"line_number":117,"context_line":"                 extraroute_db.ExtraRoute_dbonly_mixin):"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @log_helpers.log_method_call"},{"line_number":120,"context_line":"    def create_bgp_speaker(self, context, bgp_speaker):"},{"line_number":121,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":122,"context_line":"        self._save_bgp_speaker(context, bgp_speaker, uuid)"}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_ea699826","line":119,"in_reply_to":"fa69d971_a9b5e7d0","updated":"2016-02-02 22:34:09.000000000","message":"Nope, gone.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"055ef6a226d5aaa5f4664177ceeb72f607c166e2","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                                            bgp_peer_id)"},{"line_number":162,"context_line":"        return {\u0027bgp_peer_id\u0027: bgp_peer_id}"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @log_helpers.log_method_call"},{"line_number":165,"context_line":"    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":166,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":167,"context_line":"        self._remove_bgp_speaker_peer_binding(context,"}],"source_content_type":"text/x-python","patch_set":53,"id":"9a68dd71_125e9745","line":164,"updated":"2016-01-27 05:48:57.000000000","message":"We can remove this log.","commit_id":"0682a47b7a0b3f9821780bb78262488ae58ff45a"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"79ae0aeaf662804a3efd0c2dac459e8a6a23b1c4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":55,"id":"7a5de9d1_de96503d","line":1,"updated":"2016-02-01 04:37:42.000000000","message":"Let\u0027s move bgp related files inside a separate bgp folder.","commit_id":"b159834d6fd4f86a89e9c6c947335aeaca26fe83"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a88b310e7233e7f420a66a798c1816c119a680e7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":55,"id":"7a5de9d1_02dc6644","line":1,"in_reply_to":"7a5de9d1_de96503d","updated":"2016-02-01 22:37:25.000000000","message":"I\u0027m trying to minimize thrash here.  There\u0027s not enough code here to warrant a new directory IMO, can we just leave it?  It will still separate from the main repo nicely in its current structure in the future if we indeed follow through with a split down the line.","commit_id":"b159834d6fd4f86a89e9c6c947335aeaca26fe83"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"bff226c20e0f8fdec8c9ae7141e1edd757aa316d","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"class BgpSpeaker(model_base.BASEV2,"},{"line_number":76,"context_line":"                 models_v2.HasId,"},{"line_number":77,"context_line":"                 models_v2.HasTenant):"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    \"\"\"Represents a BGP speaker\"\"\""}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_27ce09b5","line":76,"range":{"start_line":76,"start_character":17,"end_line":76,"end_character":26},"updated":"2016-02-02 21:51:15.000000000","message":"ping me when you\u0027ve had a chance to respond to my feedback from PS47.  Some of it was nit-picky but some of it was good feedback, especially in this file.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9597e4deaae4233b83eea9c957aab6ee6569c8fa","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"class BgpSpeaker(model_base.BASEV2,"},{"line_number":76,"context_line":"                 models_v2.HasId,"},{"line_number":77,"context_line":"                 models_v2.HasTenant):"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    \"\"\"Represents a BGP speaker\"\"\""}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_ca537c6b","line":76,"range":{"start_line":76,"start_character":17,"end_line":76,"end_character":26},"in_reply_to":"7a5de9d1_27ce09b5","updated":"2016-02-02 22:33:39.000000000","message":"Will fix the models_v2 vs. model_base boo boo in the next PS.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"59b7af69aa93660488159607e5734dc48fbd2db4","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    advertise_tenant_networks \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":87,"context_line":"    peers \u003d orm.relationship(BgpSpeakerPeerBinding,"},{"line_number":88,"context_line":"                             backref\u003d\u0027bgp_speaker_peer_bindings\u0027,"},{"line_number":89,"context_line":"                             cascade\u003d\u0027all, delete, delete-orphan\u0027,"},{"line_number":90,"context_line":"                             lazy\u003d\u0027joined\u0027)"},{"line_number":91,"context_line":"    networks \u003d orm.relationship(BgpSpeakerNetworkBinding,"},{"line_number":92,"context_line":"                                backref\u003d\u0027bgp_speaker_network_bindings\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_31342bdd","line":89,"range":{"start_line":89,"start_character":37,"end_line":89,"end_character":65},"updated":"2016-02-03 04:38:46.000000000","message":"gripe:  Maybe I\u0027m just in a bad mood tonight but all these strings are bothering me.  It should be a set of constants instead of an opaque string.  Yuck.  Looks like this is sqlalchemy\u0027s fault though.  So, there may be nothing you can do.\n\nSomething like this is what I\u0027m thinking should be done:\n\n  {ALL, DELETE, DELETE_ORPHAN}\n\nIt could actually be checked by static code analysis.  Oh well.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"59b7af69aa93660488159607e5734dc48fbd2db4","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                                            bgp_peer_id)"},{"line_number":162,"context_line":"        return {\u0027bgp_peer_id\u0027: bgp_peer_id}"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @log_helpers.log_method_call"},{"line_number":165,"context_line":"    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":166,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":167,"context_line":"        self._remove_bgp_speaker_peer_binding(context,"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_91dabf77","line":164,"range":{"start_line":164,"start_character":5,"end_line":164,"end_character":32},"updated":"2016-02-03 04:38:46.000000000","message":"Should probably be removed sometime soon.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"59b7af69aa93660488159607e5734dc48fbd2db4","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        except sa_exc.NoResultFound:"},{"line_number":245,"context_line":"            raise bgp_ext.BgpSpeakerNotFound(id\u003dbgp_speaker_id)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    def _get_bgp_speakers_by_binding_network(self, context, network_id):"},{"line_number":248,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":249,"context_line":"            query \u003d context.session.query(BgpSpeakerNetworkBinding)"},{"line_number":250,"context_line":"            query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_113c8f92","line":247,"range":{"start_line":247,"start_character":8,"end_line":247,"end_character":44},"updated":"2016-02-03 04:38:46.000000000","message":"I don\u0027t see this used anywhere.  Not a test or anything.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"}],"neutron/db/bgp_speaker_db.py":[{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"a5714accefc0bd76204756b3ec164ccfc2473558","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    __tablename__ \u003d \u0027peer_bgp_speaker_bindings\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    bgp_speaker_id \u003d sa.Column(sa.String(length\u003d36),"},{"line_number":46,"context_line":"                               sa.ForeignKey(\u0027bgp_speakers.id\u0027,"},{"line_number":47,"context_line":"                                             ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":48,"context_line":"                               nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_4c809ef7","line":45,"updated":"2015-07-14 17:20:27.000000000","message":"nit: we should really consider define 36 as a constant like UUID_LENGTH rather than as a magic constant (see also L50, 63, 68)","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6495e06a7aa6825fc4ef2e45dc66fbe4bd8cfb00","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    __tablename__ \u003d \u0027peer_bgp_speaker_bindings\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    bgp_speaker_id \u003d sa.Column(sa.String(length\u003d36),"},{"line_number":46,"context_line":"                               sa.ForeignKey(\u0027bgp_speakers.id\u0027,"},{"line_number":47,"context_line":"                                             ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":48,"context_line":"                               nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_a7c94028","line":45,"in_reply_to":"9a41bdd9_4c809ef7","updated":"2015-07-14 19:32:14.000000000","message":"Yes, I think Neutron as a whole would benefit from having some constants defined for common DB fields like UUID\u0027s.  To my knowledge these constants don\u0027t exist and if they do nobody uses them.","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"a5714accefc0bd76204756b3ec164ccfc2473558","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    __tablename__ \u003d \u0027bgp_speakers\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    # TODO(tidwellr) local_as should be unique within an address scope"},{"line_number":91,"context_line":"    local_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":92,"context_line":"    peers \u003d orm.relationship(PeerBgpSpeakerBinding,"},{"line_number":93,"context_line":"                             backref\u003d\u0027peer_bgp_speaker_bindings\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_4c0ade7a","line":90,"updated":"2015-07-14 17:20:27.000000000","message":"should we model AS as an extension of the routed L3 networks at some point?","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6495e06a7aa6825fc4ef2e45dc66fbe4bd8cfb00","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    __tablename__ \u003d \u0027bgp_speakers\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    # TODO(tidwellr) local_as should be unique within an address scope"},{"line_number":91,"context_line":"    local_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":92,"context_line":"    peers \u003d orm.relationship(PeerBgpSpeakerBinding,"},{"line_number":93,"context_line":"                             backref\u003d\u0027peer_bgp_speaker_bindings\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_27a690ae","line":90,"in_reply_to":"9a41bdd9_4c0ade7a","updated":"2015-07-14 19:32:14.000000000","message":"I don\u0027t think so. Someone should be able to run this service plugin without using routed network segments.  I don\u0027t think the local_as and front/backing networks are related that closely.  The way these concepts work together in practice is to bind a backing network to a BgpSpeaker.","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"a5714accefc0bd76204756b3ec164ccfc2473558","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    __tablename__ \u003d \u0027bgp_peers\u0027"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    peer_ip \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":111,"context_line":"    remote_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":112,"context_line":"    auth_type \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":113,"context_line":"    #TODO(tidwellr) re-visit password length"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_6c5d6278","line":110,"updated":"2015-07-14 17:20:27.000000000","message":"nit: we really should define 64 as a constant somewhere","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6495e06a7aa6825fc4ef2e45dc66fbe4bd8cfb00","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    __tablename__ \u003d \u0027bgp_peers\u0027"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    peer_ip \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":111,"context_line":"    remote_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":112,"context_line":"    auth_type \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":113,"context_line":"    #TODO(tidwellr) re-visit password length"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_aad2655a","line":110,"in_reply_to":"9a41bdd9_6c5d6278","updated":"2015-07-14 19:32:14.000000000","message":"Done","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"a5714accefc0bd76204756b3ec164ccfc2473558","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    peer_ip \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":111,"context_line":"    remote_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":112,"context_line":"    auth_type \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":113,"context_line":"    #TODO(tidwellr) re-visit password length"},{"line_number":114,"context_line":"    password \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_4ccf3e29","line":112,"updated":"2015-07-14 17:20:27.000000000","message":"ditto previous comments about magic","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"a5714accefc0bd76204756b3ec164ccfc2473558","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    peer_ip \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":111,"context_line":"    remote_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":112,"context_line":"    auth_type \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":113,"context_line":"    #TODO(tidwellr) re-visit password length"},{"line_number":114,"context_line":"    password \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_acce0a2c","line":113,"updated":"2015-07-14 17:20:27.000000000","message":"IIRC, it is 256 elsewhere, so shouldn\u0027t we use that?","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"6495e06a7aa6825fc4ef2e45dc66fbe4bd8cfb00","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    peer_ip \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":111,"context_line":"    remote_as \u003d sa.Column(sa.Integer, nullable\u003dFalse, autoincrement\u003dFalse)"},{"line_number":112,"context_line":"    auth_type \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":113,"context_line":"    #TODO(tidwellr) re-visit password length"},{"line_number":114,"context_line":"    password \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_8712fc07","line":113,"in_reply_to":"9a41bdd9_acce0a2c","updated":"2015-07-14 19:32:14.000000000","message":"Somehow I pushed an older version to this review, didn\u0027t mean to do that.  I have password length and etc. all fixed up.  Look for it in the next patch set.","commit_id":"6966883a6c750b178ab4c3a4c6f32c0dc6c2c075"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            bgp_speaker_db \u003d self._get_bgp_speaker(context, bgp_speaker_id)"},{"line_number":147,"context_line":"            bgp_speaker_db.update(bp)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        bgp_speaker_dict \u003d self._make_bgp_speaker_dict(bgp_speaker_db)"},{"line_number":150,"context_line":"        return bgp_speaker_dict"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def _save_bgp_speaker(self, context, bgp_speaker, uuid):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_e8111553","line":149,"updated":"2015-07-15 20:34:20.000000000","message":"nit: don\u0027t need temp var.","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        ri[\u0027tenant_id\u0027] \u003d context.tenant_id"},{"line_number":155,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":156,"context_line":"            res_keys \u003d [\u0027local_as\u0027, \u0027tenant_id\u0027]"},{"line_number":157,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":158,"context_line":"            res[\u0027id\u0027] \u003d uuid"},{"line_number":159,"context_line":"            bgp_speaker_db \u003d BgpSpeaker(**res)"},{"line_number":160,"context_line":"            context.session.add(bgp_speaker_db)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_28705da3","line":157,"updated":"2015-07-15 20:34:20.000000000","message":"nit: I guess since we no longer support python2.6, can use dict comprehension here. Same in a few other places.","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3c8e7bc4db17309218d51dabe61fb05dc885d368","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from neutron.common import constants"},{"line_number":27,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":28,"context_line":"from neutron.common import log"},{"line_number":29,"context_line":"from neutron.db import common_db_mixin as common_db"},{"line_number":30,"context_line":"from neutron.db import extraroute_db"},{"line_number":31,"context_line":"from neutron.db import l3_db"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_3163a81c","line":28,"updated":"2015-07-20 04:48:54.000000000","message":"Please change to \"from oslo_log import helpers as log_helpers\" as per \"https://review.openstack.org/#/c/202314/\"","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from neutron.common import constants"},{"line_number":27,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":28,"context_line":"from neutron.common import log"},{"line_number":29,"context_line":"from neutron.db import common_db_mixin as common_db"},{"line_number":30,"context_line":"from neutron.db import extraroute_db"},{"line_number":31,"context_line":"from neutron.db import l3_db"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_4998d91b","line":28,"in_reply_to":"3a50d1a3_3163a81c","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1cbb4e4fe942b4b4e0e76ec694d78cb0218dd432","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @log.log"},{"line_number":171,"context_line":"    def add_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":172,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":173,"context_line":"        self._save_bgp_speaker_peer_binding(context,"},{"line_number":174,"context_line":"                                            bgp_speaker_id,"},{"line_number":175,"context_line":"                                            bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_449469e7","line":172,"updated":"2015-07-24 10:29:48.000000000","message":"Should be \"_get_id_for(bgp_peer_info, \u0027peer_id\u0027)\" instead of \"_get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)\". Let us not suffix bgp_ and maintain uniformity with other attributes defined at the API layer.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @log.log"},{"line_number":171,"context_line":"    def add_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":172,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":173,"context_line":"        self._save_bgp_speaker_peer_binding(context,"},{"line_number":174,"context_line":"                                            bgp_speaker_id,"},{"line_number":175,"context_line":"                                            bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_e99e8506","line":172,"in_reply_to":"3a50d1a3_449469e7","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1cbb4e4fe942b4b4e0e76ec694d78cb0218dd432","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    @log.log"},{"line_number":179,"context_line":"    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":180,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":181,"context_line":"        self._remove_bgp_speaker_peer_binding(context,"},{"line_number":182,"context_line":"                                              bgp_speaker_id,"},{"line_number":183,"context_line":"                                              bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_6499651f","line":180,"updated":"2015-07-24 10:29:48.000000000","message":"Should be \"_get_id_for(bgp_peer_info, \u0027peer_id\u0027)\" instead of \"_get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)\". Let us not suffix bgp_ and maintain uniformity with other attributes defined at the API layer.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    @log.log"},{"line_number":179,"context_line":"    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":180,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":181,"context_line":"        self._remove_bgp_speaker_peer_binding(context,"},{"line_number":182,"context_line":"                                              bgp_speaker_id,"},{"line_number":183,"context_line":"                                              bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_09a2d14b","line":180,"in_reply_to":"3a50d1a3_6499651f","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1cbb4e4fe942b4b4e0e76ec694d78cb0218dd432","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        return {\u0027bgp_peer_id\u0027: bgp_peer_id}"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @log.log"},{"line_number":187,"context_line":"    def advertise_network(self, context,"},{"line_number":188,"context_line":"                          bgp_speaker_id, network_info):"},{"line_number":189,"context_line":"        network_id \u003d self._get_id_for(network_info, \u0027network_id\u0027)"},{"line_number":190,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_c46cf938","line":187,"updated":"2015-07-24 10:29:48.000000000","message":"how about renaming it to \"start_network_advertisement\"","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        return {\u0027bgp_peer_id\u0027: bgp_peer_id}"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @log.log"},{"line_number":187,"context_line":"    def advertise_network(self, context,"},{"line_number":188,"context_line":"                          bgp_speaker_id, network_info):"},{"line_number":189,"context_line":"        network_id \u003d self._get_id_for(network_info, \u0027network_id\u0027)"},{"line_number":190,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_a9895dcc","line":187,"in_reply_to":"3a50d1a3_c46cf938","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1cbb4e4fe942b4b4e0e76ec694d78cb0218dd432","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":216,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":217,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":218,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027, \u0027auth_type\u0027]"},{"line_number":219,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":220,"context_line":"            res[\u0027id\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":221,"context_line":"            bgp_peer_db \u003d BgpPeer(**res)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_a44a0dab","line":218,"updated":"2015-07-24 10:29:48.000000000","message":"\u0027auth_type\u0027 could not be specified without a password. I feel we have missed the password over here. Please check.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1747e322e39282e98250c1fff85fda10667de9fd","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":216,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":217,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":218,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027, \u0027auth_type\u0027]"},{"line_number":219,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":220,"context_line":"            res[\u0027id\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":221,"context_line":"            bgp_peer_db \u003d BgpPeer(**res)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_d9bec9ad","line":218,"in_reply_to":"3a50d1a3_a44a0dab","updated":"2015-08-01 06:29:05.000000000","message":"Addressed in PS9.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"185ee9a516d2df44adf3af00ff97023eb72c91c4","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                           resource\u003dbgp_speaker_ext.BGP_SPEAKER_RESOURCE_NAME,"},{"line_number":265,"context_line":"                           msg\u003dmsg)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":268,"context_line":"                                       bgp_peer_id):"},{"line_number":269,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":270,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_c054d722","line":267,"updated":"2015-07-24 15:03:32.000000000","message":"I think we need to do some validation over here. \n\nAssume speaker_1 is associated with peer_1 (IP:1.1.1.1, Remote-AS:1).\n\nNow, someone try associating a new peer_2 (IP:1.1.1.1, Remote-AS:1) with the same speaker_1. This will suceed as the peer_uuid for both the records will be different.\n\nI feel such type of association should be avoided.\n\nPlease check for network as well.\n\nviksdeep@ubuntu:~/devstack$ neutron bgp-peer-list\n\n+--------------------------------------+----------------------------------+\n\n| id                                   | tenant_id                        |\n\n+--------------------------------------+----------------------------------+\n\n| 56cd1d6f-a2d6-47d6-91c0-97843bc3275d | 983d6677c81f44d18dc6e33f8501ced7 |\n\n| 8eed0381-7450-4089-8e00-0870514a9515 | 983d6677c81f44d18dc6e33f8501ced7 |\n\n+--------------------------------------+----------------------------------+\n\nviksdeep@ubuntu:~/devstack$ neutron bgp-peer-show 56cd1d6f-a2d6-47d6-91c0-97843bc3275d\n+-----------+--------------------------------------+\n\n| Field     | Value                                |\n\n+-----------+--------------------------------------+\n\n| auth_type | md5                               \n   |\n| id        | 56cd1d6f-a2d6-47d6-91c0-97843bc3275d |\n\n| peer_ip   | 1.1.1.1                              |\n\n| remote_as | 1                                    |\n\n| tenant_id | 983d6677c81f44d18dc6e33f8501ced7     |\n\n+-----------+--------------------------------------+\n\nviksdeep@ubuntu:~/devstack$ neutron bgp-peer-show 8eed0381-7450-4089-8e00-0870514a9515\n\n+-----------+--------------------------------------+\n\n| Field     | Value                                |\n\n+-----------+--------------------------------------+\n\n| auth_type | md5                                  |\n\n| id        | 8eed0381-7450-4089-8e00-0870514a9515 |\n\n| peer_ip   | 1.1.1.1                              |\n\n| remote_as | 1                                    |\n\n| tenant_id | 983d6677c81f44d18dc6e33f8501ced7     |\n\n+-----------+--------------------------------------+\n\n\nviksdeep@ubuntu:~/devstack$ neutron bgp-speaker-peer-add 54aba00b-5869-4603-96e5-80af289fad1b 356eefa3-3f9d-4e92-a30c-053fa563d0b8\n\nviksdeep@ubuntu:~/devstack$ neutron bgp-speaker-peer-add 54aba00b-5869-4603-96e5-80af289fad1b  8eed0381-7450-4089-8e00-0870514a9515\n\nviksdeep@ubuntu:~/devstack$ neutron bgp-speaker-show 54aba00b-5869-4603-96e5-80af289fad1b\n\n+-----------+--------------------------------------+\n\n| Field     | Value                                |\n\n+-----------+--------------------------------------+\n\n| id        | 54aba00b-5869-4603-96e5-80af289fad1b |\n\n| local_as  | 1                                    |\n\n| networks  |                                      |\n\n| peers     | 56cd1d6f-a2d6-47d6-91c0-97843bc3275d |\n\n|           | 8eed0381-7450-4089-8e00-0870514a9515 |\n\n| tenant_id | 983d6677c81f44d18dc6e33f8501ced7     |\n\n+-----------+--------------------------------------+","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"185ee9a516d2df44adf3af00ff97023eb72c91c4","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":268,"context_line":"                                       bgp_peer_id):"},{"line_number":269,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":270,"context_line":"            try:"},{"line_number":271,"context_line":"                bgp_speaker \u003d self._get_by_id(context, BgpSpeaker,"},{"line_number":272,"context_line":"                                              bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_3be60ce9","line":269,"updated":"2015-07-24 15:03:32.000000000","message":"Above comment needs to be fixed else it will result in exception during dis-association.\n\n2015-07-24 20:31:19.397 20731 TRACE neutron.api.v2.resource     bgp_peer_id)\n2015-07-24 20:31:19.397 20731 TRACE neutron.api.v2.resource   File \"/opt/stack/neutron/neutron/db/bgp_speaker_db.py\", line 296, in _remove_bgp_speaker_peer_binding\n2015-07-24 20:31:19.397 20731 TRACE neutron.api.v2.resource     bgp_peer_id)\n2015-07-24 20:31:19.397 20731 TRACE neutron.api.v2.resource   File \"/opt/stack/neutron/neutron/db/bgp_speaker_db.py\", line 363, in _get_bgp_speaker_peer_binding\n2015-07-24 20:31:19.397 20731 TRACE neutron.api.v2.resource     bgp_peer_id \u003d\u003d bgp_peer_id).one()\n2015-07-24 20:31:19.397 20731 TRACE neutron.api.v2.resource   File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py\", line 2407, in one\n2015-07-24 20:31:19.397 20731 TRACE neutron.api.v2.resource     \"Multiple rows were found for one()\")\n2015-07-24 20:31:19.397 20731 TRACE neutron.api.v2.resource MultipleResultsFound: Multiple rows were found for one()\n\nviksdeep@ubuntu:~/devstack$ neutron bgp-speaker-peer-remove 54aba00b-5869-4603-96e5-80af289fad1b  8eed0381-7450-4089-8e00-0870514a9515\nRequest Failed: internal server error while processing your request.\nviksdeep@ubuntu:~/devstack$","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"185ee9a516d2df44adf3af00ff97023eb72c91c4","unresolved":false,"context_lines":[{"line_number":299,"context_line":"                                                bgp_speaker_id\u003dbgp_speaker_id)"},{"line_number":300,"context_line":"            context.session.delete(binding)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def _save_bgp_speaker_network_binding(self, context,"},{"line_number":303,"context_line":"                                          bgp_speaker_id, network_id):"},{"line_number":304,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":305,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_1be4700b","line":302,"updated":"2015-07-24 15:03:32.000000000","message":"I think we need to do some validation over here. Please check the comments provided for _save_bgp_speaker_peer_binding","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"df8c23d5a821a2341088b6be5468d57cd1ca3efa","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                                              bgp_speaker_id,"},{"line_number":191,"context_line":"                                              bgp_peer_id)"},{"line_number":192,"context_line":"        return {\u0027bgp_peer_id\u0027: bgp_peer_id}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    @log.log"},{"line_number":195,"context_line":"    def advertise_network(self, context,"},{"line_number":196,"context_line":"                          bgp_speaker_id, network_info):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_2e26b3ba","line":193,"updated":"2015-07-25 10:52:40.000000000","message":"Definition for update_bgp_peer is missing. Since, only password updation is allowed some short of validation is required against auth_type. \nConsider a scenario in which the user try to set a peer\u0027s password whose auth_type is none. Such operation should not be allowed.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dc0c698e8e0ea05d884bb9182c310143b27d53fa","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                                              bgp_speaker_id,"},{"line_number":191,"context_line":"                                              bgp_peer_id)"},{"line_number":192,"context_line":"        return {\u0027bgp_peer_id\u0027: bgp_peer_id}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    @log.log"},{"line_number":195,"context_line":"    def advertise_network(self, context,"},{"line_number":196,"context_line":"                          bgp_speaker_id, network_info):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_6906f521","line":193,"in_reply_to":"3a50d1a3_2e26b3ba","updated":"2015-07-25 15:08:12.000000000","message":"Addressed in PS6.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"df8c23d5a821a2341088b6be5468d57cd1ca3efa","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            context.session.delete(binding)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _make_bgp_speaker_dict(self, bgp_speaker, fields\u003dNone):"},{"line_number":344,"context_line":"        attrs \u003d {\u0027id\u0027, \u0027local_as\u0027, \u0027tenant_id\u0027}"},{"line_number":345,"context_line":"        peer_bindings \u003d bgp_speaker[\u0027peers\u0027]"},{"line_number":346,"context_line":"        network_bindings \u003d bgp_speaker[\u0027networks\u0027]"},{"line_number":347,"context_line":"        res \u003d dict((k, bgp_speaker[k]) for k in attrs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_6e34bbdd","line":344,"updated":"2015-07-25 10:52:40.000000000","message":"Plz add, \u0027advertise_floating_ip_host_routes\u0027  and               \u0027advertise_tenant_networks\u0027 to the attrs otherwise GET call can\u0027t retrieve these values.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dc0c698e8e0ea05d884bb9182c310143b27d53fa","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            context.session.delete(binding)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _make_bgp_speaker_dict(self, bgp_speaker, fields\u003dNone):"},{"line_number":344,"context_line":"        attrs \u003d {\u0027id\u0027, \u0027local_as\u0027, \u0027tenant_id\u0027}"},{"line_number":345,"context_line":"        peer_bindings \u003d bgp_speaker[\u0027peers\u0027]"},{"line_number":346,"context_line":"        network_bindings \u003d bgp_speaker[\u0027networks\u0027]"},{"line_number":347,"context_line":"        res \u003d dict((k, bgp_speaker[k]) for k in attrs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_3bffd002","line":344,"in_reply_to":"3a50d1a3_6e34bbdd","updated":"2015-07-25 15:08:12.000000000","message":"Addressed in PS6.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ef81d7ffa4755e25a117edc6b6ca1c9601bb13e7","unresolved":false,"context_lines":[{"line_number":41,"context_line":"DEVICE_OWNER_ROUTER_INTF \u003d constants.DEVICE_OWNER_ROUTER_INTF"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class PeerBgpSpeakerBinding(model_base.BASEV2):"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    \"\"\"Represents a mapping between BGP speaker and BGP peer\"\"\""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_e30bef22","line":44,"updated":"2015-07-27 14:38:49.000000000","message":"Rename to BgpSpeakerPeerBinding.","commit_id":"c6af5f5dfbbb8448b344cf87a8a866d4b99f3d3b"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ff29c0e64e9c11ec0f3e48bee1be7951b95da681","unresolved":false,"context_lines":[{"line_number":41,"context_line":"DEVICE_OWNER_ROUTER_INTF \u003d constants.DEVICE_OWNER_ROUTER_INTF"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class PeerBgpSpeakerBinding(model_base.BASEV2):"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    \"\"\"Represents a mapping between BGP speaker and BGP peer\"\"\""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_7903f576","line":44,"in_reply_to":"3a50d1a3_e30bef22","updated":"2015-08-01 06:29:19.000000000","message":"Addressed in PS9.","commit_id":"c6af5f5dfbbb8448b344cf87a8a866d4b99f3d3b"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    )"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class BgpSpeaker(model_base.BASEV2,"},{"line_number":88,"context_line":"                 models_v2.HasId,"},{"line_number":89,"context_line":"                 models_v2.HasTenant):"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_798e9528","line":87,"updated":"2015-08-01 06:33:18.000000000","message":"As per PEP8 guidelines how about renaming \"Bgp\" \u003d\u003d\u003e \"BGP\"?\n\nRequest you to check at all the places.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            return self._make_bgp_speaker_dict(bgp_speaker, fields)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @log_helpers.log_method_call"},{"line_number":149,"context_line":"    def get_bgp_speaker_detail_for_dragent(self, context,"},{"line_number":150,"context_line":"                                           bgp_speaker_id, fields\u003dNone):"},{"line_number":151,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":152,"context_line":"            bgp_speaker \u003d self._get_bgp_speaker(context, bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_f9a2a599","line":149,"updated":"2015-08-01 06:33:18.000000000","message":"Need to add unit tests for this API.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                                      bgp_speaker, fields)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    @log_helpers.log_method_call"},{"line_number":157,"context_line":"    def get_bgp_peer_detail_for_dragent(self, context,"},{"line_number":158,"context_line":"                                        bgp_peer_id, fields\u003dNone):"},{"line_number":159,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":160,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_199e7154","line":157,"updated":"2015-08-01 06:33:18.000000000","message":"Need to add unit tests for this API.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                                                       bgp_speaker_id)"},{"line_number":294,"context_line":"        return self._make_advertised_routes_dict(routes)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def _get_advertised_routes_for_dragent(self, context, bgp_speaker_id):"},{"line_number":297,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":298,"context_line":"                                                       bgp_speaker_id)"},{"line_number":299,"context_line":"        return self._make_advertised_routes_list(routes)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_b9ac1d8d","line":296,"updated":"2015-08-01 06:33:18.000000000","message":"Need to add unit tests for this API.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":307,"context_line":"                           resource\u003dbgp_speaker_ext.BGP_SPEAKER_RESOURCE_NAME,"},{"line_number":308,"context_line":"                           msg\u003dmsg)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":311,"context_line":"                                       bgp_peer_id):"},{"line_number":312,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":313,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_99dfe10b","line":310,"updated":"2015-08-01 06:33:18.000000000","message":"Please address PS4 comment.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":311,"context_line":"                                       bgp_peer_id):"},{"line_number":312,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":313,"context_line":"            try:"},{"line_number":314,"context_line":"                bgp_speaker \u003d self._get_by_id(context, BgpSpeaker,"},{"line_number":315,"context_line":"                                              bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_39e6cde8","line":312,"updated":"2015-08-01 06:33:18.000000000","message":"Please address PS4 comment.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                                                bgp_speaker_id\u003dbgp_speaker_id)"},{"line_number":343,"context_line":"            context.session.delete(binding)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def _save_bgp_speaker_network_binding(self, context,"},{"line_number":346,"context_line":"                                          bgp_speaker_id, network_id):"},{"line_number":347,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":348,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_f9d065f9","line":345,"updated":"2015-08-01 06:33:18.000000000","message":"Please address PS4 comment.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"962e2f025f85c6eef1fdd2b39bf87a86ec3e005f","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            return self._make_bgp_speaker_dict(bgp_speaker, fields)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @log_helpers.log_method_call"},{"line_number":149,"context_line":"    def get_bgp_speaker_detail_for_dragent(self, context,"},{"line_number":150,"context_line":"                                           bgp_speaker_id, fields\u003dNone):"},{"line_number":151,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":152,"context_line":"            bgp_speaker \u003d self._get_bgp_speaker(context, bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_1d5f780f","line":149,"updated":"2015-08-10 11:08:19.000000000","message":"Check PS9 comment.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"962e2f025f85c6eef1fdd2b39bf87a86ec3e005f","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                                      bgp_speaker, fields)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    @log_helpers.log_method_call"},{"line_number":157,"context_line":"    def get_bgp_peer_detail_for_dragent(self, context,"},{"line_number":158,"context_line":"                                        bgp_peer_id, fields\u003dNone):"},{"line_number":159,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":160,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_bd9a04c4","line":157,"updated":"2015-08-10 11:08:19.000000000","message":"Check PS9 comment.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"962e2f025f85c6eef1fdd2b39bf87a86ec3e005f","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                                                       bgp_speaker_id)"},{"line_number":294,"context_line":"        return self._make_advertised_routes_dict(routes)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def _get_advertised_routes_for_dragent(self, context, bgp_speaker_id):"},{"line_number":297,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":298,"context_line":"                                                       bgp_speaker_id)"},{"line_number":299,"context_line":"        return self._make_advertised_routes_list(routes)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_dd9fd0b2","line":296,"updated":"2015-08-10 11:08:19.000000000","message":"Check PS9 comment.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"962e2f025f85c6eef1fdd2b39bf87a86ec3e005f","unresolved":false,"context_lines":[{"line_number":307,"context_line":"                           resource\u003dbgp_speaker_ext.BGP_SPEAKER_RESOURCE_NAME,"},{"line_number":308,"context_line":"                           msg\u003dmsg)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":311,"context_line":"                                       bgp_peer_id):"},{"line_number":312,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":313,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_9da948e2","line":310,"updated":"2015-08-10 11:08:19.000000000","message":"Check PS4 comment.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"962e2f025f85c6eef1fdd2b39bf87a86ec3e005f","unresolved":false,"context_lines":[{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":311,"context_line":"                                       bgp_peer_id):"},{"line_number":312,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":313,"context_line":"            try:"},{"line_number":314,"context_line":"                bgp_speaker \u003d self._get_by_id(context, BgpSpeaker,"},{"line_number":315,"context_line":"                                              bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_3dafd4e4","line":312,"updated":"2015-08-10 11:08:19.000000000","message":"Check PS4 comment.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"962e2f025f85c6eef1fdd2b39bf87a86ec3e005f","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                                                bgp_speaker_id\u003dbgp_speaker_id)"},{"line_number":343,"context_line":"            context.session.delete(binding)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def _save_bgp_speaker_network_binding(self, context,"},{"line_number":346,"context_line":"                                          bgp_speaker_id, network_id):"},{"line_number":347,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":348,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_fdb88c2c","line":345,"updated":"2015-08-10 11:08:19.000000000","message":"Check PS4 comment.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return self._make_bgp_speaker_dict(bgp_speaker, fields)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @log_helpers.log_method_call"},{"line_number":155,"context_line":"    def get_bgp_speaker_detail_for_dragent(self, context,"},{"line_number":156,"context_line":"                                           bgp_speaker_id, fields\u003dNone):"},{"line_number":157,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":158,"context_line":"            bgp_speaker \u003d self._get_bgp_speaker(context, bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_3660aaa4","line":155,"updated":"2015-08-13 07:28:52.000000000","message":"Check PS9 comment.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return self._make_bgp_speaker_dict(bgp_speaker, fields)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @log_helpers.log_method_call"},{"line_number":155,"context_line":"    def get_bgp_speaker_detail_for_dragent(self, context,"},{"line_number":156,"context_line":"                                           bgp_speaker_id, fields\u003dNone):"},{"line_number":157,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":158,"context_line":"            bgp_speaker \u003d self._get_bgp_speaker(context, bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_49049017","line":155,"in_reply_to":"1a4dcd0f_3660aaa4","updated":"2015-08-13 21:47:00.000000000","message":"This method does not belong in this patch set, should move to a dependent patch set","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"28211856c734ad92debcba1495ceb64ebd0af452","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return self._make_bgp_speaker_dict(bgp_speaker, fields)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @log_helpers.log_method_call"},{"line_number":155,"context_line":"    def get_bgp_speaker_detail_for_dragent(self, context,"},{"line_number":156,"context_line":"                                           bgp_speaker_id, fields\u003dNone):"},{"line_number":157,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":158,"context_line":"            bgp_speaker \u003d self._get_bgp_speaker(context, bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_6f34e2fa","line":155,"in_reply_to":"1a4dcd0f_49049017","updated":"2015-08-14 04:48:43.000000000","message":"Will move it.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                                                      bgp_speaker, fields)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @log_helpers.log_method_call"},{"line_number":163,"context_line":"    def get_bgp_peer_detail_for_dragent(self, context,"},{"line_number":164,"context_line":"                                        bgp_peer_id, fields\u003dNone):"},{"line_number":165,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":166,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_5663f6b0","line":163,"updated":"2015-08-13 07:28:52.000000000","message":"Check PS9 comment.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"28211856c734ad92debcba1495ceb64ebd0af452","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                                                      bgp_speaker, fields)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @log_helpers.log_method_call"},{"line_number":163,"context_line":"    def get_bgp_peer_detail_for_dragent(self, context,"},{"line_number":164,"context_line":"                                        bgp_peer_id, fields\u003dNone):"},{"line_number":165,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":166,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_cf23b6bd","line":163,"in_reply_to":"1a4dcd0f_0d0c533a","updated":"2015-08-14 04:48:43.000000000","message":"Will move it.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                                                      bgp_speaker, fields)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @log_helpers.log_method_call"},{"line_number":163,"context_line":"    def get_bgp_peer_detail_for_dragent(self, context,"},{"line_number":164,"context_line":"                                        bgp_peer_id, fields\u003dNone):"},{"line_number":165,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":166,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_0d0c533a","line":163,"in_reply_to":"1a4dcd0f_5663f6b0","updated":"2015-08-13 21:47:00.000000000","message":"Same as L155","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                                                       bgp_speaker_id)"},{"line_number":319,"context_line":"        return self._make_advertised_routes_dict(routes)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _get_advertised_routes_for_dragent(self, context, bgp_speaker_id):"},{"line_number":322,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":323,"context_line":"                                                       bgp_speaker_id)"},{"line_number":324,"context_line":"        return self._make_advertised_routes_list(routes)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_1659eefc","line":321,"updated":"2015-08-13 07:28:52.000000000","message":"Check PS9 comment.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                                                       bgp_speaker_id)"},{"line_number":319,"context_line":"        return self._make_advertised_routes_dict(routes)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _get_advertised_routes_for_dragent(self, context, bgp_speaker_id):"},{"line_number":322,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":323,"context_line":"                                                       bgp_speaker_id)"},{"line_number":324,"context_line":"        return self._make_advertised_routes_list(routes)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_cd350bdc","line":321,"in_reply_to":"1a4dcd0f_1659eefc","updated":"2015-08-13 21:47:00.000000000","message":"This method is unnecessary, just call get_all_routes_by_bgp_speaker_id() to get this info","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                           resource\u003dbgp_speaker_ext.BGP_SPEAKER_RESOURCE_NAME,"},{"line_number":333,"context_line":"                           msg\u003dmsg)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":336,"context_line":"                                       bgp_peer_id):"},{"line_number":337,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":338,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_766ab282","line":335,"updated":"2015-08-13 07:28:52.000000000","message":"Check PS4 comment.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                           resource\u003dbgp_speaker_ext.BGP_SPEAKER_RESOURCE_NAME,"},{"line_number":333,"context_line":"                           msg\u003dmsg)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":336,"context_line":"                                       bgp_peer_id):"},{"line_number":337,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":338,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_2d5cafef","line":335,"in_reply_to":"1a4dcd0f_766ab282","updated":"2015-08-13 21:47:00.000000000","message":"Yes, we need to do something here.  That behavior is not good.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":336,"context_line":"                                       bgp_peer_id):"},{"line_number":337,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":338,"context_line":"            try:"},{"line_number":339,"context_line":"                bgp_speaker \u003d self._get_by_id(context, BgpSpeaker,"},{"line_number":340,"context_line":"                                              bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_9665feaf","line":337,"updated":"2015-08-13 07:28:52.000000000","message":"Check PS4 comment.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":336,"context_line":"                                       bgp_peer_id):"},{"line_number":337,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":338,"context_line":"            try:"},{"line_number":339,"context_line":"                bgp_speaker \u003d self._get_by_id(context, BgpSpeaker,"},{"line_number":340,"context_line":"                                              bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_cdc98b7b","line":337,"in_reply_to":"1a4dcd0f_9665feaf","updated":"2015-08-13 21:47:00.000000000","message":"Yes, we need to use the ip_version of the bgp_speaker on delete.  Unit tests are woefully lacking.....","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"            try:"},{"line_number":361,"context_line":"                binding \u003d self._get_bgp_speaker_peer_binding(context,"},{"line_number":362,"context_line":"                                                             bgp_speaker_id,"},{"line_number":363,"context_line":"                                                             bgp_peer_id)"},{"line_number":364,"context_line":"            except sa_exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_96c17e50","line":361,"updated":"2015-08-13 07:28:52.000000000","message":"I think we cannot bind IPv4 peers with IPv6 BGP speakers and vice-versa. Please check the applicability of this scenario.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"            try:"},{"line_number":361,"context_line":"                binding \u003d self._get_bgp_speaker_peer_binding(context,"},{"line_number":362,"context_line":"                                                             bgp_speaker_id,"},{"line_number":363,"context_line":"                                                             bgp_peer_id)"},{"line_number":364,"context_line":"            except sa_exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_c9418065","line":361,"in_reply_to":"1a4dcd0f_96c17e50","updated":"2015-08-13 21:47:00.000000000","message":"ip_version of the speaker is not related to the address family of the IP used for peering.  You can exchange routes IPv6 prefixes over IPv4 peering session and vice-versa.  All ip_version specifies is the address family the speaker will speak for.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"28211856c734ad92debcba1495ceb64ebd0af452","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"            try:"},{"line_number":361,"context_line":"                binding \u003d self._get_bgp_speaker_peer_binding(context,"},{"line_number":362,"context_line":"                                                             bgp_speaker_id,"},{"line_number":363,"context_line":"                                                             bgp_peer_id)"},{"line_number":364,"context_line":"            except sa_exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_ca496434","line":361,"in_reply_to":"1a4dcd0f_c9418065","updated":"2015-08-14 04:48:43.000000000","message":"Agreed.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                                                bgp_speaker_id\u003dbgp_speaker_id)"},{"line_number":368,"context_line":"            context.session.delete(binding)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def _save_bgp_speaker_network_binding(self,"},{"line_number":371,"context_line":"                                          context,"},{"line_number":372,"context_line":"                                          bgp_speaker_id,"},{"line_number":373,"context_line":"                                          network_id):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_36074acb","line":370,"updated":"2015-08-13 07:28:52.000000000","message":"Check PS4 comment.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":386,"context_line":"                raise bgp_speaker_ext.NetworkNotFound(network_id\u003dnetwork_id)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"            binding \u003d BgpSpeakerNetworkBinding("},{"line_number":389,"context_line":"                                            bgp_speaker_id\u003dbgp_speaker.id,"},{"line_number":390,"context_line":"                                            network_id\u003dnetwork.id,"},{"line_number":391,"context_line":"                                            ip_version\u003dbgp_speaker.ip_version)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_d6e4e60d","line":388,"updated":"2015-08-13 07:28:52.000000000","message":"I think we cannot bind IPv4 networks with IPv6 BGP speakers and vice-versa. Please check the applicability of this scenario.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"28211856c734ad92debcba1495ceb64ebd0af452","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":386,"context_line":"                raise bgp_speaker_ext.NetworkNotFound(network_id\u003dnetwork_id)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"            binding \u003d BgpSpeakerNetworkBinding("},{"line_number":389,"context_line":"                                            bgp_speaker_id\u003dbgp_speaker.id,"},{"line_number":390,"context_line":"                                            network_id\u003dnetwork.id,"},{"line_number":391,"context_line":"                                            ip_version\u003dbgp_speaker.ip_version)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_4a5c74f0","line":388,"in_reply_to":"1a4dcd0f_4956d02b","updated":"2015-08-14 04:48:43.000000000","message":"Let\u0027s document it in the devref.\n\nHow about displaying an info message to the user while binding IPv4 and IPv6 network to a BGPv4 speaker saying \"Only IPv4 subnet will be advertised\" and other way round.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":386,"context_line":"                raise bgp_speaker_ext.NetworkNotFound(network_id\u003dnetwork_id)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"            binding \u003d BgpSpeakerNetworkBinding("},{"line_number":389,"context_line":"                                            bgp_speaker_id\u003dbgp_speaker.id,"},{"line_number":390,"context_line":"                                            network_id\u003dnetwork.id,"},{"line_number":391,"context_line":"                                            ip_version\u003dbgp_speaker.ip_version)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_4956d02b","line":388,"in_reply_to":"1a4dcd0f_d6e4e60d","updated":"2015-08-13 21:47:00.000000000","message":"See L361","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return self._make_bgp_speaker_dict(bgp_speaker, fields)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @log_helpers.log_method_call"},{"line_number":155,"context_line":"    def get_bgp_speaker_detail_for_dragent(self, context,"},{"line_number":156,"context_line":"                                           bgp_speaker_id, fields\u003dNone):"},{"line_number":157,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":158,"context_line":"            bgp_speaker \u003d self._get_bgp_speaker(context, bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_42aafbd5","line":155,"updated":"2015-08-18 07:18:14.000000000","message":"move this function to the dependent patch.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9ca7b98130d8b5a6c72de95814e37b46bda6b8a1","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return self._make_bgp_speaker_dict(bgp_speaker, fields)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @log_helpers.log_method_call"},{"line_number":155,"context_line":"    def get_bgp_speaker_detail_for_dragent(self, context,"},{"line_number":156,"context_line":"                                           bgp_speaker_id, fields\u003dNone):"},{"line_number":157,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":158,"context_line":"            bgp_speaker \u003d self._get_bgp_speaker(context, bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_fa8017c1","line":155,"in_reply_to":"fa1b9901_42aafbd5","updated":"2015-08-20 12:03:17.000000000","message":"Done.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                                                      bgp_speaker, fields)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @log_helpers.log_method_call"},{"line_number":163,"context_line":"    def get_bgp_peer_detail_for_dragent(self, context,"},{"line_number":164,"context_line":"                                        bgp_peer_id, fields\u003dNone):"},{"line_number":165,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":166,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_e2af8fe1","line":163,"updated":"2015-08-18 07:18:14.000000000","message":"move this function to the dependent patch.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9ca7b98130d8b5a6c72de95814e37b46bda6b8a1","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                                                      bgp_speaker, fields)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @log_helpers.log_method_call"},{"line_number":163,"context_line":"    def get_bgp_peer_detail_for_dragent(self, context,"},{"line_number":164,"context_line":"                                        bgp_peer_id, fields\u003dNone):"},{"line_number":165,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":166,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_da6c3337","line":163,"in_reply_to":"fa1b9901_e2af8fe1","updated":"2015-08-20 12:03:17.000000000","message":"Done.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    @log_helpers.log_method_call"},{"line_number":202,"context_line":"    def add_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":203,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":204,"context_line":"        self._save_bgp_speaker_peer_binding(context,"},{"line_number":205,"context_line":"                                            bgp_speaker_id,"},{"line_number":206,"context_line":"                                            bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_c2e4cb3c","line":203,"updated":"2015-08-18 07:18:14.000000000","message":"this should be \"peer_id\".","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"be0a6fcfdc386062e7313fe3bdc497530f527213","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    @log_helpers.log_method_call"},{"line_number":202,"context_line":"    def add_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":203,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":204,"context_line":"        self._save_bgp_speaker_peer_binding(context,"},{"line_number":205,"context_line":"                                            bgp_speaker_id,"},{"line_number":206,"context_line":"                                            bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_fd6b31b7","line":203,"in_reply_to":"fa1b9901_c2e4cb3c","updated":"2015-08-20 12:10:52.000000000","message":"this must be \"bgp_peer_id\". My observation was wrong.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    @log_helpers.log_method_call"},{"line_number":210,"context_line":"    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":211,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":212,"context_line":"        self._remove_bgp_speaker_peer_binding(context,"},{"line_number":213,"context_line":"                                              bgp_speaker_id,"},{"line_number":214,"context_line":"                                              bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_a2e7573f","line":211,"updated":"2015-08-18 07:18:14.000000000","message":"this should be \"peer_id\".","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"be0a6fcfdc386062e7313fe3bdc497530f527213","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    @log_helpers.log_method_call"},{"line_number":210,"context_line":"    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":211,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":212,"context_line":"        self._remove_bgp_speaker_peer_binding(context,"},{"line_number":213,"context_line":"                                              bgp_speaker_id,"},{"line_number":214,"context_line":"                                              bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_1d7145a8","line":211,"in_reply_to":"fa1b9901_a2e7573f","updated":"2015-08-20 12:10:52.000000000","message":"this must be \"bgp_peer_id\". My observation was wrong.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                                                       bgp_speaker_id)"},{"line_number":319,"context_line":"        return self._make_advertised_routes_dict(routes)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _get_advertised_routes_for_dragent(self, context, bgp_speaker_id):"},{"line_number":322,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":323,"context_line":"                                                       bgp_speaker_id)"},{"line_number":324,"context_line":"        return self._make_advertised_routes_list(routes)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_02c2c385","line":321,"updated":"2015-08-18 07:18:14.000000000","message":"Check PS12 comment","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9ca7b98130d8b5a6c72de95814e37b46bda6b8a1","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                                                       bgp_speaker_id)"},{"line_number":319,"context_line":"        return self._make_advertised_routes_dict(routes)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _get_advertised_routes_for_dragent(self, context, bgp_speaker_id):"},{"line_number":322,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":323,"context_line":"                                                       bgp_speaker_id)"},{"line_number":324,"context_line":"        return self._make_advertised_routes_list(routes)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_5a67c34c","line":321,"in_reply_to":"fa1b9901_02c2c385","updated":"2015-08-20 12:03:17.000000000","message":"Done.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                           resource\u003dbgp_speaker_ext.BGP_SPEAKER_RESOURCE_NAME,"},{"line_number":333,"context_line":"                           msg\u003dmsg)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":336,"context_line":"                                       bgp_peer_id):"},{"line_number":337,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":338,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_823c9394","line":335,"updated":"2015-08-18 07:18:14.000000000","message":"check PS4 comment.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":336,"context_line":"                                       bgp_peer_id):"},{"line_number":337,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":338,"context_line":"            try:"},{"line_number":339,"context_line":"                bgp_speaker \u003d self._get_by_id(context, BgpSpeaker,"},{"line_number":340,"context_line":"                                              bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_42467b24","line":337,"updated":"2015-08-18 07:18:14.000000000","message":"check PS4 comment.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                                                bgp_speaker_id\u003dbgp_speaker_id)"},{"line_number":368,"context_line":"            context.session.delete(binding)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def _save_bgp_speaker_network_binding(self,"},{"line_number":371,"context_line":"                                          context,"},{"line_number":372,"context_line":"                                          bgp_speaker_id,"},{"line_number":373,"context_line":"                                          network_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_02496331","line":370,"updated":"2015-08-18 07:18:14.000000000","message":"check PS4 comment.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9d0f7355bfedd8d42ee6f546a93f6ed9bc7f834","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                           resource\u003dbgp_speaker_ext.BGP_SPEAKER_RESOURCE_NAME,"},{"line_number":311,"context_line":"                           msg\u003dmsg)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":314,"context_line":"                                       bgp_peer_id):"},{"line_number":315,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":316,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_9db47535","line":313,"updated":"2015-08-20 12:11:05.000000000","message":"check PS4 comment.","commit_id":"456a3dc2c386fae5704759fcc715e630571c0df7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9d0f7355bfedd8d42ee6f546a93f6ed9bc7f834","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def _save_bgp_speaker_peer_binding(self, context, bgp_speaker_id,"},{"line_number":314,"context_line":"                                       bgp_peer_id):"},{"line_number":315,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":316,"context_line":"            try:"},{"line_number":317,"context_line":"                bgp_speaker \u003d self._get_by_id(context, BgpSpeaker,"},{"line_number":318,"context_line":"                                              bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_ddae6de5","line":315,"updated":"2015-08-20 12:11:05.000000000","message":"check PS4 comment.","commit_id":"456a3dc2c386fae5704759fcc715e630571c0df7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9d0f7355bfedd8d42ee6f546a93f6ed9bc7f834","unresolved":false,"context_lines":[{"line_number":345,"context_line":"                                                bgp_speaker_id\u003dbgp_speaker_id)"},{"line_number":346,"context_line":"            context.session.delete(binding)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def _save_bgp_speaker_network_binding(self,"},{"line_number":349,"context_line":"                                          context,"},{"line_number":350,"context_line":"                                          bgp_speaker_id,"},{"line_number":351,"context_line":"                                          network_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_7d6081cf","line":348,"updated":"2015-08-20 12:11:05.000000000","message":"check PS4 comment.","commit_id":"456a3dc2c386fae5704759fcc715e630571c0df7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        return self.get_bgp_speaker(context, uuid)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _post_bgp_speaker_db_create(self, context, bgp_speaker_id):"},{"line_number":140,"context_line":"        pass"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @log_helpers.log_method_call"},{"line_number":143,"context_line":"    def get_bgp_speakers(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_75790cfc","line":140,"updated":"2015-08-27 06:31:16.000000000","message":"Why we have defined this interface?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        return self.get_bgp_speaker(context, uuid)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _post_bgp_speaker_db_create(self, context, bgp_speaker_id):"},{"line_number":140,"context_line":"        pass"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @log_helpers.log_method_call"},{"line_number":143,"context_line":"    def get_bgp_speakers(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_5bb41cf1","line":140,"in_reply_to":"da20952f_75790cfc","updated":"2015-09-01 07:13:01.000000000","message":"I don\u0027t think we should be invoking RPC\u0027s and etc. here, it should be left up to the plugin implementation to decide how to what  do after a BGP speaker has been persisted in the DB.  This is just the DB mixin.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        return self.get_bgp_speaker(context, uuid)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _post_bgp_speaker_db_create(self, context, bgp_speaker_id):"},{"line_number":140,"context_line":"        pass"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @log_helpers.log_method_call"},{"line_number":143,"context_line":"    def get_bgp_speakers(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_31723f12","line":140,"in_reply_to":"da20952f_75790cfc","updated":"2015-08-30 18:52:07.000000000","message":"same question here","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"},{"line_number":169,"context_line":"            return {\u0027ip\u0027: bgp_peer[\u0027peer_ip\u0027],"},{"line_number":170,"context_line":"                    \u0027remote_as\u0027: bgp_peer[\u0027remote_as\u0027],"},{"line_number":171,"context_line":"                    \u0027password\u0027: bgp_peer[\u0027password\u0027]}"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @log_helpers.log_method_call"},{"line_number":174,"context_line":"    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_a4284b34","line":171,"updated":"2015-08-30 18:52:07.000000000","message":"Are you sure we should return the password?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"b864ea98c686f92e0c64f419b7bdfb38b93d7ee7","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            bgp_peer \u003d self._get_bgp_peer(context, bgp_peer_id)"},{"line_number":169,"context_line":"            return {\u0027ip\u0027: bgp_peer[\u0027peer_ip\u0027],"},{"line_number":170,"context_line":"                    \u0027remote_as\u0027: bgp_peer[\u0027remote_as\u0027],"},{"line_number":171,"context_line":"                    \u0027password\u0027: bgp_peer[\u0027password\u0027]}"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @log_helpers.log_method_call"},{"line_number":174,"context_line":"    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_dcaf4f28","line":171,"in_reply_to":"da20952f_a4284b34","updated":"2015-08-31 06:38:48.000000000","message":"It\u0027s required by Ryu for peer authentication.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            res[\u0027id\u0027] \u003d uuid"},{"line_number":192,"context_line":"            bgp_speaker_db \u003d BgpSpeaker(**res)"},{"line_number":193,"context_line":"            context.session.add(bgp_speaker_db)"},{"line_number":194,"context_line":"            for peer_id in ri[\u0027peers\u0027]:"},{"line_number":195,"context_line":"                self._save_bgp_speaker_peer_binding(context,"},{"line_number":196,"context_line":"                                                    res[\u0027id\u0027],"},{"line_number":197,"context_line":"                                                    peer_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_24ec3bf2","line":194,"updated":"2015-08-30 18:52:07.000000000","message":"It seems strange to me to be able to add peers and networks in a single call in POST, but not being able to add/remove them on PUT. I know being able to do it in PUT may complicate the code a lot, so for sake of simplicity and coherency, I would remove these \u0027for\u0027 loops.\n\nThen, the \u0027peers\u0027 and \u0027network\u0027 attributes on the \u0027bgp-speakers\u0027 entity.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            res[\u0027id\u0027] \u003d uuid"},{"line_number":192,"context_line":"            bgp_speaker_db \u003d BgpSpeaker(**res)"},{"line_number":193,"context_line":"            context.session.add(bgp_speaker_db)"},{"line_number":194,"context_line":"            for peer_id in ri[\u0027peers\u0027]:"},{"line_number":195,"context_line":"                self._save_bgp_speaker_peer_binding(context,"},{"line_number":196,"context_line":"                                                    res[\u0027id\u0027],"},{"line_number":197,"context_line":"                                                    peer_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_aaa692ab","line":194,"in_reply_to":"da20952f_24ec3bf2","updated":"2015-09-01 07:13:01.000000000","message":"I\u0027m fine with removing support for creating bindings on POST.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"56ea327f806e4529c02644f025bd043754b05287","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @log_helpers.log_method_call"},{"line_number":204,"context_line":"    def add_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":205,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":206,"context_line":"        self._save_bgp_speaker_peer_binding(context,"},{"line_number":207,"context_line":"                                            bgp_speaker_id,"},{"line_number":208,"context_line":"                                            bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_9aafa529","line":205,"updated":"2015-08-30 13:51:26.000000000","message":"The client is passing the bgp_peer_info as {\u0027peer_id\u0027: PEER_ID }\nhttps://review.openstack.org/#/c/205756/5/neutronclient/neutron/v2_0/bgp/speaker.py\n\nWhere as this function is expecting {\u0027bgp_peer_id\u0027: PEER_ID}\n\nand this function is returning as {\u0027peer_id\u0027: PEER_ID}.\nThis is not consistent. \n\nSame for \"remove_bgp_peer\"","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"b864ea98c686f92e0c64f419b7bdfb38b93d7ee7","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @log_helpers.log_method_call"},{"line_number":204,"context_line":"    def add_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":205,"context_line":"        bgp_peer_id \u003d self._get_id_for(bgp_peer_info, \u0027bgp_peer_id\u0027)"},{"line_number":206,"context_line":"        self._save_bgp_speaker_peer_binding(context,"},{"line_number":207,"context_line":"                                            bgp_speaker_id,"},{"line_number":208,"context_line":"                                            bgp_peer_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_7c2de3a6","line":205,"in_reply_to":"da20952f_9aafa529","updated":"2015-08-31 06:38:48.000000000","message":"+1. Let\u0027s use \u0027bgp_peer_id\u0027 all across.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            context.session.delete(bgp_speaker_db)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    @log_helpers.log_method_call"},{"line_number":260,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":261,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":262,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":263,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_75310c0b","line":260,"updated":"2015-08-27 06:31:16.000000000","message":"I think a duplicate check for peer-ip in the same remote-as is required over here.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            context.session.delete(bgp_speaker_db)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    @log_helpers.log_method_call"},{"line_number":260,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":261,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":262,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":263,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_6ac71a64","line":260,"in_reply_to":"da20952f_75310c0b","updated":"2015-09-01 07:13:01.000000000","message":"Yes, duly noted.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":262,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":263,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027,"},{"line_number":264,"context_line":"                        \u0027auth_type\u0027, \u0027password\u0027]"},{"line_number":265,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":266,"context_line":"            res[\u0027id\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":267,"context_line":"            bgp_peer_db \u003d BgpPeer(**res)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_359f1405","line":264,"updated":"2015-08-27 06:31:16.000000000","message":"Do we need any check to ensure \u0027auth_type\u0027 is provided without a password or vice-versa.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":262,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":263,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027,"},{"line_number":264,"context_line":"                        \u0027auth_type\u0027, \u0027password\u0027]"},{"line_number":265,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":266,"context_line":"            res[\u0027id\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":267,"context_line":"            bgp_peer_db \u003d BgpPeer(**res)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_4aa7b6bc","line":264,"in_reply_to":"da20952f_359f1405","updated":"2015-09-01 07:13:01.000000000","message":"Probably.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":293,"context_line":"            bgp_peer_db \u003d self._get_bgp_peer(context, bgp_peer_id)"},{"line_number":294,"context_line":"            if ((bp[\u0027password\u0027] is not None) and"},{"line_number":295,"context_line":"                (bgp_peer_db[\u0027auth_type\u0027] \u003d\u003d \u0027none\u0027)):"},{"line_number":296,"context_line":"                raise bgp_speaker_ext.BgpPeerNotAuthenticated("},{"line_number":297,"context_line":"                                                bgp_peer_id\u003dbgp_peer_id)"},{"line_number":298,"context_line":"            bgp_peer_db.update(bp)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_356dd404","line":295,"updated":"2015-08-27 06:31:16.000000000","message":"Can we define constant for \"none\" in bgp_supported_auth_types and use it over here?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":313,"context_line":"            query \u003d context.session.query(BgpSpeakerNetworkBinding)"},{"line_number":314,"context_line":"            query \u003d query.filter("},{"line_number":315,"context_line":"                            BgpSpeakerNetworkBinding.network_id \u003d\u003d network_id)"},{"line_number":316,"context_line":"            return query.all()"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_e48e432d","line":315,"updated":"2015-08-30 18:52:07.000000000","message":"nit: can you indent closer from the previous line?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":315,"context_line":"                            BgpSpeakerNetworkBinding.network_id \u003d\u003d network_id)"},{"line_number":316,"context_line":"            return query.all()"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":319,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":320,"context_line":"                                                       bgp_speaker_id)"},{"line_number":321,"context_line":"        return self._make_advertised_routes_dict(routes)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_847f4716","line":318,"updated":"2015-08-30 18:52:07.000000000","message":"I understand this methods also can @log","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":315,"context_line":"                            BgpSpeakerNetworkBinding.network_id \u003d\u003d network_id)"},{"line_number":316,"context_line":"            return query.all()"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":319,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":320,"context_line":"                                                       bgp_speaker_id)"},{"line_number":321,"context_line":"        return self._make_advertised_routes_dict(routes)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_4ac01650","line":318,"in_reply_to":"da20952f_847f4716","updated":"2015-09-01 07:13:01.000000000","message":"Done","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                                                       bgp_speaker_id)"},{"line_number":326,"context_line":"        return self._make_advertised_routes_list(routes)"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def _get_id_for(self, resource, id_name):"},{"line_number":329,"context_line":"        try:"},{"line_number":330,"context_line":"            return resource.get(id_name)"},{"line_number":331,"context_line":"        except AttributeError:"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_f841913a","line":328,"updated":"2015-08-27 06:31:16.000000000","message":"The function name sounds litte odd. Can we rename to \"_get_id_by_name\" or something better.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def _make_bgp_peer_dict(self, bgp_peer, fields\u003dNone):"},{"line_number":463,"context_line":"        attrs \u003d [\u0027tenant_id\u0027, \u0027id\u0027, \u0027peer_ip\u0027, \u0027remote_as\u0027,"},{"line_number":464,"context_line":"                 \u0027auth_type\u0027, \u0027password\u0027]"},{"line_number":465,"context_line":"        res \u003d dict((k, bgp_peer[k]) for k in attrs)"},{"line_number":466,"context_line":"        return self._fields(res, fields)"},{"line_number":467,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_a484cb0a","line":464,"updated":"2015-08-30 18:52:07.000000000","message":"same concern on password here","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                models_v2.Subnet.ip_version \u003d\u003d 4,"},{"line_number":525,"context_line":"                binding_alias.network_id \u003d\u003d models_v2.Subnet.network_id,"},{"line_number":526,"context_line":"                binding_alias.bgp_speaker_id \u003d\u003d BgpSpeaker.id,"},{"line_number":527,"context_line":"                BgpSpeaker.advertise_floating_ip_host_routes \u003d\u003d sa.sql.true())"},{"line_number":528,"context_line":"            return self._make_fip_route_tuple_list(query.all())"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def _get_fip_host_routes_by_binding(self, context,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_647b1329","line":527,"updated":"2015-08-30 18:52:07.000000000","message":"extreme nit: for sake of understanding, can you put the contraints in one side of the \u003d\u003d and the variables we get on the other side?\n\nAnyway... these joins are crazy, there is no way I can figure out if they are what we need. (My fault, not yours)","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                models_v2.Subnet.ip_version \u003d\u003d 4,"},{"line_number":525,"context_line":"                binding_alias.network_id \u003d\u003d models_v2.Subnet.network_id,"},{"line_number":526,"context_line":"                binding_alias.bgp_speaker_id \u003d\u003d BgpSpeaker.id,"},{"line_number":527,"context_line":"                BgpSpeaker.advertise_floating_ip_host_routes \u003d\u003d sa.sql.true())"},{"line_number":528,"context_line":"            return self._make_fip_route_tuple_list(query.all())"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def _get_fip_host_routes_by_binding(self, context,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_2abda2d7","line":527,"in_reply_to":"da20952f_647b1329","updated":"2015-09-01 07:13:01.000000000","message":"These joins are crazy, but that\u0027s the nature of the problem we\u0027re trying to solve.  No way around it. We just need to test it heavily.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6f3cb2354d9b3e09a5ab888a7e23b4fd3f509232","unresolved":false,"context_lines":[{"line_number":256,"context_line":"            context.session.delete(bgp_speaker_db)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    @log_helpers.log_method_call"},{"line_number":259,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":260,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":261,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":262,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_ec45dd42","line":259,"updated":"2015-09-04 08:02:16.000000000","message":"Can you make a #TODO for PS21 comment.","commit_id":"9f26dba490055365ea0920d73ae5e429f260a985"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a992659ec67325442bd2527defc905f765414eed","unresolved":false,"context_lines":[{"line_number":256,"context_line":"            context.session.delete(bgp_speaker_db)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    @log_helpers.log_method_call"},{"line_number":259,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":260,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":261,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":262,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_eea062f6","line":259,"in_reply_to":"da20952f_ec45dd42","updated":"2015-09-04 15:34:47.000000000","message":"Done","commit_id":"9f26dba490055365ea0920d73ae5e429f260a985"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6f3cb2354d9b3e09a5ab888a7e23b4fd3f509232","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":261,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":262,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027,"},{"line_number":263,"context_line":"                        \u0027auth_type\u0027, \u0027password\u0027]"},{"line_number":264,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":265,"context_line":"            res[\u0027id\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":266,"context_line":"            bgp_peer_db \u003d BgpPeer(**res)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_ac7a8586","line":263,"updated":"2015-09-04 08:02:16.000000000","message":"Can you make a #TODO for PS21 comment.","commit_id":"9f26dba490055365ea0920d73ae5e429f260a985"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a992659ec67325442bd2527defc905f765414eed","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        ri \u003d bgp_peer[bgp_speaker_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":261,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":262,"context_line":"            res_keys \u003d [\u0027tenant_id\u0027, \u0027remote_as\u0027, \u0027peer_ip\u0027,"},{"line_number":263,"context_line":"                        \u0027auth_type\u0027, \u0027password\u0027]"},{"line_number":264,"context_line":"            res \u003d dict((k, ri[k]) for k in res_keys)"},{"line_number":265,"context_line":"            res[\u0027id\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":266,"context_line":"            bgp_peer_db \u003d BgpPeer(**res)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_8ea1a6f9","line":263,"in_reply_to":"da20952f_ac7a8586","updated":"2015-09-04 15:34:47.000000000","message":"Done","commit_id":"9f26dba490055365ea0920d73ae5e429f260a985"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6f3cb2354d9b3e09a5ab888a7e23b4fd3f509232","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                            BgpSpeakerNetworkBinding.network_id \u003d\u003d network_id)"},{"line_number":315,"context_line":"            return query.all()"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":318,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":319,"context_line":"                                                       bgp_speaker_id)"},{"line_number":320,"context_line":"        return self._make_advertised_routes_dict(routes)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_0c6a91b3","line":317,"updated":"2015-09-04 08:02:16.000000000","message":"Please address PS21 comment.","commit_id":"9f26dba490055365ea0920d73ae5e429f260a985"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8c149f9a503e063c63a0ecb3f332bf62649d7f56","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                            BgpSpeakerNetworkBinding.network_id \u003d\u003d network_id)"},{"line_number":315,"context_line":"            return query.all()"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":318,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":319,"context_line":"                                                       bgp_speaker_id)"},{"line_number":320,"context_line":"        return self._make_advertised_routes_dict(routes)"}],"source_content_type":"text/x-python","patch_set":24,"id":"da20952f_a1db477b","line":317,"updated":"2015-09-05 07:49:51.000000000","message":"Please address PS21 comment.","commit_id":"1b247ef6a823d3e0328f65426bf69b5ea45a932e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c30b9fa4925270dae176c36ee681b34faaf3db9e","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                            BgpSpeakerNetworkBinding.network_id \u003d\u003d network_id)"},{"line_number":315,"context_line":"            return query.all()"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":318,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(context,"},{"line_number":319,"context_line":"                                                       bgp_speaker_id)"},{"line_number":320,"context_line":"        return self._make_advertised_routes_dict(routes)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da20952f_216417b7","line":317,"updated":"2015-09-05 08:02:30.000000000","message":"Please address PS21 comment. Can\u0027t find the changes in the latest patch.","commit_id":"244a1abf2cc9d44b9fa423d8efae72f3173c03f4"}],"neutron/db/l3_db.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            self._check_router_gw_port_in_use(context, router_id)"},{"line_number":346,"context_line":"        self._core_plugin.delete_port("},{"line_number":347,"context_line":"            admin_ctx, gw_port[\u0027id\u0027], l3_port_check\u003dFalse)"},{"line_number":348,"context_line":"        registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":349,"context_line":"                        events.AFTER_DELETE, self,"},{"line_number":350,"context_line":"                        **{\u0027router_id\u0027: router_id,"},{"line_number":351,"context_line":"                           \u0027network_id\u0027: old_network})"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_04d9f721","line":348,"updated":"2015-08-30 18:52:07.000000000","message":"I can not see relationship with BGP entities... can it be also the bad rebase stuff?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            self._check_router_gw_port_in_use(context, router_id)"},{"line_number":346,"context_line":"        self._core_plugin.delete_port("},{"line_number":347,"context_line":"            admin_ctx, gw_port[\u0027id\u0027], l3_port_check\u003dFalse)"},{"line_number":348,"context_line":"        registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":349,"context_line":"                        events.AFTER_DELETE, self,"},{"line_number":350,"context_line":"                        **{\u0027router_id\u0027: router_id,"},{"line_number":351,"context_line":"                           \u0027network_id\u0027: old_network})"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_eae56adb","line":348,"in_reply_to":"da20952f_04d9f721","updated":"2015-09-01 07:13:01.000000000","message":"Not a bad rebase, this is required.  We need to consume this notification so we can advertise the appropriate routes behind a router with the gateway port as next-hop.  This is a critical change.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":1416,"context_line":"    l3plugin.notify_routers_updated(context, router_ids)"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"def _notify_subnet_gateway_ip_update(resource, event, trigger, **kwargs):"},{"line_number":1420,"context_line":"    l3plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":1421,"context_line":"            constants.L3_ROUTER_NAT)"},{"line_number":1422,"context_line":"    if not l3plugin:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_beda8ae6","side":"PARENT","line":1419,"updated":"2015-09-29 23:11:06.000000000","message":"I\u0027m not sure I understand why this is being removed.","commit_id":"a15651cca1ceae5a6b13c9d5c7e7f1aaa6de080d"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":1416,"context_line":"    l3plugin.notify_routers_updated(context, router_ids)"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"def _notify_subnet_gateway_ip_update(resource, event, trigger, **kwargs):"},{"line_number":1420,"context_line":"    l3plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":1421,"context_line":"            constants.L3_ROUTER_NAT)"},{"line_number":1422,"context_line":"    if not l3plugin:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_d4fb9f79","side":"PARENT","line":1419,"in_reply_to":"9a1a9d01_beda8ae6","updated":"2015-09-30 00:34:39.000000000","message":"Bad conflict resolution somewhere along the way?  I don\u0027t remember intentionally removing this......","commit_id":"a15651cca1ceae5a6b13c9d5c7e7f1aaa6de080d"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":350,"context_line":"            self._check_router_gw_port_in_use(context, router_id)"},{"line_number":351,"context_line":"        self._core_plugin.delete_port("},{"line_number":352,"context_line":"            admin_ctx, gw_port[\u0027id\u0027], l3_port_check\u003dFalse)"},{"line_number":353,"context_line":"        registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":354,"context_line":"                        events.AFTER_DELETE, self,"},{"line_number":355,"context_line":"                        **{\u0027router_id\u0027: router_id,"},{"line_number":356,"context_line":"                           \u0027network_id\u0027: old_network})"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_a20ff186","line":353,"updated":"2015-09-29 11:34:04.000000000","message":"Shouldn\u0027t all this code related to notifications in another patch? According to the commit message, this commit only introduces entities and CRUD functionality.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":350,"context_line":"            self._check_router_gw_port_in_use(context, router_id)"},{"line_number":351,"context_line":"        self._core_plugin.delete_port("},{"line_number":352,"context_line":"            admin_ctx, gw_port[\u0027id\u0027], l3_port_check\u003dFalse)"},{"line_number":353,"context_line":"        registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":354,"context_line":"                        events.AFTER_DELETE, self,"},{"line_number":355,"context_line":"                        **{\u0027router_id\u0027: router_id,"},{"line_number":356,"context_line":"                           \u0027network_id\u0027: old_network})"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ac803bc0","line":353,"in_reply_to":"9a1a9d01_a20ff186","updated":"2015-09-29 15:02:34.000000000","message":"I\u0027ve been looking for ways to break this patch down.  Breaking out the notifications from this patch is probably a good start.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"634d41b99aa3fdbe5f4d52902f4c4d0279cf9e52","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"            return []"},{"line_number":1228,"context_line":"        qry \u003d context.session.query(RouterPort)"},{"line_number":1229,"context_line":"        qry \u003d qry.filter("},{"line_number":1230,"context_line":"            Router.id.in_(router_ids),"},{"line_number":1231,"context_line":"            RouterPort.port_type.in_(device_owners)"},{"line_number":1232,"context_line":"        )"},{"line_number":1233,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_dece5e2c","line":1230,"updated":"2015-09-29 23:11:06.000000000","message":"Does this seem a bit off-topic?  Why change this?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cccfebcbf0a4478f36038a4c42a1296dfb1c2af0","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"            return []"},{"line_number":1228,"context_line":"        qry \u003d context.session.query(RouterPort)"},{"line_number":1229,"context_line":"        qry \u003d qry.filter("},{"line_number":1230,"context_line":"            Router.id.in_(router_ids),"},{"line_number":1231,"context_line":"            RouterPort.port_type.in_(device_owners)"},{"line_number":1232,"context_line":"        )"},{"line_number":1233,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_3480dbbf","line":1230,"in_reply_to":"9a1a9d01_dece5e2c","updated":"2015-09-30 00:34:39.000000000","message":"Not sure why this is changed.  Revert.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"}],"neutron/db/migration/alembic_migrations/versions/15be73214821_add_bgp_speaker_model_data.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0cbedb17c10cfeacb1031f6121b636c5b954a41","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                                local_cols\u003d[\u0027network_id\u0027])"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    op.create_table("},{"line_number":90,"context_line":"        \u0027peer_bgp_speaker_bindings\u0027,"},{"line_number":91,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"},{"line_number":92,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":93,"context_line":"                  nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_e347a849","line":90,"updated":"2015-07-24 13:33:56.000000000","message":"can we rename it to \"bgp_speaker_peer_bindings\"","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                                local_cols\u003d[\u0027network_id\u0027])"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    op.create_table("},{"line_number":90,"context_line":"        \u0027peer_bgp_speaker_bindings\u0027,"},{"line_number":91,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"},{"line_number":92,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":93,"context_line":"                  nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_29630d1c","line":90,"in_reply_to":"3a50d1a3_e347a849","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"}],"neutron/db/migration/alembic_migrations/versions/HEADS":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"2e5352a0ad4d"},{"line_number":2,"context_line":"15be73214821"},{"line_number":3,"context_line":"kilo"}],"source_content_type":"application/octet-stream","patch_set":16,"id":"fa1b9901_92807b8d","line":2,"updated":"2015-08-22 09:36:40.000000000","message":"change to 3ef856796c1c and avoid pep8 issues.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"eb786920d153a2051533d98e69cafb5fae27e9d0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"2e5352a0ad4d"},{"line_number":2,"context_line":"15be73214821"},{"line_number":3,"context_line":"kilo"}],"source_content_type":"application/octet-stream","patch_set":16,"id":"fa1b9901_be6c6837","line":2,"in_reply_to":"fa1b9901_92807b8d","updated":"2015-08-22 15:41:05.000000000","message":"There is no pep8 issue due to this.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":1,"context_line":"2e5352a0ad4d"},{"line_number":2,"context_line":"15be73214821"},{"line_number":3,"context_line":"kilo"}],"source_content_type":"application/octet-stream","patch_set":16,"id":"fa1b9901_c5702ea7","line":2,"in_reply_to":"fa1b9901_be6c6837","updated":"2015-08-24 19:17:35.000000000","message":"Agreed, I don\u0027t see an issue here.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"575a2750a3da070acbb249d2c7190c568a4fe2d3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"2e5352a0ad4d"},{"line_number":2,"context_line":"15be73214821"},{"line_number":3,"context_line":"kilo"}],"source_content_type":"application/octet-stream","patch_set":18,"id":"fa1b9901_12ea84db","line":3,"updated":"2015-08-26 14:40:52.000000000","message":"kilo is not required as per the latest migration changes. \"https://github.com/openstack/neutron/blob/master/neutron/db/migration/alembic_migrations/versions/HEADS\"","commit_id":"39640bcbd4bbdd5624a9d6d0b87ddd095b533afd"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fa76709aff5783cb10a26cf40f701159c43ffbd5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"2e5352a0ad4d"},{"line_number":2,"context_line":"15be73214821"},{"line_number":3,"context_line":"kilo"}],"source_content_type":"application/octet-stream","patch_set":18,"id":"fa1b9901_d51b9671","line":3,"in_reply_to":"fa1b9901_12ea84db","updated":"2015-08-26 14:51:47.000000000","message":"Done","commit_id":"39640bcbd4bbdd5624a9d6d0b87ddd095b533afd"}],"neutron/db/migration/alembic_migrations/versions/liberty/expand/15be73214821_add_bgp_model_data.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e354c749f00cdf8f7aa80f999411d1c153b3d3aa","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 dynamic routing model data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 15be73214821"},{"line_number":19,"context_line":"Create Date: 2015-07-29 13:16:08.604175"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba15a1d1_d3cdf530","line":16,"updated":"2015-09-24 06:30:35.000000000","message":"add bgp model data","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fe22c9348256fa8cc3330b12fc2b592e843bb7b0","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 dynamic routing model data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 15be73214821"},{"line_number":19,"context_line":"Create Date: 2015-07-29 13:16:08.604175"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a1a9d01_37ee58ed","line":16,"in_reply_to":"ba15a1d1_d3cdf530","updated":"2015-09-24 13:51:17.000000000","message":"Done","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c94e8e82dc04cfd7d3853998114b88b602a31ed","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"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":32,"id":"7a2fa921_906569b6","line":3,"updated":"2015-10-08 06:21:07.000000000","message":"How about renaming this file to \"add_bgp_data_model_xxxx\"","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c94e8e82dc04cfd7d3853998114b88b602a31ed","unresolved":false,"context_lines":[{"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":""},{"line_number":16,"context_line":"\"\"\"add dynamic routing model data"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_d09a016e","line":14,"updated":"2015-10-08 06:21:07.000000000","message":"last \u0027#\u0027 is not required. Please remove.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c94e8e82dc04cfd7d3853998114b88b602a31ed","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 dynamic routing model data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 15be73214821"},{"line_number":19,"context_line":"Create Date: 2015-07-29 13:16:08.604175"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_f04dbd3e","line":16,"updated":"2015-10-08 06:21:07.000000000","message":"request to change the title. It should be \"add bgp data model\"","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a6bc4b6fff4aa28423838c5b4835a019ff679182","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def upgrade():"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    op.create_table("},{"line_number":38,"context_line":"        \u0027bgp_speakers\u0027,"},{"line_number":39,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":40,"context_line":"                  nullable\u003dFalse),"},{"line_number":41,"context_line":"        sa.Column(\u0027local_as\u0027, sa.Integer, nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_b84cfe9e","line":38,"updated":"2015-09-29 12:18:33.000000000","message":"How about adding \u0027name\u0027 attribute? \u0027name\u0027 is always easy to remember than UUID.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def upgrade():"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    op.create_table("},{"line_number":38,"context_line":"        \u0027bgp_speakers\u0027,"},{"line_number":39,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":40,"context_line":"                  nullable\u003dFalse),"},{"line_number":41,"context_line":"        sa.Column(\u0027local_as\u0027, sa.Integer, nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_6c56a35d","line":38,"in_reply_to":"9a1a9d01_b84cfe9e","updated":"2015-09-29 15:02:34.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"85e66a509771e161ae3dea9c7880beed02254fb3","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":44,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":46,"context_line":"                  sa.String(length\u003d255),"},{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_2c1ba2cb","line":46,"updated":"2015-09-30 11:45:49.000000000","message":"Let\u0027s use TENANT_ID_MAX_LEN defined in \u0027neutron.api.v2.attributes\u0027. Please check all the places.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a6bc4b6fff4aa28423838c5b4835a019ff679182","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"},{"line_number":50,"context_line":"                  nullable\u003dFalse),"},{"line_number":51,"context_line":"        sa.Column(\u0027advertise_tenant_networks\u0027, sa.Boolean(),"},{"line_number":52,"context_line":"                  nullable\u003dFalse),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_b81abe7b","line":51,"updated":"2015-09-29 12:18:33.000000000","message":"We got to add a statistics field over here.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6370d544ca95ff5b56ea0fcb16856afca7115fd5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"},{"line_number":50,"context_line":"                  nullable\u003dFalse),"},{"line_number":51,"context_line":"        sa.Column(\u0027advertise_tenant_networks\u0027, sa.Boolean(),"},{"line_number":52,"context_line":"                  nullable\u003dFalse),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_8f4d0d9c","line":51,"in_reply_to":"9a1a9d01_ac9cbb0e","updated":"2015-09-30 06:04:13.000000000","message":"I am thinking something simple... how about having a plain string as of now?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"},{"line_number":50,"context_line":"                  nullable\u003dFalse),"},{"line_number":51,"context_line":"        sa.Column(\u0027advertise_tenant_networks\u0027, sa.Boolean(),"},{"line_number":52,"context_line":"                  nullable\u003dFalse),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ac9cbb0e","line":51,"in_reply_to":"9a1a9d01_b81abe7b","updated":"2015-09-29 15:02:34.000000000","message":"Yes, I haven\u0027t given thought to what that would like though.  Any ideas?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a6bc4b6fff4aa28423838c5b4835a019ff679182","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    )"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    op.create_table("},{"line_number":57,"context_line":"        \u0027bgp_peers\u0027,"},{"line_number":58,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":59,"context_line":"                  nullable\u003dFalse),"},{"line_number":60,"context_line":"        sa.Column(\u0027auth_type\u0027, sa.String(length\u003d16), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_7842e669","line":57,"updated":"2015-09-29 12:18:33.000000000","message":"How about adding \u0027name\u0027 attribute? \u0027name\u0027 is always easy to remember than UUID.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    )"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    op.create_table("},{"line_number":57,"context_line":"        \u0027bgp_peers\u0027,"},{"line_number":58,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":59,"context_line":"                  nullable\u003dFalse),"},{"line_number":60,"context_line":"        sa.Column(\u0027auth_type\u0027, sa.String(length\u003d16), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_8c53f76a","line":57,"in_reply_to":"9a1a9d01_7842e669","updated":"2015-09-29 15:02:34.000000000","message":"Done","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a6bc4b6fff4aa28423838c5b4835a019ff679182","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                  nullable\u003dFalse),"},{"line_number":65,"context_line":"        sa.Column(\u0027remote_as\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":66,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":67,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":68,"context_line":"                  sa.String(length\u003d255),"},{"line_number":69,"context_line":"                  nullable\u003dTrue,"},{"line_number":70,"context_line":"                  index\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_380f8e38","line":67,"updated":"2015-09-29 12:18:33.000000000","message":"We got to add a statistics field over here.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                  nullable\u003dFalse),"},{"line_number":65,"context_line":"        sa.Column(\u0027remote_as\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":66,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":67,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":68,"context_line":"                  sa.String(length\u003d255),"},{"line_number":69,"context_line":"                  nullable\u003dTrue,"},{"line_number":70,"context_line":"                  index\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_cca1ef47","line":67,"in_reply_to":"9a1a9d01_380f8e38","updated":"2015-09-29 15:02:34.000000000","message":"Same as L51.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6370d544ca95ff5b56ea0fcb16856afca7115fd5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                  nullable\u003dFalse),"},{"line_number":65,"context_line":"        sa.Column(\u0027remote_as\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":66,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":67,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":68,"context_line":"                  sa.String(length\u003d255),"},{"line_number":69,"context_line":"                  nullable\u003dTrue,"},{"line_number":70,"context_line":"                  index\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_4f43756c","line":67,"in_reply_to":"9a1a9d01_cca1ef47","updated":"2015-09-30 06:04:13.000000000","message":"ditto.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"}],"neutron/db/migration/alembic_migrations/versions/liberty/expand/15be73214821_add_bgp_speaker_model_data.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","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":""},{"line_number":16,"context_line":"\"\"\"add dynamic routing model data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 15be73214821"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_32716fe1","line":15,"updated":"2015-08-22 09:36:40.000000000","message":"Rename this file to \"3ef856796c1c _xxxx\". This file\u0027s revision number is quite old and creates issue for alembic migration as per liberty.\n\nReplace the below comment as per the new file.\n\n\"\"\"add_bgp_speaker_model_data\t\"\n\nRevision ID: 3ef856796c1c\n\nRevises: 9859ac9c136\n\nCreate Date: 2015-08-20 13:51:55.093136\t\t\n\"\"\"","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"eb786920d153a2051533d98e69cafb5fae27e9d0","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":""},{"line_number":16,"context_line":"\"\"\"add dynamic routing model data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 15be73214821"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_5e166ca8","line":15,"in_reply_to":"fa1b9901_32716fe1","updated":"2015-08-22 15:41:05.000000000","message":"Revision numbers are random and cannot be \"quite old\". What issue do you see with it?","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","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":""},{"line_number":16,"context_line":"\"\"\"add dynamic routing model data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 15be73214821"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_25900a95","line":15,"in_reply_to":"fa1b9901_5e166ca8","updated":"2015-08-24 19:17:35.000000000","message":"+1","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","unresolved":false,"context_lines":[{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# revision identifiers, used by Alembic."},{"line_number":24,"context_line":"revision \u003d \u002715be73214821\u0027"},{"line_number":25,"context_line":"down_revision \u003d \u00279859ac9c136\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_d276f3d7","line":24,"updated":"2015-08-22 09:36:40.000000000","message":"change to 3ef856796c1c","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# revision identifiers, used by Alembic."},{"line_number":24,"context_line":"revision \u003d \u002715be73214821\u0027"},{"line_number":25,"context_line":"down_revision \u003d \u00279859ac9c136\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_0585c657","line":24,"in_reply_to":"fa1b9901_d276f3d7","updated":"2015-08-24 19:17:35.000000000","message":"Why?  This revision ID should be just fine.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"5d9e4f55540361b2571ba1a521a25a0e3215c863","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":44,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":46,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_1eec748e","line":46,"updated":"2015-08-22 15:48:15.000000000","message":"length should be 255","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"71230792c2fb2892656d4e9e235169435968ecb6","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":44,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":46,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_8513e1b7","line":46,"in_reply_to":"fa1b9901_14ae29e6","updated":"2015-08-25 17:05:23.000000000","message":"Thanks for the pointer, I\u0027ll make that change","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"88b99997649ca3a7b3f9b590cf0c2ad167399e81","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":44,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":46,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_93b4b2f2","line":46,"in_reply_to":"fa1b9901_1eec748e","updated":"2015-08-25 05:48:02.000000000","message":"Tenant ID is a UUID, so a 32 character string is sufficient right?","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"a458d5c73efbaca38f38e2c533caf7aaf32bc02b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":44,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":46,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_14ae29e6","line":46,"in_reply_to":"fa1b9901_93b4b2f2","updated":"2015-08-25 15:57:14.000000000","message":"The tenant_id field comes from the HasTenant mixin [1], which uses TENANT_ID_MAX_LEN [2].\n\n- [1] https://github.com/openstack/neutron/blob/master/neutron/db/model_base.py#L25\n- [2] https://github.com/openstack/neutron/blob/master/neutron/api/v2/attributes.py#L41","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"5d9e4f55540361b2571ba1a521a25a0e3215c863","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"},{"line_number":50,"context_line":"                  nullable\u003dFalse, index\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027advertise_tenant_networks\u0027, sa.Boolean(),"},{"line_number":52,"context_line":"                  nullable\u003dFalse, index\u003dTrue),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_5ec0ace0","line":50,"updated":"2015-08-22 15:48:15.000000000","message":"No index here.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"},{"line_number":50,"context_line":"                  nullable\u003dFalse, index\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027advertise_tenant_networks\u0027, sa.Boolean(),"},{"line_number":52,"context_line":"                  nullable\u003dFalse, index\u003dTrue),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_455dfe13","line":50,"in_reply_to":"fa1b9901_5ec0ace0","updated":"2015-08-24 19:17:35.000000000","message":"Done","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"5d9e4f55540361b2571ba1a521a25a0e3215c863","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"},{"line_number":50,"context_line":"                  nullable\u003dFalse, index\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027advertise_tenant_networks\u0027, sa.Boolean(),"},{"line_number":52,"context_line":"                  nullable\u003dFalse, index\u003dTrue),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":54,"context_line":"    )"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_1eba346f","line":52,"updated":"2015-08-22 15:48:15.000000000","message":"No index here.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"},{"line_number":50,"context_line":"                  nullable\u003dFalse, index\u003dTrue),"},{"line_number":51,"context_line":"        sa.Column(\u0027advertise_tenant_networks\u0027, sa.Boolean(),"},{"line_number":52,"context_line":"                  nullable\u003dFalse, index\u003dTrue),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":54,"context_line":"    )"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_e59a12c5","line":52,"in_reply_to":"fa1b9901_1eba346f","updated":"2015-08-24 19:17:35.000000000","message":"Done","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":44,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":46,"context_line":"                  sa.String(length\u003d255),"},{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_98ee5521","line":46,"updated":"2015-08-27 06:31:16.000000000","message":"How about using \"constants.UUID_STRING_LENGTH\" instead of 255?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c3894cfab56c2608d34995fd6a5b7732e958a8d3","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":44,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":46,"context_line":"                  sa.String(length\u003d255),"},{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_65ac2d8c","line":46,"in_reply_to":"da20952f_1b78e4c3","updated":"2015-09-01 07:39:05.000000000","message":"Ok.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027ip_version\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":44,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":46,"context_line":"                  sa.String(length\u003d255),"},{"line_number":47,"context_line":"                  nullable\u003dTrue,"},{"line_number":48,"context_line":"                  index\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027advertise_floating_ip_host_routes\u0027, sa.Boolean(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_1b78e4c3","line":46,"in_reply_to":"da20952f_98ee5521","updated":"2015-09-01 07:13:01.000000000","message":"See the discussion in PS16","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \u0027bgp_peers\u0027,"},{"line_number":58,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":59,"context_line":"                  nullable\u003dFalse),"},{"line_number":60,"context_line":"        sa.Column(\u0027auth_type\u0027, sa.String(length\u003d16), nullable\u003dFalse),"},{"line_number":61,"context_line":"        sa.Column(\u0027password\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":62,"context_line":"        sa.Column(\u0027peer_ip\u0027,"},{"line_number":63,"context_line":"                  sa.String(length\u003dconstants.DB_IP_ADDR_STRING_LENGTH),"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_f8c43193","line":60,"updated":"2015-08-27 06:31:16.000000000","message":"How about defining constants for \u0027auth_type\u0027 and \u0027password\u0027 as well.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027],"},{"line_number":88,"context_line":"                                [\u0027networks.id\u0027],"},{"line_number":89,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":90,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027, \u0027bgp_speaker_id\u0027, \u0027ip_version\u0027)"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    op.create_unique_constraint(name\u003dCONSTRAINT_NAME_NETWORK_ID,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_e40ac389","line":90,"updated":"2015-08-30 18:52:07.000000000","message":"Do we need a different binding depending on the ip_version? why?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027],"},{"line_number":88,"context_line":"                                [\u0027networks.id\u0027],"},{"line_number":89,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":90,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027, \u0027bgp_speaker_id\u0027, \u0027ip_version\u0027)"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    op.create_unique_constraint(name\u003dCONSTRAINT_NAME_NETWORK_ID,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_256299ae","line":90,"in_reply_to":"da20952f_a73cc4c8","updated":"2015-09-01 16:32:23.000000000","message":"@Vikram Are you saying that Ryu won\u0027t allow us to open peering sessions over IPv6?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"065433811e858b92fc600cea6e2f107dd951c559","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027],"},{"line_number":88,"context_line":"                                [\u0027networks.id\u0027],"},{"line_number":89,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":90,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027, \u0027bgp_speaker_id\u0027, \u0027ip_version\u0027)"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    op.create_unique_constraint(name\u003dCONSTRAINT_NAME_NETWORK_ID,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_71468a7c","line":90,"in_reply_to":"da20952f_a73cc4c8","updated":"2015-09-04 08:02:09.000000000","message":"My mistake. I can find it\u0027s supported \"http://sourceforge.net/p/ryu/mailman/message/32474295/\"","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027],"},{"line_number":88,"context_line":"                                [\u0027networks.id\u0027],"},{"line_number":89,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":90,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027, \u0027bgp_speaker_id\u0027, \u0027ip_version\u0027)"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    op.create_unique_constraint(name\u003dCONSTRAINT_NAME_NETWORK_ID,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_053675b4","line":90,"in_reply_to":"da20952f_e40ac389","updated":"2015-09-01 16:32:23.000000000","message":"@Jaume  This has to do with address scopes.  IPv4 and IPv6 subnets will never be in the same address scope.  A BgpSpeaker can only \"speak\" for 1 address scope, but we are binding to networks so we can Identify router gateway ports.  Because a network can be dual-stack, we need ip_version as a distinguisher between address scopes.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"b864ea98c686f92e0c64f419b7bdfb38b93d7ee7","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027],"},{"line_number":88,"context_line":"                                [\u0027networks.id\u0027],"},{"line_number":89,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":90,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027, \u0027bgp_speaker_id\u0027, \u0027ip_version\u0027)"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    op.create_unique_constraint(name\u003dCONSTRAINT_NAME_NETWORK_ID,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_a73cc4c8","line":90,"in_reply_to":"da20952f_e40ac389","updated":"2015-08-31 06:38:48.000000000","message":"Ryu doesn\u0027t support IPv6 peer formation as of now. This might be a limitation using Ryu.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"}],"neutron/db/migration/alembic_migrations/versions/mitaka/expand/15be73214821_add_bgp_model_data.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"844cc1f7eea8f2ab17d40c8de24a2113469db1fb","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027bgp_speakers\u0027,"},{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":38,"context_line":"                  nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027local_as\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":40,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":41,"context_line":"        sa.Column(\u0027address_scope_id\u0027,"},{"line_number":42,"context_line":"                  sa.String(length\u003d255),"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a7e1126_694d1b99","line":39,"updated":"2015-12-21 14:51:42.000000000","message":"Got to add \u0027name\u0027 as discussed in https://review.openstack.org/#/c/205756/7/neutronclient/neutron/v2_0/bgp/speaker.py","commit_id":"ef3def989b682e347e755559ba33abdb6d0a3913"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2ca125b7c0e5f7dcf86eba642b8c0652afe02f3e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        sa.Column(\u0027local_as\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":40,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":41,"context_line":"        sa.Column(\u0027address_scope_id\u0027,"},{"line_number":42,"context_line":"                  sa.String(length\u003d255),"},{"line_number":43,"context_line":"                  nullable\u003dTrue,"},{"line_number":44,"context_line":"                  index\u003dTrue),"},{"line_number":45,"context_line":"        sa.Column(\u0027tenant_id\u0027,"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a7e1126_36747134","line":42,"range":{"start_line":42,"start_character":35,"end_line":42,"end_character":38},"updated":"2015-12-20 10:36:30.000000000","message":"replace 255 with constants.UUID_STRING_LENGTH)","commit_id":"ef3def989b682e347e755559ba33abdb6d0a3913"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"844cc1f7eea8f2ab17d40c8de24a2113469db1fb","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    op.create_table("},{"line_number":57,"context_line":"        \u0027bgp_peers\u0027,"},{"line_number":58,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":59,"context_line":"                  nullable\u003dFalse),"},{"line_number":60,"context_line":"        sa.Column(\u0027auth_type\u0027, sa.String(length\u003d16), nullable\u003dFalse),"},{"line_number":61,"context_line":"        sa.Column(\u0027password\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a7e1126_c9520f35","line":58,"updated":"2015-12-21 14:51:42.000000000","message":"Got to add \u0027name\u0027 as discussed in https://review.openstack.org/#/c/205756/7/neutronclient/neutron/v2_0/bgp/speaker.py","commit_id":"ef3def989b682e347e755559ba33abdb6d0a3913"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6a96a614abba6a733da6fa1d7cf5926f270844e4","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sa.Column(\u0027local_as\u0027, sa.Integer, nullable\u003dFalse,"},{"line_number":42,"context_line":"                  autoincrement\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027address_scope_id\u0027,"},{"line_number":44,"context_line":"                  sa.String(length\u003d255),"},{"line_number":45,"context_line":"                  nullable\u003dTrue,"},{"line_number":46,"context_line":"                  index\u003dTrue),"},{"line_number":47,"context_line":"        sa.Column(\u0027tenant_id\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"fa69d971_ec5aff82","line":44,"updated":"2016-01-01 13:50:00.000000000","message":"length should be constants.UUID_STRING_LENGTH instead of 255.","commit_id":"3966d5fa27acaaa08eb922e181f17b96302a3f53"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ce5cfbe3cc52acb2ad3ad46ac843768301f13d2d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sa.Column(\u0027address_scope_id\u0027,"},{"line_number":44,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":45,"context_line":"                  sa.ForeignKey(\u0027address_scopes.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":46,"context_line":"                  nullable\u003dTrue, index\u003dTrue),"},{"line_number":47,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":48,"context_line":"                  sa.String(length\u003d255),"},{"line_number":49,"context_line":"                  nullable\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":44,"id":"fa69d971_4ea3b59d","line":46,"range":{"start_line":46,"start_character":27,"end_line":46,"end_character":31},"updated":"2016-01-05 08:51:37.000000000","message":"nullable\u003dFalse","commit_id":"af49578af95fe0e2522b0281a413f99558179fb0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_a2c43d5f","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2016-01-07 19:44:15.000000000","message":"nit:  2016  :)","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dd8dcbd351561e8631bff724e099b043c4f8d85f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_e9f19f96","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"in_reply_to":"fa69d971_a2c43d5f","updated":"2016-01-08 03:43:18.000000000","message":"Year has passed but we are still trying to get this code in ;)","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"21b5530b3afaac12a6b1a72d35b1914646111e29","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_6a4e0898","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"in_reply_to":"fa69d971_e9f19f96","updated":"2016-02-02 22:48:21.000000000","message":"Done","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fd17f0f27b126776be95eb0dfbf950de33c3c35a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":52,"id":"9a68dd71_00952131","line":1,"updated":"2016-01-26 04:08:17.000000000","message":"2016","commit_id":"8d185ada9997965dfae6e8894f32cc3c3cc190f3"}],"neutron/extensions/bgp.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e354c749f00cdf8f7aa80f999411d1c153b3d3aa","unresolved":false,"context_lines":[{"line_number":107,"context_line":"}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"# Dynamic Routing Exceptions"},{"line_number":111,"context_line":"class BgpSpeakerNotFound(exceptions.NotFound):"},{"line_number":112,"context_line":"    message \u003d _(\"BGP speaker %(id)s could not be found.\")"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"ba15a1d1_d39bb515","line":110,"updated":"2015-09-24 06:30:35.000000000","message":"BGP Exceptions","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fe22c9348256fa8cc3330b12fc2b592e843bb7b0","unresolved":false,"context_lines":[{"line_number":107,"context_line":"}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"# Dynamic Routing Exceptions"},{"line_number":111,"context_line":"class BgpSpeakerNotFound(exceptions.NotFound):"},{"line_number":112,"context_line":"    message \u003d _(\"BGP speaker %(id)s could not be found.\")"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a1a9d01_f7bea0d3","line":110,"in_reply_to":"ba15a1d1_d39bb515","updated":"2015-09-24 13:51:17.000000000","message":"Done","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c94e8e82dc04cfd7d3853998114b88b602a31ed","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# implied."},{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import abc"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_708a0d1d","line":15,"updated":"2015-10-08 06:21:07.000000000","message":"last \u0027#\u0027 is not required. Please remove.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c94e8e82dc04cfd7d3853998114b88b602a31ed","unresolved":false,"context_lines":[{"line_number":33,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":36,"context_line":"    \u0027bgp-speakers\u0027: {"},{"line_number":37,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":38,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":39,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_50e031fa","line":36,"updated":"2015-10-08 06:21:07.000000000","message":"Let\u0027s rearrange \u0027validate\u0027, \u0027is_visible\u0027, \u0027default\u0027 and etc in same order. It will be easier for maintenance.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c94e8e82dc04cfd7d3853998114b88b602a31ed","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                      \u0027is_visible\u0027: True, \u0027default\u0027: True,"},{"line_number":70,"context_line":"                                      \u0027required_by_policy\u0027: False,"},{"line_number":71,"context_line":"                                      \u0027enforce_policy\u0027: True},"},{"line_number":72,"context_line":"        \u0027advertise_tenant_networks\u0027: {"},{"line_number":73,"context_line":"                                      \u0027allow_post\u0027: True,"},{"line_number":74,"context_line":"                                      \u0027allow_put\u0027: True,"},{"line_number":75,"context_line":"                                      \u0027convert_to\u0027: attr.convert_to_boolean,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_10f959c7","line":72,"updated":"2015-10-08 06:21:07.000000000","message":"We can start just after \"{\" ... Why to have this extra spaces?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c94e8e82dc04cfd7d3853998114b88b602a31ed","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        return \"2014-07-01T15:37:00-00:00\""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @classmethod"},{"line_number":177,"context_line":"    def get_resources(cls):"},{"line_number":178,"context_line":"        plural_mappings \u003d rh.build_plural_mappings("},{"line_number":179,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a2fa921_90a8098f","line":177,"updated":"2015-10-08 06:21:07.000000000","message":"Would you like to impose maximum QUOTA on the number of BGP speakers / peers etc, we can support? Just a thought!","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        plural_mappings \u003d rh.build_plural_mappings("},{"line_number":179,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_e29c0911","line":181,"updated":"2015-09-29 11:34:04.000000000","message":"s/PUT/POST?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        plural_mappings \u003d rh.build_plural_mappings("},{"line_number":179,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_4c015f05","line":181,"in_reply_to":"9a1a9d01_037b3a8d","updated":"2015-09-29 15:02:34.000000000","message":"The \"Neutron way\" isn\u0027t necessarily the right way :)  I think @Jaume has a good point.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"28f877192004b2a6c3f3bb81438efe45bdd1924d","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        plural_mappings \u003d rh.build_plural_mappings("},{"line_number":179,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_037b3a8d","line":181,"in_reply_to":"9a1a9d01_3b4ea83b","updated":"2015-09-29 13:48:08.000000000","message":"I don\u0027t like this convention. A PUT is idempotent by definition, and a creation (POST) is not. But ok. If it is the Neutron way to do it... let\u0027s follow it.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6370d544ca95ff5b56ea0fcb16856afca7115fd5","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        plural_mappings \u003d rh.build_plural_mappings("},{"line_number":179,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_ef528934","line":181,"in_reply_to":"9a1a9d01_4c015f05","updated":"2015-09-30 06:04:13.000000000","message":"I have no issues.. ;)","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a6bc4b6fff4aa28423838c5b4835a019ff679182","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        plural_mappings \u003d rh.build_plural_mappings("},{"line_number":179,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_3b4ea83b","line":181,"in_reply_to":"9a1a9d01_e29c0911","updated":"2015-09-29 12:18:33.000000000","message":"I think we have followed the existing convention.\n\nhttps://github.com/openstack/neutron/blob/70a02288928da523b153ebdf08bd7874f47208f0/neutron/extensions/l3.py#L193-L194","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":185,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_829d0d0c","line":182,"updated":"2015-09-29 11:34:04.000000000","message":"s/PUT/DELETE?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a6bc4b6fff4aa28423838c5b4835a019ff679182","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":185,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_bb6078a6","line":182,"in_reply_to":"9a1a9d01_829d0d0c","updated":"2015-09-29 12:18:33.000000000","message":"ditto.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":185,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":186,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_a2a29149","line":183,"updated":"2015-09-29 11:34:04.000000000","message":"s/PUT/POST?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a6bc4b6fff4aa28423838c5b4835a019ff679182","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":185,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":186,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_9b5b34f6","line":183,"in_reply_to":"9a1a9d01_a2a29149","updated":"2015-09-29 12:18:33.000000000","message":"ditto.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":185,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":186,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"},{"line_number":187,"context_line":"                                      RESOURCE_ATTRIBUTE_MAP,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_6289d9c8","line":184,"updated":"2015-09-29 11:34:04.000000000","message":"s/PUT/DELETE?","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a6bc4b6fff4aa28423838c5b4835a019ff679182","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":182,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":183,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":184,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":185,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":186,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"},{"line_number":187,"context_line":"                                      RESOURCE_ATTRIBUTE_MAP,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_3b754863","line":184,"in_reply_to":"9a1a9d01_6289d9c8","updated":"2015-09-29 12:18:33.000000000","message":"ditto.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"c0dc9a35aaf152dcd6c0ea0baaf8b4179a2597a4","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.common import exceptions"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"BGP_SPEAKER_RESOURCE_NAME \u003d \u0027bgp-speaker\u0027"},{"line_number":24,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":25,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"9a8ffd7b_cac49560","line":23,"updated":"2015-11-26 06:24:48.000000000","message":"Please ignore above comment, sorry.","commit_id":"7ac3f4aaadb50e3abae08bc5d4962192679ccf67"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"ba639ca947de31484815a5103673232ceb5ea1bd","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.common import exceptions"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"BGP_SPEAKER_RESOURCE_NAME \u003d \u0027bgp-speaker\u0027"},{"line_number":24,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":25,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"9a8ffd7b_084ac9c5","line":23,"updated":"2015-11-25 15:41:59.000000000","message":"The resource name must be  \u0027bgp_speaker\u0027, not  \u0027bgp-speaker\u0027","commit_id":"7ac3f4aaadb50e3abae08bc5d4962192679ccf67"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"c0dc9a35aaf152dcd6c0ea0baaf8b4179a2597a4","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                      \u0027required_by_policy\u0027: False,"},{"line_number":73,"context_line":"                                      \u0027enforce_policy\u0027: True},"},{"line_number":74,"context_line":"    },"},{"line_number":75,"context_line":"    \u0027bgp-peers\u0027: {"},{"line_number":76,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":77,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":78,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a8ffd7b_4ab8a5e5","line":75,"updated":"2015-11-26 06:24:48.000000000","message":"Please ignore above comment, sorry.","commit_id":"7ac3f4aaadb50e3abae08bc5d4962192679ccf67"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"ba639ca947de31484815a5103673232ceb5ea1bd","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                      \u0027required_by_policy\u0027: False,"},{"line_number":73,"context_line":"                                      \u0027enforce_policy\u0027: True},"},{"line_number":74,"context_line":"    },"},{"line_number":75,"context_line":"    \u0027bgp-peers\u0027: {"},{"line_number":76,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":77,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":78,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a8ffd7b_486e9130","line":75,"updated":"2015-11-25 15:41:59.000000000","message":"This must be  \u0027bgp_peers\u0027, not  \u0027bgp-peers\u0027","commit_id":"7ac3f4aaadb50e3abae08bc5d4962192679ccf67"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"feb36d322c6ddb129e93c88319cd1f712cfd9389","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron.api.v2 import attributes as attr"},{"line_number":19,"context_line":"from neutron.api.v2 import resource_helper as rh"},{"line_number":20,"context_line":"from neutron.common import exceptions"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"BGP_SPEAKER_RESOURCE_NAME \u003d \u0027bgp-speaker\u0027"},{"line_number":24,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"7a740942_6d133fb9","line":21,"updated":"2015-12-07 09:11:40.000000000","message":"we should make use of the _ from the neutron._i18n","commit_id":"442fb9e331e296908ae65ad850f54d4577858a0d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"b5c2baedfaafc3a15abecf8cede26d7d3313cbee","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":87,"context_line":"                     \u0027enforce_policy\u0027: False},"},{"line_number":88,"context_line":"        \u0027auth_type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":89,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":90,"context_line":"                      \u0027validate\u0027: {\u0027type:values\u0027: bgp_supported_auth_types},"},{"line_number":91,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":92,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":39,"id":"7a740942_de72667c","line":89,"updated":"2015-12-04 09:41:55.000000000","message":"@Ryan: IMO, \u0027authentication\u0027 should be optional and hence \u0027required_by_policy\u0027 should be False. What\u0027s your feeling? No authentication means un-authenticated peering session.","commit_id":"442fb9e331e296908ae65ad850f54d4577858a0d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9a39224023e057f806c5e39d12bcba39b38832b2","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":92,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":93,"context_line":"                     \u0027required_by_policy\u0027: True,"},{"line_number":94,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":95,"context_line":"                     \u0027is_visible\u0027: False},"},{"line_number":96,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":97,"context_line":"                      \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":39,"id":"7a740942_fb96114b","line":94,"updated":"2015-12-07 05:53:50.000000000","message":"Password must be secret. Let\u0027s add \"secret\u003dTrue,\"","commit_id":"442fb9e331e296908ae65ad850f54d4577858a0d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"feb36d322c6ddb129e93c88319cd1f712cfd9389","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":92,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":93,"context_line":"                     \u0027required_by_policy\u0027: True,"},{"line_number":94,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":95,"context_line":"                     \u0027is_visible\u0027: False},"},{"line_number":96,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":97,"context_line":"                      \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":39,"id":"7a740942_8d2f8bf5","line":94,"in_reply_to":"7a740942_fb96114b","updated":"2015-12-07 09:11:40.000000000","message":"that is only for the configuration variables. not the API","commit_id":"442fb9e331e296908ae65ad850f54d4577858a0d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2ca125b7c0e5f7dcf86eba642b8c0652afe02f3e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron.api import extensions"},{"line_number":18,"context_line":"from neutron.api.v2 import attributes as attr"},{"line_number":19,"context_line":"from neutron.api.v2 import resource_helper as rh"},{"line_number":20,"context_line":"from neutron.common import exceptions"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"BGP_SPEAKER_RESOURCE_NAME \u003d \u0027bgp-speaker\u0027"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a7e1126_76a519a0","line":20,"range":{"start_line":20,"start_character":13,"end_line":20,"end_character":19},"updated":"2015-12-20 10:36:30.000000000","message":"address PS39 comments","commit_id":"ef3def989b682e347e755559ba33abdb6d0a3913"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3f842142e9abbcf1283f804a74d0d77b6c970309","unresolved":false,"context_lines":[{"line_number":24,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":25,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"bgp_supported_auth_types \u003d [\u0027NONE\u0027, \u0027MD5\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":30,"context_line":"    BGP_SPEAKER_RESOURCE_NAME + \u0027s\u0027: {"}],"source_content_type":"text/x-python","patch_set":40,"id":"1a7b0d38_04412c38","line":27,"updated":"2015-12-27 04:49:42.000000000","message":"let\u0027s change this to \u0027none\u0027 and \u0027md5\u0027 to be consistent with client patch.","commit_id":"ef3def989b682e347e755559ba33abdb6d0a3913"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a1e837e3492b5b0d8f9801fce0bc7e0c101dcc14","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from neutron.api.v2 import resource_helper as rh"},{"line_number":20,"context_line":"from neutron.common import exceptions"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"BGP_SPEAKER_RESOURCE_NAME \u003d \u0027bgp-speaker\u0027"},{"line_number":24,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":25,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa69d971_814b3eb0","line":22,"updated":"2015-12-30 09:29:11.000000000","message":"one to many new lines","commit_id":"8b5506d2de7fb17cbe6b73bc0e02589bff398347"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a52d234e3e67c809b9a464faa9e8ebef1f571548","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from neutron.api.v2 import resource_helper as rh"},{"line_number":20,"context_line":"from neutron.common import exceptions"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"BGP_SPEAKER_RESOURCE_NAME \u003d \u0027bgp-speaker\u0027"},{"line_number":24,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":25,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa69d971_47779602","line":22,"in_reply_to":"fa69d971_814b3eb0","updated":"2015-12-30 10:07:42.000000000","message":"+1","commit_id":"8b5506d2de7fb17cbe6b73bc0e02589bff398347"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"52a2d99ff1906f3b3c0d2bd41d16ea66b684db7a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \u0027auth_type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":96,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":97,"context_line":"                      \u0027validate\u0027: {\u0027type:values\u0027: bgp_supported_auth_types},"},{"line_number":98,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":99,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":100,"context_line":"                     \u0027required_by_policy\u0027: True,"},{"line_number":101,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa69d971_524bd659","line":98,"updated":"2015-12-30 10:18:08.000000000","message":"Let\u0027s recheck open comments for https://review.openstack.org/#/c/241061/2","commit_id":"8b5506d2de7fb17cbe6b73bc0e02589bff398347"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a1e837e3492b5b0d8f9801fce0bc7e0c101dcc14","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                \"BGP speaker %(bgp_speaker_id)s.\")"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"class NetworkNotFound(exceptions.NotFound):"},{"line_number":135,"context_line":"    message \u003d _(\"Network %(network_id)s does not exist.\")"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"fa69d971_61aaca1b","line":134,"updated":"2015-12-30 09:29:11.000000000","message":"Why not use https://github.com/openstack/neutron/blob/master/neutron/common/exceptions.py#L85 NetworkNotFound?","commit_id":"8b5506d2de7fb17cbe6b73bc0e02589bff398347"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a52d234e3e67c809b9a464faa9e8ebef1f571548","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                \"BGP speaker %(bgp_speaker_id)s.\")"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"class NetworkNotFound(exceptions.NotFound):"},{"line_number":135,"context_line":"    message \u003d _(\"Network %(network_id)s does not exist.\")"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"fa69d971_47e556a6","line":134,"in_reply_to":"fa69d971_61aaca1b","updated":"2015-12-30 10:07:42.000000000","message":"Nice suggestion. Will correct.","commit_id":"8b5506d2de7fb17cbe6b73bc0e02589bff398347"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_b571d979","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":48},"updated":"2016-01-07 19:44:15.000000000","message":":)","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"21b5530b3afaac12a6b1a72d35b1914646111e29","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_aa8f20cb","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":48},"in_reply_to":"fa69d971_b571d979","updated":"2016-02-02 22:48:21.000000000","message":"Done","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":29,"context_line":"    BGP_SPEAKER_RESOURCE_NAME + \u0027s\u0027: {"},{"line_number":30,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":31,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":32,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":33,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_152a252d","line":30,"range":{"start_line":30,"start_character":36,"end_line":30,"end_character":54},"updated":"2016-01-07 19:44:15.000000000","message":"nit:  I think putting each option on its own line will improve readability here and throughout this file.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"21b5530b3afaac12a6b1a72d35b1914646111e29","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":29,"context_line":"    BGP_SPEAKER_RESOURCE_NAME + \u0027s\u0027: {"},{"line_number":30,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":31,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":32,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":33,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_8a9264f5","line":30,"range":{"start_line":30,"start_character":36,"end_line":30,"end_character":54},"in_reply_to":"fa69d971_152a252d","updated":"2016-02-02 22:48:21.000000000","message":"Done","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"},{"line_number":164,"context_line":"    def get_updated(cls):"},{"line_number":165,"context_line":"        return \"2014-07-01T15:37:00-00:00\""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @classmethod"},{"line_number":168,"context_line":"    def get_resources(cls):"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_b553196c","line":165,"range":{"start_line":165,"start_character":16,"end_line":165,"end_character":41},"updated":"2016-01-07 19:44:15.000000000","message":"nit:  This was a while ago.  ;)","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fd17f0f27b126776be95eb0dfbf950de33c3c35a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":52,"id":"9a68dd71_40a799a6","line":1,"updated":"2016-01-26 04:08:17.000000000","message":"2016","commit_id":"8d185ada9997965dfae6e8894f32cc3c3cc190f3"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"5e6e6d0837f5846f9e8af01eb6d83d11fbefeaef","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":96,"context_line":"                      \u0027validate\u0027: {\u0027type:values\u0027: bgp_supported_auth_types},"},{"line_number":97,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":98,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":99,"context_line":"                     \u0027required_by_policy\u0027: True,"},{"line_number":100,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":101,"context_line":"                     \u0027is_visible\u0027: False},"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_65d2b936","line":98,"range":{"start_line":98,"start_character":9,"end_line":98,"end_character":17},"updated":"2016-02-03 00:41:10.000000000","message":"Should default to None or ATTR_NOT_SPECIFIED. I prefer None in this case","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9eb5d7cc460bb686f3d0291a3ecc7fbc0c1e423","unresolved":false,"context_lines":[{"line_number":108,"context_line":"}"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"# Dynamic Routing Exceptions"},{"line_number":112,"context_line":"class BgpSpeakerNotFound(exceptions.NotFound):"},{"line_number":113,"context_line":"    message \u003d _(\"BGP speaker %(id)s could not be found.\")"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"5a5ae5dd_99941d45","line":111,"updated":"2016-02-09 04:55:36.000000000","message":"It would have been great if we had a separate file listing all the BGP exception. Anyways, we can do this later.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"80f0b42afdd459129c3a3afed1195538f7ca66da","unresolved":false,"context_lines":[{"line_number":108,"context_line":"}"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"# Dynamic Routing Exceptions"},{"line_number":112,"context_line":"class BgpSpeakerNotFound(exceptions.NotFound):"},{"line_number":113,"context_line":"    message \u003d _(\"BGP speaker %(id)s could not be found.\")"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3a57f1b5_eb9462e9","line":111,"in_reply_to":"5a5ae5dd_99941d45","updated":"2016-02-09 20:01:19.000000000","message":"I\u0027d like to leave these exceptions here.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9eb5d7cc460bb686f3d0291a3ecc7fbc0c1e423","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"class BgpSpeakerNetworkBindingError(exceptions.Conflict):"},{"line_number":135,"context_line":"    message \u003d _(\"Network %(network_id)s is already bound to BgpSpeaker \""},{"line_number":136,"context_line":"                \"%(bgp_speaker_id)s.\")"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"5a5ae5dd_19626d17","line":135,"updated":"2016-02-09 04:55:36.000000000","message":"nit: Few places we have \"BGP speaker\" (L113, L126) instead of \"BgpSpeaker\". IMO, let\u0027s follow one patter either BGP speaker or BgpSpeaker.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"80f0b42afdd459129c3a3afed1195538f7ca66da","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"class BgpSpeakerNetworkBindingError(exceptions.Conflict):"},{"line_number":135,"context_line":"    message \u003d _(\"Network %(network_id)s is already bound to BgpSpeaker \""},{"line_number":136,"context_line":"                \"%(bgp_speaker_id)s.\")"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3a57f1b5_6b02b240","line":135,"in_reply_to":"5a5ae5dd_19626d17","updated":"2016-02-09 20:01:19.000000000","message":"Any sense of what we have more of, \"BGP speaker or BgpSpeaker\"? I\u0027m thinking I\u0027ll go with \"BGP speaker\".","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9eb5d7cc460bb686f3d0291a3ecc7fbc0c1e423","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"class NetworkNotBound(exceptions.NotFound):"},{"line_number":140,"context_line":"    message \u003d _(\"Network %(network_id)s is not bound to a BgpSpeaker.\")"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class DuplicateBgpPeerIpException(exceptions.Conflict):"}],"source_content_type":"text/x-python","patch_set":61,"id":"5a5ae5dd_b97319e7","line":140,"updated":"2016-02-09 04:55:36.000000000","message":"ditto","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"80f0b42afdd459129c3a3afed1195538f7ca66da","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"class NetworkNotBound(exceptions.NotFound):"},{"line_number":140,"context_line":"    message \u003d _(\"Network %(network_id)s is not bound to a BgpSpeaker.\")"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class DuplicateBgpPeerIpException(exceptions.Conflict):"}],"source_content_type":"text/x-python","patch_set":61,"id":"3a57f1b5_ebbb0274","line":140,"in_reply_to":"5a5ae5dd_b97319e7","updated":"2016-02-09 20:01:19.000000000","message":"See L135","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9eb5d7cc460bb686f3d0291a3ecc7fbc0c1e423","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @classmethod"},{"line_number":165,"context_line":"    def get_updated(cls):"},{"line_number":166,"context_line":"        return \"2014-07-01T15:37:00-00:00\""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    @classmethod"},{"line_number":169,"context_line":"    def get_resources(cls):"}],"source_content_type":"text/x-python","patch_set":61,"id":"5a5ae5dd_9953bd6c","line":166,"updated":"2016-02-09 04:55:36.000000000","message":"Is this date correct?","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"80f0b42afdd459129c3a3afed1195538f7ca66da","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @classmethod"},{"line_number":165,"context_line":"    def get_updated(cls):"},{"line_number":166,"context_line":"        return \"2014-07-01T15:37:00-00:00\""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    @classmethod"},{"line_number":169,"context_line":"    def get_resources(cls):"}],"source_content_type":"text/x-python","patch_set":61,"id":"3a57f1b5_abd0aaca","line":166,"in_reply_to":"5a5ae5dd_9953bd6c","updated":"2016-02-09 20:01:19.000000000","message":"Technically yes :) In all seriousness, let\u0027s update that.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"}],"neutron/extensions/bgp_speaker.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"5969cb9d1401542ca656df4786553deef3e8b8c9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":34,"context_line":"    \u0027bgp-speakers\u0027: {"},{"line_number":35,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":36,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":37,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_403db5c2","line":34,"updated":"2015-07-14 22:08:25.000000000","message":"Allowing POST on any of these might not be a great idea. Typically, a router / route server only runs a single BGP process.  Creating a BgpSpeaker through the API might not be feasible at this point. Investigating whether a BgpSpeaker is instantiated simply by deploying a bg_dr_agent with some config flags to identify it.","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"5969cb9d1401542ca656df4786553deef3e8b8c9","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":56,"context_line":"                     \u0027enforce_policy\u0027: True},"},{"line_number":57,"context_line":"    },"},{"line_number":58,"context_line":"    \u0027bgp-peers\u0027: {"},{"line_number":59,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":60,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":61,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_a05a8128","line":58,"updated":"2015-07-14 22:08:25.000000000","message":"Should we allow posting on BgpPeers? These could just be configuration items in the bgp_dr_agent config.","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class BgpSpeakerNetworkBindingError(exceptions.Conflict):"},{"line_number":116,"context_line":"    message \u003d _(\"Network %(network_id)s is advertised by another BgpSpeaker. \""},{"line_number":117,"context_line":"                \"Networks may only be advertised by one BgpSpeaker.\")"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_68f4255a","line":116,"updated":"2015-07-15 20:34:20.000000000","message":"Would this want to indicate the BgpSpeaker that cannot be advertised and/or the one that has advertisement?","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                                      \u0027advertise_network\u0027: \u0027PUT\u0027,"},{"line_number":151,"context_line":"                                      \u0027stop_network_advertisement\u0027: \u0027PUT\u0027,"},{"line_number":152,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":153,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"},{"line_number":154,"context_line":"                                      RESOURCE_ATTRIBUTE_MAP,"},{"line_number":155,"context_line":"                                      constants.BGP_SPEAKER,"},{"line_number":156,"context_line":"                                      action_map\u003daction_map)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_28a13d46","line":153,"updated":"2015-07-15 20:34:20.000000000","message":"nit: temp var unneeded","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"185ee9a516d2df44adf3af00ff97023eb72c91c4","unresolved":false,"context_lines":[{"line_number":36,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":37,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":38,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":39,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":40,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":41,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":42,"context_line":"                     \u0027enforce_policy\u0027: False},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_c7a9517d","line":39,"updated":"2015-07-24 15:03:32.000000000","message":"Valid as range should be (1,65535). Currently, we are able to accept 0 and 65536 as well.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":36,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":37,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":38,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":39,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":40,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":41,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":42,"context_line":"                     \u0027enforce_policy\u0027: False},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_4966992a","line":39,"in_reply_to":"3a50d1a3_c7a9517d","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"185ee9a516d2df44adf3af00ff97023eb72c91c4","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":65,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":66,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":67,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":68,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":69,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":70,"context_line":"                     \u0027enforce_policy\u0027: False},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_270b557f","line":67,"updated":"2015-07-24 15:03:32.000000000","message":"Valid as range should be (1,65535). Currently, we are able to accept 0 and 65536 as well.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":65,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":66,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":67,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":68,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":69,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":70,"context_line":"                     \u0027enforce_policy\u0027: False},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_a9771dd3","line":67,"in_reply_to":"3a50d1a3_270b557f","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"185ee9a516d2df44adf3af00ff97023eb72c91c4","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                     \u0027enforce_policy\u0027: False},"},{"line_number":71,"context_line":"        \u0027auth_type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":72,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":73,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":74,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":76,"context_line":"                     \u0027required_by_policy\u0027: True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_dd3920da","line":73,"updated":"2015-07-24 15:03:32.000000000","message":"How about defining the auth_type as done in vpnaas:\n\nhttps://github.com/openstack/neutron-vpnaas/blob/master/neutron_vpnaas/extensions/vpnaas.py#L186-L189\n\nMay be something like:\n\nbgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]\n\n\u0027auth_type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,\n                      \u0027required_by_policy\u0027: True,\n                      \u0027validate\u0027: {\u0027type:values\u0027: bgp_supported_auth_types},\n                      \u0027is_visible\u0027: True},","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                     \u0027enforce_policy\u0027: False},"},{"line_number":71,"context_line":"        \u0027auth_type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":72,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":73,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":74,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":76,"context_line":"                     \u0027required_by_policy\u0027: True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_c972a9e3","line":73,"in_reply_to":"3a50d1a3_dd3920da","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"185ee9a516d2df44adf3af00ff97023eb72c91c4","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":73,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":74,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":76,"context_line":"                     \u0027required_by_policy\u0027: True,"},{"line_number":77,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":78,"context_line":"                     \u0027is_visible\u0027: False},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_aafbac46","line":75,"updated":"2015-07-24 15:03:32.000000000","message":"Are we planning to support password update? If yes then we need to add the corresponding handling function. I cannot find  \"update_bgp_peer\".","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":73,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":74,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027password\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":76,"context_line":"                     \u0027required_by_policy\u0027: True,"},{"line_number":77,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":78,"context_line":"                     \u0027is_visible\u0027: False},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_897ca1b6","line":75,"in_reply_to":"3a50d1a3_aafbac46","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7c72dc4cb6c4137a27bfa8489c230c9d78c827f2","unresolved":false,"context_lines":[{"line_number":133,"context_line":"               \"via BGP\")"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @classmethod"},{"line_number":136,"context_line":"    def get_namespace(cls):"},{"line_number":137,"context_line":"        return \"http://docs.openstack.org/ext/neutron/bgp-speaker/api/v1.0\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_8e4a9254","line":136,"updated":"2015-07-24 09:27:20.000000000","message":"Its usage was removed as of I3c406910991c33cf959c5345d76153eabe3ace2d\nrequest you to remove it.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":133,"context_line":"               \"via BGP\")"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @classmethod"},{"line_number":136,"context_line":"    def get_namespace(cls):"},{"line_number":137,"context_line":"        return \"http://docs.openstack.org/ext/neutron/bgp-speaker/api/v1.0\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_e943e56a","line":136,"in_reply_to":"3a50d1a3_8e4a9254","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7c72dc4cb6c4137a27bfa8489c230c9d78c827f2","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":148,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":149,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":150,"context_line":"                                      \u0027advertise_network\u0027: \u0027PUT\u0027,"},{"line_number":151,"context_line":"                                      \u0027stop_network_advertisement\u0027: \u0027PUT\u0027,"},{"line_number":152,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":153,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_ab8f40cb","line":150,"updated":"2015-07-24 09:27:20.000000000","message":"Can we rename it to \"start_network_advertisement\"?","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":148,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":149,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":150,"context_line":"                                      \u0027advertise_network\u0027: \u0027PUT\u0027,"},{"line_number":151,"context_line":"                                      \u0027stop_network_advertisement\u0027: \u0027PUT\u0027,"},{"line_number":152,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":153,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_09473178","line":150,"in_reply_to":"3a50d1a3_ab8f40cb","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7c72dc4cb6c4137a27bfa8489c230c9d78c827f2","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        pass"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    @abc.abstractmethod"},{"line_number":199,"context_line":"    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):"},{"line_number":200,"context_line":"        pass"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_cb4acc27","line":199,"updated":"2015-07-24 09:27:20.000000000","message":"I think this is un-necessary. Speaker doesn\u0027t have any updatable argument. Can we remove it from here and update the spec by removing \"* **bgp-speaker-update**: Update bgpspeaker specification.\" as well.\n(\"https://review.openstack.org/#/c/125401/21/specs/liberty/bgp-dynamic-routing.rst#L327\")","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        pass"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    @abc.abstractmethod"},{"line_number":199,"context_line":"    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):"},{"line_number":200,"context_line":"        pass"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_c92069b3","line":199,"in_reply_to":"3a50d1a3_cb4acc27","updated":"2015-07-25 15:08:03.000000000","message":"It\u0027s required now. New BGP speaker\u0027s attributes needs update. Please refer to PS5 for details.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1cbb4e4fe942b4b4e0e76ec694d78cb0218dd432","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    @abc.abstractmethod"},{"line_number":207,"context_line":"    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":208,"context_line":"        pass"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    @abc.abstractmethod"},{"line_number":211,"context_line":"    def get_bgp_peers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":212,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_64a5e5b3","line":209,"updated":"2015-07-24 10:29:48.000000000","message":"Cannot find the interface for \"* **bgp-speaker-peer-list**: List Peers on bgpspeaker\". I believe this interface might not be required as the intended information (i.e. List of peers associated to a speaker) could be derived from \n\"* **bgp-speaker-show**\" command\n\nIf you agree then let\u0027s remove \"bgp-speaker-peer-list\" from the spec.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1747e322e39282e98250c1fff85fda10667de9fd","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    @abc.abstractmethod"},{"line_number":207,"context_line":"    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):"},{"line_number":208,"context_line":"        pass"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    @abc.abstractmethod"},{"line_number":211,"context_line":"    def get_bgp_peers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":212,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_f925c509","line":209,"in_reply_to":"3a50d1a3_64a5e5b3","updated":"2015-08-01 06:29:05.000000000","message":"Will be addressing the same in the devref document.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7c72dc4cb6c4137a27bfa8489c230c9d78c827f2","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    @abc.abstractmethod"},{"line_number":223,"context_line":"    def delete_bgp_peer(self, context, bgp_peer_id):"},{"line_number":224,"context_line":"        pass"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @abc.abstractmethod"},{"line_number":227,"context_line":"    def advertise_network(self, context, bgp_speaker_id, network_info):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_8b4844ce","line":224,"updated":"2015-07-24 09:27:20.000000000","message":"I agree we don\u0027t need \"update_bgp_peer\" and happy not to see it over here. \n\nCan we remove \"* **bgp-peer-update**: Update peer specification.\" from the spec as well. (https://review.openstack.org/#/c/125401/21/specs/liberty/bgp-dynamic-routing.rst#L342)","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1747e322e39282e98250c1fff85fda10667de9fd","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    @abc.abstractmethod"},{"line_number":223,"context_line":"    def delete_bgp_peer(self, context, bgp_peer_id):"},{"line_number":224,"context_line":"        pass"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @abc.abstractmethod"},{"line_number":227,"context_line":"    def advertise_network(self, context, bgp_speaker_id, network_info):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_b9489dcd","line":224,"in_reply_to":"3a50d1a3_892a618f","updated":"2015-08-01 06:29:05.000000000","message":"Addressed in PS9.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    @abc.abstractmethod"},{"line_number":223,"context_line":"    def delete_bgp_peer(self, context, bgp_peer_id):"},{"line_number":224,"context_line":"        pass"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @abc.abstractmethod"},{"line_number":227,"context_line":"    def advertise_network(self, context, bgp_speaker_id, network_info):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_892a618f","line":224,"in_reply_to":"3a50d1a3_8b4844ce","updated":"2015-07-25 15:08:03.000000000","message":"Peer password could be updated. Please refer to PS6 for details.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7c72dc4cb6c4137a27bfa8489c230c9d78c827f2","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        pass"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @abc.abstractmethod"},{"line_number":227,"context_line":"    def advertise_network(self, context, bgp_speaker_id, network_info):"},{"line_number":228,"context_line":"        pass"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_8b4da4c6","line":227,"updated":"2015-07-24 09:27:20.000000000","message":"Can we rename it as \"start_network_advertisement\" to keep it uniform with the other API.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        pass"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @abc.abstractmethod"},{"line_number":227,"context_line":"    def advertise_network(self, context, bgp_speaker_id, network_info):"},{"line_number":228,"context_line":"        pass"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_2918ed83","line":227,"in_reply_to":"3a50d1a3_8b4da4c6","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"030acfe612ed6fd141954f0d281fdf88c0705410","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    def stop_network_advertisement(self, context, bgp_speaker_id,"},{"line_number":232,"context_line":"                                   network_info):"},{"line_number":233,"context_line":"        pass"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @abc.abstractmethod"},{"line_number":236,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":237,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_5f8c3235","line":234,"updated":"2015-07-24 10:44:59.000000000","message":"Cannot find the interface for \"* **bgp-speaker-network-list**: List Networks advertised by bgpspeaker\". I believe this interface might not be required as the intended information (i.e. List of networks associated to a speaker) could be derived from \"* **bgp-speaker-show**\" command\n\nIf you agree then let\u0027s remove \"bgp-speaker-network-list\" from the spec.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1747e322e39282e98250c1fff85fda10667de9fd","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    def stop_network_advertisement(self, context, bgp_speaker_id,"},{"line_number":232,"context_line":"                                   network_info):"},{"line_number":233,"context_line":"        pass"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @abc.abstractmethod"},{"line_number":236,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":237,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_7911b5ae","line":234,"in_reply_to":"3a50d1a3_5f8c3235","updated":"2015-08-01 06:29:05.000000000","message":"Will be addressing the same in the devref document.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7c72dc4cb6c4137a27bfa8489c230c9d78c827f2","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        pass"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @abc.abstractmethod"},{"line_number":236,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":237,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_cb016c3b","line":236,"updated":"2015-07-24 09:27:20.000000000","message":"Cannot find the interfaces for the following commands as per the approved specification..\n\n* **bgp-speaker-router-add**: Associate a peer to a bgpspeaker.\n* **bgp-speaker-router-list**: List routers on bgpspeaker\n* **bgp-speaker-router-remove**: Remove router on bgpspeaker\n\nIf we not implementing these then can we remove these from the spec as well.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1747e322e39282e98250c1fff85fda10667de9fd","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        pass"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @abc.abstractmethod"},{"line_number":236,"context_line":"    def get_advertised_routes(self, context, bgp_speaker_id):"},{"line_number":237,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_9914c19f","line":236,"in_reply_to":"3a50d1a3_cb016c3b","updated":"2015-08-01 06:29:05.000000000","message":"Will be addressing the same in the devref document.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"df8c23d5a821a2341088b6be5468d57cd1ca3efa","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import abc"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import six"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_e811a35e","line":16,"updated":"2015-07-25 10:52:40.000000000","message":"Since, this file contains the functionality for both bgp_speaker and bgp_peer so i feel we can rename this file as bgp.py instead of bgp_speaker.py","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"75aae0c45640652d481796e961d389fd38989b84","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import abc"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import six"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_1968b120","line":16,"in_reply_to":"3a50d1a3_e811a35e","updated":"2015-08-01 06:33:02.000000000","message":"Leave it as bgp_speaker.py as BGP Peer is the sub functionality of BGP Speaker.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"df8c23d5a821a2341088b6be5468d57cd1ca3efa","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":36,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":37,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":38,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":39,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":40,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":41,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_6881138f","line":38,"updated":"2015-07-25 10:52:40.000000000","message":"I feel we should not allow to modify speaker\u0027s \"local-as\" via an update call. i.e. \"allow_put\" should be False here . If we allow such operation then it mean it\u0027s a new speaker altogether and we are not updating the existing one.\n\nFYI: In neutron-client changes, LOCAL_AS is a mandatory parameter in the bgp_speaker_create call.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c5d40d8771aa0a5069375a0e27b067d821a413cb","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":36,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":37,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":38,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":39,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":40,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":41,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_ed8520cf","line":38,"in_reply_to":"3a50d1a3_4f31b60a","updated":"2015-07-27 06:40:40.000000000","message":"Why to make it complex :-).. IMHO, let\u0027s keep it simple. To me autonomouns system should be a key.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fbb096a9c6c737c1edde7109cfd33253e9456aa0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":36,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":37,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":38,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":39,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":40,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":41,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_4f31b60a","line":38,"in_reply_to":"3a50d1a3_6881138f","updated":"2015-07-26 04:58:41.000000000","message":"Let\u0027s allow the update as long as the speaker is not bound to a peer.  Once we bind a speaker to a peer updates should be blocked.  Until then, let\u0027s allow the update and block changes to local_as when the speaker is bound.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"df8c23d5a821a2341088b6be5468d57cd1ca3efa","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                     \u0027enforce_policy\u0027: True},"},{"line_number":57,"context_line":"        \u0027advertise_floating_ip_host_routes\u0027: {"},{"line_number":58,"context_line":"                                          \u0027allow_post\u0027: True,"},{"line_number":59,"context_line":"                                          \u0027allow_put\u0027: True,"},{"line_number":60,"context_line":"                                          \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":61,"context_line":"                                          \u0027is_visible\u0027: True, \u0027default\u0027: True,"},{"line_number":62,"context_line":"                                          \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_ce3aaf34","line":59,"updated":"2015-07-25 10:52:40.000000000","message":"Plz add \"\u0027convert_to\u0027: attr.convert_to_boolean\" as MYSQL doesn\u0027t support saving of boolean values.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dc0c698e8e0ea05d884bb9182c310143b27d53fa","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                     \u0027enforce_policy\u0027: True},"},{"line_number":57,"context_line":"        \u0027advertise_floating_ip_host_routes\u0027: {"},{"line_number":58,"context_line":"                                          \u0027allow_post\u0027: True,"},{"line_number":59,"context_line":"                                          \u0027allow_put\u0027: True,"},{"line_number":60,"context_line":"                                          \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":61,"context_line":"                                          \u0027is_visible\u0027: True, \u0027default\u0027: True,"},{"line_number":62,"context_line":"                                          \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_1b0c543a","line":59,"in_reply_to":"3a50d1a3_ce3aaf34","updated":"2015-07-25 15:08:12.000000000","message":"Addressed in PS6.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"df8c23d5a821a2341088b6be5468d57cd1ca3efa","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                                          \u0027enforce_policy\u0027: True},"},{"line_number":64,"context_line":"        \u0027advertise_tenant_networks\u0027: {"},{"line_number":65,"context_line":"                                          \u0027allow_post\u0027: True,"},{"line_number":66,"context_line":"                                          \u0027allow_put\u0027: True,"},{"line_number":67,"context_line":"                                          \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":68,"context_line":"                                          \u0027is_visible\u0027: True, \u0027default\u0027: True,"},{"line_number":69,"context_line":"                                          \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_6e491bd0","line":66,"updated":"2015-07-25 10:52:40.000000000","message":"Plz add \"\u0027convert_to\u0027: attr.convert_to_boolean\" as MYSQL doesn\u0027t support saving of boolean values.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dc0c698e8e0ea05d884bb9182c310143b27d53fa","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                                          \u0027enforce_policy\u0027: True},"},{"line_number":64,"context_line":"        \u0027advertise_tenant_networks\u0027: {"},{"line_number":65,"context_line":"                                          \u0027allow_post\u0027: True,"},{"line_number":66,"context_line":"                                          \u0027allow_put\u0027: True,"},{"line_number":67,"context_line":"                                          \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":68,"context_line":"                                          \u0027is_visible\u0027: True, \u0027default\u0027: True,"},{"line_number":69,"context_line":"                                          \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_bb13e05b","line":66,"in_reply_to":"3a50d1a3_6e491bd0","updated":"2015-07-25 15:08:12.000000000","message":"Addressed in PS6.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"df8c23d5a821a2341088b6be5468d57cd1ca3efa","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":78,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":79,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":80,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":81,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":82,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":83,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_68583357","line":80,"updated":"2015-07-25 10:52:40.000000000","message":"I feel we should not allow to modify peer\u0027s \"remote-as\" via an update call. i.e. \"allow_put\" should be False here . If we allow such operartion then it mean it\u0027s a new peer altogether and we are not updating the existing one.\n\nFYI: In neutron-client changes, REMOTE_AS is a mandatory parameter in the bgp_peer_create call.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fbb096a9c6c737c1edde7109cfd33253e9456aa0","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":78,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":79,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":80,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":81,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":82,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":83,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_ef7202e3","line":80,"in_reply_to":"3a50d1a3_68583357","updated":"2015-07-26 04:58:41.000000000","message":"I believe we should allow this modification if the peer is not bound to a speaker.  Once bound to a speaker I agree this should be blocked, this is a good catch.  There\u0027s no harm in allowing this modification as long as the peer is not bound though.  Let\u0027s not enforce this on the API by blocking PUT, rather let\u0027s block it inside update_bgp_peer() by checking that whether the peer is bound.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c5d40d8771aa0a5069375a0e27b067d821a413cb","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":78,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":79,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":80,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":81,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (0, 65536)},"},{"line_number":82,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":83,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_cd594490","line":80,"in_reply_to":"3a50d1a3_ef7202e3","updated":"2015-07-27 06:40:40.000000000","message":"Why to make it complex :-).. IMHO, let\u0027s keep it simple. To me autonomouns system should be a key.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"df8c23d5a821a2341088b6be5468d57cd1ca3efa","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    message \u003d _(\"bgp_peer %(bgp_peer_id)s could not be found.\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"class RouterNotAssociated(exceptions.NotFound):"},{"line_number":111,"context_line":"    message \u003d _(\"Router %(router_id)s not associated to BGP speaker \""},{"line_number":112,"context_line":"                \"%(bgp_speaker_id)s.\")"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_8801ff08","line":110,"updated":"2015-07-25 10:52:40.000000000","message":"I think this might not be required as we are not doing router to bgp_speaker association any more [This idea was proposed in the initial spec which is valid no more]. Request you to kindly remove this.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fbb096a9c6c737c1edde7109cfd33253e9456aa0","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    message \u003d _(\"bgp_peer %(bgp_peer_id)s could not be found.\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"class RouterNotAssociated(exceptions.NotFound):"},{"line_number":111,"context_line":"    message \u003d _(\"Router %(router_id)s not associated to BGP speaker \""},{"line_number":112,"context_line":"                \"%(bgp_speaker_id)s.\")"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_ef59a25c","line":110,"in_reply_to":"3a50d1a3_8801ff08","updated":"2015-07-26 04:58:41.000000000","message":"Done","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"7d9e2fc9c27ecf54a451726d90dd76b559b051e8","unresolved":false,"context_lines":[{"line_number":147,"context_line":"               \"via BGP\")"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    @classmethod"},{"line_number":150,"context_line":"    def get_namespace(cls):"},{"line_number":151,"context_line":"        return \"http://docs.openstack.org/ext/neutron/bgp-speaker/api/v1.0\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_74bfb0aa","line":150,"updated":"2015-07-24 23:14:58.000000000","message":"dont need this anymore per https://bugs.launchpad.net/neutron/+bug/1464023","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dc0c698e8e0ea05d884bb9182c310143b27d53fa","unresolved":false,"context_lines":[{"line_number":147,"context_line":"               \"via BGP\")"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    @classmethod"},{"line_number":150,"context_line":"    def get_namespace(cls):"},{"line_number":151,"context_line":"        return \"http://docs.openstack.org/ext/neutron/bgp-speaker/api/v1.0\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_5b509c0a","line":150,"in_reply_to":"3a50d1a3_74bfb0aa","updated":"2015-07-25 15:08:12.000000000","message":"Addressed in PS6.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"616294724fbdbea06eaecf2019fb2a2f56740d0e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# BGP resource path prefix"},{"line_number":34,"context_line":"BGP_PREFIX \u003d \"/bgp\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_99617cd6","line":34,"updated":"2015-08-08 16:18:36.000000000","message":"Please remove this as it\u0027s not required. As per the latest discussion we will be sticking to \"bgp-speakers\" instead of \"bgp/bgp-speakers\"","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# BGP resource path prefix"},{"line_number":34,"context_line":"BGP_PREFIX \u003d \"/bgp\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_d91a49c6","line":34,"updated":"2015-08-01 06:33:18.000000000","message":"This is not used over here. I feel we can remove it.\n\nNote: It\u0027s usage is ensured in service/bgp_speaker/plugin.py","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"776d1fefb79d58f20e13c2ca551e3232e46b13b3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# BGP resource path prefix"},{"line_number":34,"context_line":"BGP_PREFIX \u003d \"/bgp\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_5ddae079","line":34,"in_reply_to":"1a4dcd0f_99617cd6","updated":"2015-08-10 11:07:30.000000000","message":"Done.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":41,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":42,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":43,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":44,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":45,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":46,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_795f7575","line":43,"updated":"2015-08-01 06:33:18.000000000","message":"Address PS5 comment.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bef765b91bd9667375469fcddeb4af0c19b9547a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":85,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":86,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":87,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":88,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":89,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":90,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_9962813c","line":87,"updated":"2015-08-01 06:33:18.000000000","message":"Address PS5 comment.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"b155a433910b0a1e6832e0f56a7067162bdd3ad1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# BGP resource path prefix"},{"line_number":34,"context_line":"BGP_PREFIX \u003d \"/bgp\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_d0a577b5","line":34,"updated":"2015-08-10 11:30:11.000000000","message":"Remove this.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"962e2f025f85c6eef1fdd2b39bf87a86ec3e005f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":41,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":42,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":43,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":44,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":45,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":46,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_1db6983d","line":43,"updated":"2015-08-10 11:08:19.000000000","message":"Check PS5 comment.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"962e2f025f85c6eef1fdd2b39bf87a86ec3e005f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":85,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":86,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":87,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":88,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":89,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":90,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_bd81a44f","line":87,"updated":"2015-08-10 11:08:19.000000000","message":"Check PS5 comment.","commit_id":"46f0b72ad14c4d126e2595e3285b5820dbb9d136"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":38,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":39,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":40,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":41,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":42,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":43,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_16e80eb2","line":40,"updated":"2015-08-13 07:28:52.000000000","message":"Check PS5 comment.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":38,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":39,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":40,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":41,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":42,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":43,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_adf67f8e","line":40,"in_reply_to":"1a4dcd0f_16e80eb2","updated":"2015-08-13 21:47:00.000000000","message":"OK, you sold me","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":43,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":44,"context_line":"                     \u0027enforce_policy\u0027: False},"},{"line_number":45,"context_line":"        \u0027ip_version\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":46,"context_line":"                     \u0027validate\u0027: {\u0027type:values\u0027: [4, 6]},"},{"line_number":47,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":48,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_edfb277a","line":45,"updated":"2015-08-13 21:47:00.000000000","message":"Block this update","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8bcc036a113381f60ea7191d16098f9a818949ab","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":87,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":88,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":89,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":90,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":91,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":92,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_16ffae66","line":89,"updated":"2015-08-13 07:28:52.000000000","message":"Check PS5 comment.","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9adb21157ee06d076491c3ce4618b16138581159","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":87,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":88,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":89,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":90,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":91,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":92,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a4dcd0f_6df07792","line":89,"in_reply_to":"1a4dcd0f_16ffae66","updated":"2015-08-13 21:47:00.000000000","message":"OK, you sold me","commit_id":"7c5f656a48f0ba5b7db97cd26d7abc7f6d2ac5c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":38,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":39,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":40,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":41,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":42,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":43,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_82bfb3cf","line":40,"updated":"2015-08-18 07:18:14.000000000","message":"Check PS12 comment.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9ca7b98130d8b5a6c72de95814e37b46bda6b8a1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":38,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":39,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"},{"line_number":40,"context_line":"        \u0027local_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":41,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":42,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":43,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_7ae3a7a4","line":40,"in_reply_to":"fa1b9901_82bfb3cf","updated":"2015-08-20 12:03:17.000000000","message":"Done.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":43,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":44,"context_line":"                     \u0027enforce_policy\u0027: False},"},{"line_number":45,"context_line":"        \u0027ip_version\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":46,"context_line":"                     \u0027validate\u0027: {\u0027type:values\u0027: [4, 6]},"},{"line_number":47,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":48,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_42b99be8","line":45,"updated":"2015-08-18 07:18:14.000000000","message":"Check PS12 comment.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9ca7b98130d8b5a6c72de95814e37b46bda6b8a1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":43,"context_line":"                     \u0027required_by_policy\u0027: False,"},{"line_number":44,"context_line":"                     \u0027enforce_policy\u0027: False},"},{"line_number":45,"context_line":"        \u0027ip_version\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":46,"context_line":"                     \u0027validate\u0027: {\u0027type:values\u0027: [4, 6]},"},{"line_number":47,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":48,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_3af0cf66","line":45,"in_reply_to":"fa1b9901_42b99be8","updated":"2015-08-20 12:03:17.000000000","message":"Done.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":87,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":88,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":89,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":90,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":91,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":92,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_62ba9fe3","line":89,"updated":"2015-08-18 07:18:14.000000000","message":"Check PS12 comment.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9ca7b98130d8b5a6c72de95814e37b46bda6b8a1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                    \u0027required_by_policy\u0027: True,"},{"line_number":87,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":88,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":89,"context_line":"        \u0027remote_as\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":90,"context_line":"                     \u0027validate\u0027: {\u0027type:range\u0027: (1, 65535)},"},{"line_number":91,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: None,"},{"line_number":92,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_5af58354","line":89,"in_reply_to":"fa1b9901_62ba9fe3","updated":"2015-08-20 12:03:17.000000000","message":"Done.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":30,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":31,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":36,"context_line":"    \u0027bgp-speakers\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_18700572","line":33,"updated":"2015-08-27 06:31:16.000000000","message":"Do we need to have this defined in CAPS? I am not sure. Just a query as other global variables are defined in capital letters.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":31,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":36,"context_line":"    \u0027bgp-speakers\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_651651f3","line":33,"in_reply_to":"da20952f_18700572","updated":"2015-09-01 16:32:23.000000000","message":"I suppose we could go caps. Not my most pressing issue :)","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"065433811e858b92fc600cea6e2f107dd951c559","unresolved":false,"context_lines":[{"line_number":30,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":31,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":36,"context_line":"    \u0027bgp-speakers\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_6ca78d0b","line":33,"in_reply_to":"da20952f_651651f3","updated":"2015-09-04 08:02:09.000000000","message":":) .. I have posted this change, found it awkward during review.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                      \u0027required_by_policy\u0027: False,"},{"line_number":52,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":53,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":54,"context_line":"        \u0027peers\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":55,"context_line":"                  \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":56,"context_line":"                  \u0027is_visible\u0027: True, \u0027default\u0027: [],"},{"line_number":57,"context_line":"                  \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_3809492d","line":54,"updated":"2015-08-27 06:31:16.000000000","message":"Can\u0027t we update bgp-speakers with peers? why \u0027allow_put\u0027 if False? or this is done to ensure that we just want this happen via \"add_bgp_peer\" interface?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                      \u0027required_by_policy\u0027: False,"},{"line_number":52,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":53,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":54,"context_line":"        \u0027peers\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":55,"context_line":"                  \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":56,"context_line":"                  \u0027is_visible\u0027: True, \u0027default\u0027: [],"},{"line_number":57,"context_line":"                  \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_04f01790","line":54,"in_reply_to":"da20952f_3809492d","updated":"2015-08-30 18:52:07.000000000","message":"As I\u0027ve said in other file: I would remove also the POST ones. Doing a merge in PUT about which peers are new and which are removed, can complicate the code a lot, and for sake of coherency, I wouldn\u0027t allow to POST them. I\u0027m willing to negotiate the maintain these attributes as read-only :)","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                      \u0027required_by_policy\u0027: False,"},{"line_number":52,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":53,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":54,"context_line":"        \u0027peers\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":55,"context_line":"                  \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":56,"context_line":"                  \u0027is_visible\u0027: True, \u0027default\u0027: [],"},{"line_number":57,"context_line":"                  \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_f61ae76d","line":54,"in_reply_to":"da20952f_3809492d","updated":"2015-09-01 07:13:01.000000000","message":"See L174.  This enables creation of the resource with the binding in place. Subsequent changes to peer binding are done using the API\u0027s shown around L174.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                  \u0027is_visible\u0027: True, \u0027default\u0027: [],"},{"line_number":57,"context_line":"                  \u0027required_by_policy\u0027: False,"},{"line_number":58,"context_line":"                  \u0027enforce_policy\u0027: True},"},{"line_number":59,"context_line":"        \u0027networks\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":60,"context_line":"                     \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":61,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: [],"},{"line_number":62,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_7826e1bb","line":59,"updated":"2015-08-27 06:31:16.000000000","message":"ditto.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                  \u0027is_visible\u0027: True, \u0027default\u0027: [],"},{"line_number":57,"context_line":"                  \u0027required_by_policy\u0027: False,"},{"line_number":58,"context_line":"                  \u0027enforce_policy\u0027: True},"},{"line_number":59,"context_line":"        \u0027networks\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":60,"context_line":"                     \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":61,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: [],"},{"line_number":62,"context_line":"                     \u0027required_by_policy\u0027: False,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_964dab74","line":59,"in_reply_to":"da20952f_7826e1bb","updated":"2015-09-01 07:13:01.000000000","message":"See comments at L54","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    message \u003d _(\"BGP peer %(bgp_peer_id)s not authenticated.\")"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class RouterNotAssociated(exceptions.NotFound):"},{"line_number":124,"context_line":"    message \u003d _(\"Router %(router_id)s not associated to BGP speaker \""},{"line_number":125,"context_line":"                \"%(bgp_speaker_id)s.\")"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_b8c8f975","line":123,"updated":"2015-08-27 06:31:16.000000000","message":"Is this referred anywhere? Can\u0027t find it\u0027s reference.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    message \u003d _(\"BGP peer %(bgp_peer_id)s not authenticated.\")"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class RouterNotAssociated(exceptions.NotFound):"},{"line_number":124,"context_line":"    message \u003d _(\"Router %(router_id)s not associated to BGP speaker \""},{"line_number":125,"context_line":"                \"%(bgp_speaker_id)s.\")"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_56571302","line":123,"in_reply_to":"da20952f_b8c8f975","updated":"2015-09-01 07:13:01.000000000","message":"Yes, this will be deleted.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        plural_mappings \u003d rh.build_plural_mappings("},{"line_number":173,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":174,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":175,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":176,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":177,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":178,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_8432e75c","line":175,"updated":"2015-08-30 18:52:07.000000000","message":"PUT or POST?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        plural_mappings \u003d rh.build_plural_mappings("},{"line_number":173,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":174,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":175,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":176,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":177,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":178,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_65a9717b","line":175,"in_reply_to":"da20952f_8432e75c","updated":"2015-09-01 16:32:23.000000000","message":"Forgot to add a comment here earlier.  I\u0027m following what was done for router interface add/remove.  I don\u0027t have strong feelings about PUT vs. POST here.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":174,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":175,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":176,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":177,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":178,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":179,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_a437eb4b","line":176,"updated":"2015-08-30 18:52:07.000000000","message":"PUT or DELETE?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            {}, RESOURCE_ATTRIBUTE_MAP)"},{"line_number":174,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":175,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":176,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":177,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":178,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":179,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_4a66d651","line":176,"in_reply_to":"da20952f_a437eb4b","updated":"2015-09-01 07:13:01.000000000","message":"See L175","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"89e0f1ad377ea0531e4eb7d53d48967a8ab5c159","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":175,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":176,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":177,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":178,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":179,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":180,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_0447b7bc","line":177,"updated":"2015-08-30 18:52:07.000000000","message":"ditto","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        attr.PLURALS.update(plural_mappings)"},{"line_number":175,"context_line":"        action_map \u003d {\u0027bgp-speaker\u0027: {\u0027add_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":176,"context_line":"                                      \u0027remove_bgp_peer\u0027: \u0027PUT\u0027,"},{"line_number":177,"context_line":"                                      \u0027add_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":178,"context_line":"                                      \u0027remove_gateway_network\u0027: \u0027PUT\u0027,"},{"line_number":179,"context_line":"                                      \u0027get_advertised_routes\u0027: \u0027GET\u0027}}"},{"line_number":180,"context_line":"        exts \u003d rh.build_resource_info(plural_mappings,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_0a5c5e7b","line":177,"in_reply_to":"da20952f_0447b7bc","updated":"2015-09-01 07:13:01.000000000","message":"See L175","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"}],"neutron/plugins/common/constants.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6b5cb72a6c09ec8c929ae7bbe71fef8211284a94","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \u0027router\u0027: L3_ROUTER_NAT,"},{"line_number":38,"context_line":"    \u0027flavors\u0027: FLAVORS,"},{"line_number":39,"context_line":"    \u0027qos\u0027: QOS,"},{"line_number":40,"context_line":"    \u0027bgp\u0027: BGP,"},{"line_number":41,"context_line":"}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_e7a011a8","line":40,"updated":"2016-02-03 06:06:13.000000000","message":"you really don\u0027t need this at all, because BGP is not provided by the core plugin. I invite you to see where this variable is used. In fact flavors should die just as well, but that\u0027s a separate matter.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"dc8d5cdc024b102411c98b37c9199d99edb3961d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \u0027router\u0027: L3_ROUTER_NAT,"},{"line_number":38,"context_line":"    \u0027flavors\u0027: FLAVORS,"},{"line_number":39,"context_line":"    \u0027qos\u0027: QOS,"},{"line_number":40,"context_line":"    \u0027bgp\u0027: BGP,"},{"line_number":41,"context_line":"}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_26e7ebe5","line":40,"in_reply_to":"5a5ae5dd_e7a011a8","updated":"2016-02-03 16:47:18.000000000","message":"I\u0027ll poke around. Done","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"}],"neutron/services/bgp/plugin.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"25a47bac0a4a1a5ecc0c6e0b5918bab3ced983e1","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":"import logging as std_logging"},{"line_number":16,"context_line":"from netaddr import IPAddress"},{"line_number":17,"context_line":"from netaddr import IPNetwork"},{"line_number":18,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_e26ac9ed","line":15,"updated":"2015-09-29 11:34:04.000000000","message":"same opinion here: I would move the notifications logic in another patch.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"45fc91cd51c28bc4c5b2bffc6422e864fc95d7ae","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":"import logging as std_logging"},{"line_number":16,"context_line":"from netaddr import IPAddress"},{"line_number":17,"context_line":"from netaddr import IPNetwork"},{"line_number":18,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a1a9d01_f79cbcc1","line":15,"in_reply_to":"9a1a9d01_e26ac9ed","updated":"2015-09-29 15:02:34.000000000","message":"Good suggestion, that\u0027s how I\u0027ll start decomposing this.","commit_id":"e2358e0487e83c2d484270f079c75e1b68d7b73e"}],"neutron/services/bgp_speaker/plugin.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"616294724fbdbea06eaecf2019fb2a2f56740d0e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \"\"\"Base service plugin implementation for BGP speaker plugin.\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    supported_extension_aliases \u003d [\"bgp_speaker\"]"},{"line_number":25,"context_line":"    path_prefix \u003d bgp_ext.BGP_PREFIX"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self):"},{"line_number":28,"context_line":"        super(BgpSpeakerPlugin, self).__init__()"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_f96440e6","line":25,"updated":"2015-08-08 16:18:36.000000000","message":"Please remove this as it\u0027s not required. As per the latest discussion we will be sticking to \"bgp-speakers\" instead of \"bgp/bgp-speakers\"","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"776d1fefb79d58f20e13c2ca551e3232e46b13b3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \"\"\"Base service plugin implementation for BGP speaker plugin.\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    supported_extension_aliases \u003d [\"bgp_speaker\"]"},{"line_number":25,"context_line":"    path_prefix \u003d bgp_ext.BGP_PREFIX"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self):"},{"line_number":28,"context_line":"        super(BgpSpeakerPlugin, self).__init__()"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_7d7b1c7c","line":25,"in_reply_to":"1a4dcd0f_f96440e6","updated":"2015-08-10 11:07:30.000000000","message":"done.","commit_id":"93a2092a7f5ae9c77c660661d3b472c7cc554389"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                v4_cidrs \u003d []"},{"line_number":134,"context_line":"                for cidr in cidrs:"},{"line_number":135,"context_line":"                    subnet \u003d IPNetwork(cidr)"},{"line_number":136,"context_line":"                    if subnet.version \u003d\u003d 4:"},{"line_number":137,"context_line":"                        v4_cidrs.append(subnet)"},{"line_number":138,"context_line":"                    else:"},{"line_number":139,"context_line":"                        v6_cidrs.append(subnet)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_a2ad178a","line":136,"updated":"2015-08-18 07:18:14.000000000","message":"Let\u0027s avoid using hard-coded value.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                        v6_cidrs.append(subnet)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"                for speaker in speakers:"},{"line_number":142,"context_line":"                    if speaker.ip_version \u003d\u003d 4:"},{"line_number":143,"context_line":"                        speaker_v4 \u003d speaker.id"},{"line_number":144,"context_line":"                    else:"},{"line_number":145,"context_line":"                        speaker_v6 \u003d speaker.id"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_62a13fa9","line":142,"updated":"2015-08-18 07:18:14.000000000","message":"Let\u0027s avoid using hard-coded value.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3e0f2800ab314522714af571260755de988635d1","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                    \"ignoring router gateway interface creation.\") % router_id"},{"line_number":179,"context_line":"            LOG.debug(msg)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _handle_router_gateway_after_delete(self, **kwargs):"},{"line_number":182,"context_line":"        gw_network \u003d kwargs[\u0027router_gw_network_id\u0027]"},{"line_number":183,"context_line":"        router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":184,"context_line":"        cidrs \u003d kwargs[\u0027cidrs\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_02a16394","line":181,"updated":"2015-08-18 07:18:14.000000000","message":"Logic looks mostly similar as \"def _handle_router_interface_after_delete\". Can we make it as a common function to realize both functionality.","commit_id":"9dba912e8122075f4bcfd448c9859de30471038c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9d0f7355bfedd8d42ee6f546a93f6ed9bc7f834","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                v4_cidrs \u003d []"},{"line_number":134,"context_line":"                for cidr in cidrs:"},{"line_number":135,"context_line":"                    subnet \u003d IPNetwork(cidr)"},{"line_number":136,"context_line":"                    if subnet.version \u003d\u003d 4:"},{"line_number":137,"context_line":"                        v4_cidrs.append(subnet)"},{"line_number":138,"context_line":"                    else:"},{"line_number":139,"context_line":"                        v6_cidrs.append(subnet)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_9d8b1568","line":136,"updated":"2015-08-20 12:11:05.000000000","message":"check PS14 comment.","commit_id":"456a3dc2c386fae5704759fcc715e630571c0df7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9d0f7355bfedd8d42ee6f546a93f6ed9bc7f834","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                        v6_cidrs.append(subnet)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"                for speaker in speakers:"},{"line_number":142,"context_line":"                    if speaker.ip_version \u003d\u003d 4:"},{"line_number":143,"context_line":"                        speaker_v4 \u003d speaker.id"},{"line_number":144,"context_line":"                    else:"},{"line_number":145,"context_line":"                        speaker_v6 \u003d speaker.id"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_fdf011ff","line":142,"updated":"2015-08-20 12:11:05.000000000","message":"check PS14 comment.","commit_id":"456a3dc2c386fae5704759fcc715e630571c0df7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9d0f7355bfedd8d42ee6f546a93f6ed9bc7f834","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                    \"ignoring router gateway interface creation.\") % router_id"},{"line_number":179,"context_line":"            LOG.debug(msg)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _handle_router_gateway_after_delete(self, **kwargs):"},{"line_number":182,"context_line":"        gw_network \u003d kwargs[\u0027router_gw_network_id\u0027]"},{"line_number":183,"context_line":"        router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":184,"context_line":"        cidrs \u003d kwargs[\u0027cidrs\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_dddc2d75","line":181,"updated":"2015-08-20 12:11:05.000000000","message":"check PS14 comment.","commit_id":"456a3dc2c386fae5704759fcc715e630571c0df7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                                                   gw_network)"},{"line_number":117,"context_line":"                    for speaker in speakers:"},{"line_number":118,"context_line":"                        routes \u003d self._tenant_prefixes_by_router_interface("},{"line_number":119,"context_line":"                                                            self,"},{"line_number":120,"context_line":"                                                            context,"},{"line_number":121,"context_line":"                                                            kwargs[\u0027port_id\u0027],"},{"line_number":122,"context_line":"                                                            speaker.id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_7235a7f5","line":119,"updated":"2015-08-22 09:36:40.000000000","message":"Remove \u0027self\u0027 passed as the first parameter to _tenant_prefixes_by_router_interface.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"88b99997649ca3a7b3f9b590cf0c2ad167399e81","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                                                   gw_network)"},{"line_number":117,"context_line":"                    for speaker in speakers:"},{"line_number":118,"context_line":"                        routes \u003d self._tenant_prefixes_by_router_interface("},{"line_number":119,"context_line":"                                                            self,"},{"line_number":120,"context_line":"                                                            context,"},{"line_number":121,"context_line":"                                                            kwargs[\u0027port_id\u0027],"},{"line_number":122,"context_line":"                                                            speaker.id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_c5925d4b","line":119,"in_reply_to":"fa1b9901_5e642c48","updated":"2015-08-25 05:48:02.000000000","message":"Done","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"eb786920d153a2051533d98e69cafb5fae27e9d0","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                                                   gw_network)"},{"line_number":117,"context_line":"                    for speaker in speakers:"},{"line_number":118,"context_line":"                        routes \u003d self._tenant_prefixes_by_router_interface("},{"line_number":119,"context_line":"                                                            self,"},{"line_number":120,"context_line":"                                                            context,"},{"line_number":121,"context_line":"                                                            kwargs[\u0027port_id\u0027],"},{"line_number":122,"context_line":"                                                            speaker.id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_5e642c48","line":119,"in_reply_to":"fa1b9901_7235a7f5","updated":"2015-08-22 15:41:05.000000000","message":"Yes, this is where pep8 is complaining.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"575a2750a3da070acbb249d2c7190c568a4fe2d3","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                        \"ignoring router interface delete.\") % router_id"},{"line_number":220,"context_line":"                LOG.debug(msg)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _start_route_advertisements(context, agent_rpc,"},{"line_number":223,"context_line":"                                    bgp_speaker_id, routes):"},{"line_number":224,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":225,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_45c59759","line":222,"updated":"2015-08-26 14:40:52.000000000","message":"Please pass \u0027self\u0027 as the first parameter to avoid pep8 issue.","commit_id":"39640bcbd4bbdd5624a9d6d0b87ddd095b533afd"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fa76709aff5783cb10a26cf40f701159c43ffbd5","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                        \"ignoring router interface delete.\") % router_id"},{"line_number":220,"context_line":"                LOG.debug(msg)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _start_route_advertisements(context, agent_rpc,"},{"line_number":223,"context_line":"                                    bgp_speaker_id, routes):"},{"line_number":224,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":225,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_5239dcf0","line":222,"in_reply_to":"fa1b9901_45c59759","updated":"2015-08-26 14:51:47.000000000","message":"Oops, I fixed this locally on my devstack machine but didn\u0027t fix it in my dev environment.  I\u0027ll fix it ASAP.","commit_id":"39640bcbd4bbdd5624a9d6d0b87ddd095b533afd"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"575a2750a3da070acbb249d2c7190c568a4fe2d3","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""},{"line_number":228,"context_line":"                LOG.debug(msg, str(route), bgp_speaker_id)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _stop_route_advertisements(context, agent_rpc,"},{"line_number":231,"context_line":"                                   bgp_speaker_id, routes):"},{"line_number":232,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":233,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_05a23fae","line":230,"updated":"2015-08-26 14:40:52.000000000","message":"Please pass \u0027self\u0027 as the first parameter to avoid pep8 issue.","commit_id":"39640bcbd4bbdd5624a9d6d0b87ddd095b533afd"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fa76709aff5783cb10a26cf40f701159c43ffbd5","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""},{"line_number":228,"context_line":"                LOG.debug(msg, str(route), bgp_speaker_id)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _stop_route_advertisements(context, agent_rpc,"},{"line_number":231,"context_line":"                                   bgp_speaker_id, routes):"},{"line_number":232,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":233,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_d22deca8","line":230,"in_reply_to":"fa1b9901_05a23fae","updated":"2015-08-26 14:51:47.000000000","message":"Ditto","commit_id":"39640bcbd4bbdd5624a9d6d0b87ddd095b533afd"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                           events.AFTER_DELETE)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _post_bgp_speaker_db_create(self, ctx, bgp_speaker_id):"},{"line_number":71,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(ctx,"},{"line_number":72,"context_line":"                                                       bgp_speaker_id)"},{"line_number":73,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_5888bde7","line":71,"updated":"2015-08-27 06:31:16.000000000","message":"Do we want to do this even if no peer is associated with BGP speaker yet?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                           events.AFTER_DELETE)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _post_bgp_speaker_db_create(self, ctx, bgp_speaker_id):"},{"line_number":71,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(ctx,"},{"line_number":72,"context_line":"                                                       bgp_speaker_id)"},{"line_number":73,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_d66c839e","line":71,"in_reply_to":"da20952f_5888bde7","updated":"2015-09-01 07:13:01.000000000","message":"For simplicity, yes. Can we optimize? Perhaps.  Keep it simple until the simple solution proves itself problematic.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                           events.AFTER_DELETE)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _post_bgp_speaker_db_create(self, ctx, bgp_speaker_id):"},{"line_number":71,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(ctx,"},{"line_number":72,"context_line":"                                                       bgp_speaker_id)"},{"line_number":73,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_c5815dc5","line":71,"in_reply_to":"da20952f_a54245ac","updated":"2015-09-01 16:32:23.000000000","message":"I\u0027m going to disable creating network and peer bindings on POST, so this will be unnecessary.  We\u0027ll see explicit binding events and the routes will be pushed out when networks are bound so we\u0027ll always be able to notify the dr_agent.  I\u0027ll remove this.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c3894cfab56c2608d34995fd6a5b7732e958a8d3","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                           events.AFTER_DELETE)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _post_bgp_speaker_db_create(self, ctx, bgp_speaker_id):"},{"line_number":71,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_id(ctx,"},{"line_number":72,"context_line":"                                                       bgp_speaker_id)"},{"line_number":73,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_a54245ac","line":71,"in_reply_to":"da20952f_d66c839e","updated":"2015-09-01 07:39:05.000000000","message":"I feel this will be un-necessary as DRAgent will re-smooth all the routes once BGP speaker is added.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _post_add_gateway_network(self, ctx, bgp_speaker_id, network_id):"},{"line_number":76,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_binding(ctx,"},{"line_number":77,"context_line":"                                                            bgp_speaker_id,"},{"line_number":78,"context_line":"                                                            network_id)"},{"line_number":79,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_f86d1133","line":76,"updated":"2015-08-27 06:31:16.000000000","message":"ditto.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _post_add_gateway_network(self, ctx, bgp_speaker_id, network_id):"},{"line_number":76,"context_line":"        routes \u003d self.get_all_routes_by_bgp_speaker_binding(ctx,"},{"line_number":77,"context_line":"                                                            bgp_speaker_id,"},{"line_number":78,"context_line":"                                                            network_id)"},{"line_number":79,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_25993920","line":76,"in_reply_to":"da20952f_f86d1133","updated":"2015-09-01 16:32:23.000000000","message":"This is still required.  The agent will have to wait for a re-sync without this call after a binding is made.  The agent will be unable to smooth this out until after the re-sync period expires.  We want to start route advertisements ASAP.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                                                            network_id)"},{"line_number":79,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _post_remove_gateway_network(self, ctx, bgp_speaker_id, routes):"},{"line_number":82,"context_line":"        self._stop_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def floatingip_update_callback(self, resource, event, trigger, **kwargs):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_186b2520","line":81,"updated":"2015-08-27 06:31:16.000000000","message":"ditto.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                                                            network_id)"},{"line_number":79,"context_line":"        self._start_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _post_remove_gateway_network(self, ctx, bgp_speaker_id, routes):"},{"line_number":82,"context_line":"        self._stop_route_advertisements(ctx, None, bgp_speaker_id, routes)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def floatingip_update_callback(self, resource, event, trigger, **kwargs):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_c59ddd0b","line":81,"in_reply_to":"da20952f_186b2520","updated":"2015-09-01 16:32:23.000000000","message":"This is still required.  The agent will have to wait for a re-sync without this call after a binding is made.  The agent will be unable to smooth this out until after the re-sync period expires.  We want to revoke routes ASAP.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                bgp_speaker_db \u003d self._bgp_speaker_for_gateway_network("},{"line_number":95,"context_line":"                                                ctx,"},{"line_number":96,"context_line":"                                                kwargs[\u0027floating_network_id\u0027],"},{"line_number":97,"context_line":"                                                4)"},{"line_number":98,"context_line":"                bgp_speaker_id \u003d bgp_speaker_db.id"},{"line_number":99,"context_line":"            except bgp_ext.NetworkNotBound:"},{"line_number":100,"context_line":"                LOG.debug(_(\"Network is not a BGP binding network.\"))"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_b84eb9bf","line":97,"updated":"2015-08-27 06:31:16.000000000","message":"Please make IP-version constant.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":225,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"},{"line_number":226,"context_line":"            for route in routes:"},{"line_number":227,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""},{"line_number":228,"context_line":"                LOG.debug(msg, str(route), bgp_speaker_id)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _stop_route_advertisements(self, context, agent_rpc,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_f802f13d","line":227,"updated":"2015-08-27 06:31:16.000000000","message":"Do we want to do this even if no peer is associated with BGP speaker yet?","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c3894cfab56c2608d34995fd6a5b7732e958a8d3","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":225,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"},{"line_number":226,"context_line":"            for route in routes:"},{"line_number":227,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""},{"line_number":228,"context_line":"                LOG.debug(msg, str(route), bgp_speaker_id)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _stop_route_advertisements(self, context, agent_rpc,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_e5583d8c","line":227,"in_reply_to":"da20952f_96d04b55","updated":"2015-09-01 07:39:05.000000000","message":"See L71","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":225,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"},{"line_number":226,"context_line":"            for route in routes:"},{"line_number":227,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""},{"line_number":228,"context_line":"                LOG.debug(msg, str(route), bgp_speaker_id)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _stop_route_advertisements(self, context, agent_rpc,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_d82384a6","line":227,"in_reply_to":"da20952f_e5583d8c","updated":"2015-09-01 16:32:23.000000000","message":"I feel the discussion at L71 is unrelated to the implementation of this method.  This is the method you call to send notifications to a BgpSpeaker.  Any conditionals limiting RPC calls should be outside this method to keep it focused.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":225,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"},{"line_number":226,"context_line":"            for route in routes:"},{"line_number":227,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""},{"line_number":228,"context_line":"                LOG.debug(msg, str(route), bgp_speaker_id)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _stop_route_advertisements(self, context, agent_rpc,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_96d04b55","line":227,"in_reply_to":"da20952f_f802f13d","updated":"2015-09-01 07:13:01.000000000","message":"I don\u0027t want conditionals in here. You call this to initiate route advertisements, and it does just that with no side-effects.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                                   bgp_speaker_id, routes):"},{"line_number":232,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":233,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"},{"line_number":234,"context_line":"            for route in routes:"},{"line_number":235,"context_line":"                msg \u003d \"Stopping route advertisements for %s on BgpSpeaker %s\""},{"line_number":236,"context_line":"                LOG.debug(msg, str(route), bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_18000534","line":234,"updated":"2015-08-27 06:31:16.000000000","message":"ditto.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a19a8aced029d878567b1b375317d5ea8193c9f","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                                   bgp_speaker_id, routes):"},{"line_number":232,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":233,"context_line":"        if LOG.isEnabledFor(std_logging.DEBUG):"},{"line_number":234,"context_line":"            for route in routes:"},{"line_number":235,"context_line":"                msg \u003d \"Stopping route advertisements for %s on BgpSpeaker %s\""},{"line_number":236,"context_line":"                LOG.debug(msg, str(route), bgp_speaker_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_76cfb7b0","line":234,"in_reply_to":"da20952f_18000534","updated":"2015-09-01 07:13:01.000000000","message":"See comments at L227","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"a542dcbac99d1ea1cea70149e9aeb9038ae96066","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            except bgp_ext.NetworkNotBound:"},{"line_number":98,"context_line":"                LOG.debug(_(\"Network is not a BGP binding network.\"))"},{"line_number":99,"context_line":"                return"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"            if last_router_id and new_router_id !\u003d last_router_id:"},{"line_number":102,"context_line":"                self._stop_route_advertisements(ctx, None,"},{"line_number":103,"context_line":"                                                bgp_speaker_db.id, [dest])"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba15a1d1_1bdc7845","line":100,"updated":"2015-09-21 13:31:30.000000000","message":"Should advertise_floating_ip_host_routes be checked before advertising?","commit_id":"47b891763df158e3f6b1e124ae5e2b885f1392f4"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b0444a37a08cccb52d8c4dd81a850807f0152850","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            except bgp_ext.NetworkNotBound:"},{"line_number":98,"context_line":"                LOG.debug(_(\"Network is not a BGP binding network.\"))"},{"line_number":99,"context_line":"                return"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"            if last_router_id and new_router_id !\u003d last_router_id:"},{"line_number":102,"context_line":"                self._stop_route_advertisements(ctx, None,"},{"line_number":103,"context_line":"                                                bgp_speaker_db.id, [dest])"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba15a1d1_20dca345","line":100,"in_reply_to":"ba15a1d1_1bdc7845","updated":"2015-09-21 15:06:31.000000000","message":"Yes, that\u0027s a good catch.  In the case where we have to execute a DB query advertise_floating_ip_host_routes is checked as part of the query and will omit host routes in the result.  However, the FIP is handed to us here so we do need to check advertise_floating_ip_host_routes.","commit_id":"47b891763df158e3f6b1e124ae5e2b885f1392f4"}],"neutron/tests/api/base.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"59b7af69aa93660488159607e5734dc48fbd2db4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"5a5ae5dd_31f18bce","updated":"2016-02-03 04:38:46.000000000","message":"I\u0027m scratching my head trying to figure out why this is in this patch.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"0f08db2735803ea03a787eb0bd646aa807a8e00d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"5a5ae5dd_c772b5ad","in_reply_to":"5a5ae5dd_31f18bce","updated":"2016-02-03 05:55:28.000000000","message":"For some reason when this runs it wants to use a different client that requires the subnetpool structure rather than a name and kwargs.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"23c512c8ca37fa3f4480a67c4a9232f21f4d6851","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":57,"id":"5a5ae5dd_aea049a0","updated":"2016-02-04 20:05:46.000000000","message":"This is me turning a blind eye to this until you get a chance to work this out.","commit_id":"83111b795396d4a0be5c4b3d3be42f53c585bc13"}],"neutron/tests/api/test_bgp_speaker_extensions.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        bgp_speaker_id \u003d bgp_speaker[\u0027bgp-speaker\u0027][\u0027id\u0027]"},{"line_number":98,"context_line":"        self.delete_bgp_speaker(bgp_speaker_id)"},{"line_number":99,"context_line":"        # TODO(tidwellr) assert deleted"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @test.idempotent_id(\u002781d9dc45-19f8-4c6e-88b8-401d965cd1b0\u0027)"},{"line_number":102,"context_line":"    def test_create_bgp_peer(self):"},{"line_number":103,"context_line":"        bgp_peer \u003d self.create_bgp_peer(**self.default_bgp_peer_args)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_92e4fbac","line":100,"updated":"2015-08-22 09:36:40.000000000","message":"How about adding \"test_update_bgp_speaker\" testing updatable attributes (like advertise_floating_ip_host_routes or advertise_tenant_networks) of BGP speaker?","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        bgp_speaker_id \u003d bgp_speaker[\u0027bgp-speaker\u0027][\u0027id\u0027]"},{"line_number":98,"context_line":"        self.delete_bgp_speaker(bgp_speaker_id)"},{"line_number":99,"context_line":"        # TODO(tidwellr) assert deleted"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @test.idempotent_id(\u002781d9dc45-19f8-4c6e-88b8-401d965cd1b0\u0027)"},{"line_number":102,"context_line":"    def test_create_bgp_peer(self):"},{"line_number":103,"context_line":"        bgp_peer \u003d self.create_bgp_peer(**self.default_bgp_peer_args)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_45509ed4","line":100,"in_reply_to":"fa1b9901_92e4fbac","updated":"2015-08-24 19:17:35.000000000","message":"Yes, we need more interesting tests. Merely updating the attribute isn\u0027t very interesting, it should be coupled with some before/after assertions on calls to bgp-speakers/\u003cbgp_speaker_id\u003e/get_advertised_routes","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        bgp_peer \u003d self.create_bgp_peer(**self.default_bgp_peer_args)"},{"line_number":104,"context_line":"        bgp_peer_id \u003d bgp_peer[\u0027bgp-peer\u0027][\u0027id\u0027]"},{"line_number":105,"context_line":"        # Cleanup after ourselves"},{"line_number":106,"context_line":"        self.addCleanup(self.delete_bgp_peer, bgp_peer_id)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @test.idempotent_id(\u00276ade0319-1ee2-493c-ac4b-5eb230ff3a77\u0027)"},{"line_number":109,"context_line":"    def test_add_bgp_peer(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_92fb9b47","line":106,"updated":"2015-08-22 09:36:40.000000000","message":"How about putting cleanup in base.py?","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        bgp_peer \u003d self.create_bgp_peer(**self.default_bgp_peer_args)"},{"line_number":104,"context_line":"        bgp_peer_id \u003d bgp_peer[\u0027bgp-peer\u0027][\u0027id\u0027]"},{"line_number":105,"context_line":"        # Cleanup after ourselves"},{"line_number":106,"context_line":"        self.addCleanup(self.delete_bgp_peer, bgp_peer_id)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @test.idempotent_id(\u00276ade0319-1ee2-493c-ac4b-5eb230ff3a77\u0027)"},{"line_number":109,"context_line":"    def test_add_bgp_peer(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_65f922c8","line":106,"in_reply_to":"fa1b9901_92fb9b47","updated":"2015-08-24 19:17:35.000000000","message":"Yes, cleanup needs some attention","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self.assertTrue(bgp_peer_id in bgp_peers_list)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @test.idempotent_id(\u0027f9737708-1d79-440b-8350-779f97d882ee\u0027)"},{"line_number":125,"context_line":"    def test_remove_bgp_peer(self):"},{"line_number":126,"context_line":"        bgp_peer \u003d self.create_bgp_peer(**self.default_bgp_peer_args)"},{"line_number":127,"context_line":"        bgp_peer_id \u003d bgp_peer[\u0027bgp-peer\u0027][\u0027id\u0027]"},{"line_number":128,"context_line":"        bgp_speaker \u003d self.create_bgp_speaker(local_as\u003d\u00271234\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_d28833c9","line":125,"updated":"2015-08-22 09:36:40.000000000","message":"How about adding \"test_update_bgp_peer\" testing updatable attributes (like password) of BGP peer?","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self.assertTrue(bgp_peer_id in bgp_peers_list)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @test.idempotent_id(\u0027f9737708-1d79-440b-8350-779f97d882ee\u0027)"},{"line_number":125,"context_line":"    def test_remove_bgp_peer(self):"},{"line_number":126,"context_line":"        bgp_peer \u003d self.create_bgp_peer(**self.default_bgp_peer_args)"},{"line_number":127,"context_line":"        bgp_peer_id \u003d bgp_peer[\u0027bgp-peer\u0027][\u0027id\u0027]"},{"line_number":128,"context_line":"        bgp_speaker \u003d self.create_bgp_speaker(local_as\u003d\u00271234\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_a5dc1a47","line":125,"in_reply_to":"fa1b9901_d28833c9","updated":"2015-08-24 19:17:35.000000000","message":"Yes, we need to add tests like this.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        bgp_speaker \u003d self.create_bgp_speaker(**self.default_bgp_speaker_args)"},{"line_number":97,"context_line":"        bgp_speaker_id \u003d bgp_speaker[\u0027bgp-speaker\u0027][\u0027id\u0027]"},{"line_number":98,"context_line":"        self.delete_bgp_speaker(bgp_speaker_id)"},{"line_number":99,"context_line":"        # TODO(tidwellr) assert deleted"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @test.idempotent_id(\u002781d9dc45-19f8-4c6e-88b8-401d965cd1b0\u0027)"},{"line_number":102,"context_line":"    def test_create_bgp_peer(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_f88991cb","line":99,"updated":"2015-08-27 06:31:16.000000000","message":"Please address PS16 comment. Or atleast let\u0027s make a wishlist of the test-cases which we would like to add as a comment somewhere.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c1d0c120ca5ef784fda81a38b920a6c063a54d0e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        bgp_speaker \u003d self.create_bgp_speaker(**self.default_bgp_speaker_args)"},{"line_number":97,"context_line":"        bgp_speaker_id \u003d bgp_speaker[\u0027bgp-speaker\u0027][\u0027id\u0027]"},{"line_number":98,"context_line":"        self.delete_bgp_speaker(bgp_speaker_id)"},{"line_number":99,"context_line":"        # TODO(tidwellr) assert deleted"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @test.idempotent_id(\u002781d9dc45-19f8-4c6e-88b8-401d965cd1b0\u0027)"},{"line_number":102,"context_line":"    def test_create_bgp_peer(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_d8f624f9","line":99,"in_reply_to":"da20952f_f88991cb","updated":"2015-09-01 16:32:23.000000000","message":"Let\u0027s brainstorm them on the etherpad.  I have some thoughts, sorry I haven\u0027t shared :)","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        bgp_peer \u003d self.create_bgp_peer(**self.default_bgp_peer_args)"},{"line_number":104,"context_line":"        bgp_peer_id \u003d bgp_peer[\u0027bgp-peer\u0027][\u0027id\u0027]"},{"line_number":105,"context_line":"        # Cleanup after ourselves"},{"line_number":106,"context_line":"        self.addCleanup(self.delete_bgp_peer, bgp_peer_id)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @test.idempotent_id(\u00276ade0319-1ee2-493c-ac4b-5eb230ff3a77\u0027)"},{"line_number":109,"context_line":"    def test_add_bgp_peer(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_98c175e7","line":106,"updated":"2015-08-27 06:31:16.000000000","message":"Address PS16 comment.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self.assertTrue(bgp_peer_id in bgp_peers_list)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @test.idempotent_id(\u0027f9737708-1d79-440b-8350-779f97d882ee\u0027)"},{"line_number":125,"context_line":"    def test_remove_bgp_peer(self):"},{"line_number":126,"context_line":"        bgp_peer \u003d self.create_bgp_peer(**self.default_bgp_peer_args)"},{"line_number":127,"context_line":"        bgp_peer_id \u003d bgp_peer[\u0027bgp-peer\u0027][\u0027id\u0027]"},{"line_number":128,"context_line":"        bgp_speaker \u003d self.create_bgp_speaker(local_as\u003d\u00271234\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_f8b0b18d","line":125,"updated":"2015-08-27 06:31:16.000000000","message":"Address PS16 comment.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"2214ea0cd2b4117b083736aa151ea112d707fda4","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(BgpSpeakerTestJSONBase, cls).resource_setup()"},{"line_number":36,"context_line":"        if not test.is_extension_enabled(\u0027bgp_speaker\u0027, \u0027network\u0027):"},{"line_number":37,"context_line":"            msg \u003d \"BGP Speaker extension is not enabled.\""},{"line_number":38,"context_line":"            raise cls.skipException(msg)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        cls.ext_net_id \u003d CONF.network.public_network_id"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"ba15a1d1_2756882a","line":38,"updated":"2015-09-16 23:46:01.000000000","message":"This doesn\u0027t account for the service plugin not being enabled on the Neutron server. Because the extension is being loaded, the tests run in the gate and fail miserably because the service plugin isn\u0027t available to expose the extension API\u0027s.\n\nTODO: somehow check for the service plugin and skip if the plugin isn\u0027t available","commit_id":"47b891763df158e3f6b1e124ae5e2b885f1392f4"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e354c749f00cdf8f7aa80f999411d1c153b3d3aa","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":"from neutron.tests.api import base"},{"line_number":16,"context_line":"from neutron.tests.api import clients"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba15a1d1_16003b00","line":13,"updated":"2015-09-24 06:30:35.000000000","message":"I feel better to rename this file as \"test_bgp_extensions.py\"","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fe22c9348256fa8cc3330b12fc2b592e843bb7b0","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":"from neutron.tests.api import base"},{"line_number":16,"context_line":"from neutron.tests.api import clients"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a1a9d01_f7e1c0d1","line":13,"in_reply_to":"ba15a1d1_16003b00","updated":"2015-09-24 13:51:17.000000000","message":"Agreed","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dd8dcbd351561e8631bff724e099b043c4f8d85f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_c97dbbe8","line":1,"updated":"2016-01-08 03:43:18.000000000","message":"Let\u0027s roll over to a fresh year.","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"21b5530b3afaac12a6b1a72d35b1914646111e29","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_6ac048e1","line":1,"in_reply_to":"fa69d971_c97dbbe8","updated":"2016-02-02 22:48:21.000000000","message":"Done","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b63e3590b48f30213789b04c84d50c35315cc60f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        return self.admin_client.delete_address_scope(id)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"# TODO(tidwellr) Need to flesh out some more interesting tests here"},{"line_number":104,"context_line":"class BgpSpeakerTestJSON(BgpSpeakerTestJSONBase):"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"fa69d971_d864c4e6","line":103,"range":{"start_line":103,"start_character":17,"end_line":103,"end_character":67},"updated":"2016-01-07 19:44:15.000000000","message":"It might help to list here what other tests you hope to add.  How much (if any) of what you want to add here is covered by the API tests already?","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"21b5530b3afaac12a6b1a72d35b1914646111e29","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        return self.admin_client.delete_address_scope(id)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"# TODO(tidwellr) Need to flesh out some more interesting tests here"},{"line_number":104,"context_line":"class BgpSpeakerTestJSON(BgpSpeakerTestJSONBase):"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"7a5de9d1_ca761cd8","line":103,"range":{"start_line":103,"start_character":17,"end_line":103,"end_character":67},"in_reply_to":"fa69d971_d864c4e6","updated":"2016-02-02 22:48:21.000000000","message":"Getting rid of this TODO, we\u0027ve got a pretty interesting slate of tests now","commit_id":"6574b50e78a40a06e90f2602b0685ac12b4e8430"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fd17f0f27b126776be95eb0dfbf950de33c3c35a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":52,"id":"9a68dd71_c0b149e1","line":1,"updated":"2016-01-26 04:08:17.000000000","message":"2016","commit_id":"8d185ada9997965dfae6e8894f32cc3c3cc190f3"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7a1d7ab427e7fd1e44d8eda8d23aeb1625356fe3","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron.tests.api import base"},{"line_number":16,"context_line":"from neutron.tests.api import clients"},{"line_number":17,"context_line":"from neutron.tests.tempest.common import tempest_fixtures as fixtures"},{"line_number":18,"context_line":"from neutron.tests.tempest import config"},{"line_number":19,"context_line":"from neutron.tests.tempest import test"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"7a5de9d1_8f7999ca","line":17,"updated":"2016-01-30 09:13:49.000000000","message":"Use\n\"from tempest.common import tempest_fixtures\".\n\"from tempest import test\"\n\nChange is being done as part of \"https://github.com/openstack/neutron/commit/a2fe5fd2e065859251897f219ab4bb40e1108d94\"","commit_id":"b159834d6fd4f86a89e9c6c947335aeaca26fe83"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a88b310e7233e7f420a66a798c1816c119a680e7","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron.tests.api import base"},{"line_number":16,"context_line":"from neutron.tests.api import clients"},{"line_number":17,"context_line":"from neutron.tests.tempest.common import tempest_fixtures as fixtures"},{"line_number":18,"context_line":"from neutron.tests.tempest import config"},{"line_number":19,"context_line":"from neutron.tests.tempest import test"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"7a5de9d1_42bd7ed6","line":17,"in_reply_to":"7a5de9d1_8f7999ca","updated":"2016-02-01 22:37:25.000000000","message":"Done","commit_id":"b159834d6fd4f86a89e9c6c947335aeaca26fe83"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"59d52e6a9d9ee8bf25eb998ea03a02f01c478bef","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def resource_setup(cls):"},{"line_number":39,"context_line":"        super(BgpSpeakerTestJSONBase, cls).resource_setup()"},{"line_number":40,"context_line":"        if not test.is_extension_enabled(\u0027bgp_speaker\u0027, \u0027network\u0027):"},{"line_number":41,"context_line":"            msg \u003d \"BGP Speaker extension is not enabled.\""},{"line_number":42,"context_line":"            raise cls.skipException(msg)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        cls.ext_net_id \u003d CONF.network.public_network_id"}],"source_content_type":"text/x-python","patch_set":63,"id":"3a57f1b5_db26d767","line":41,"updated":"2016-02-10 20:58:40.000000000","message":"unfortunately this test is ineffective on the api job, because we\u0027re configured to test all extensions in *network-feature-enabled*.","commit_id":"fbfa624db1d0f1ef0f2b9b1d5cca529216ba3350"}],"neutron/tests/api/test_bgp_speaker_extensions_negative.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e354c749f00cdf8f7aa80f999411d1c153b3d3aa","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":"from tempest_lib import exceptions as lib_exc"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"ba15a1d1_b6114f54","line":13,"updated":"2015-09-24 06:30:35.000000000","message":"I feel better to rename this file as test_bgp_extensions_negative.py","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fe22c9348256fa8cc3330b12fc2b592e843bb7b0","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":"from tempest_lib import exceptions as lib_exc"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a1a9d01_17db141d","line":13,"in_reply_to":"ba15a1d1_b6114f54","updated":"2015-09-24 13:51:17.000000000","message":"Agreed","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fd17f0f27b126776be95eb0dfbf950de33c3c35a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Co."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":52,"id":"9a68dd71_20c38539","line":1,"updated":"2016-01-26 04:08:17.000000000","message":"2016","commit_id":"8d185ada9997965dfae6e8894f32cc3c3cc190f3"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7a1d7ab427e7fd1e44d8eda8d23aeb1625356fe3","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from tempest_lib import exceptions as lib_exc"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from neutron.tests.api import test_bgp_speaker_extensions as test_base"},{"line_number":18,"context_line":"from neutron.tests.tempest import test"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class BgpSpeakerTestJSONNegative(test_base.BgpSpeakerTestJSONBase):"}],"source_content_type":"text/x-python","patch_set":55,"id":"7a5de9d1_0f4cc99c","line":18,"updated":"2016-01-30 09:13:49.000000000","message":"Use \"from tempest import test\"\n\nChange is being done as part of \"https://github.com/openstack/neutron/commit/a2fe5fd2e065859251897f219ab4bb40e1108d94\"","commit_id":"b159834d6fd4f86a89e9c6c947335aeaca26fe83"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a88b310e7233e7f420a66a798c1816c119a680e7","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from tempest_lib import exceptions as lib_exc"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from neutron.tests.api import test_bgp_speaker_extensions as test_base"},{"line_number":18,"context_line":"from neutron.tests.tempest import test"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class BgpSpeakerTestJSONNegative(test_base.BgpSpeakerTestJSONBase):"}],"source_content_type":"text/x-python","patch_set":55,"id":"7a5de9d1_82f056ca","line":18,"in_reply_to":"7a5de9d1_0f4cc99c","updated":"2016-02-01 22:37:25.000000000","message":"Done","commit_id":"b159834d6fd4f86a89e9c6c947335aeaca26fe83"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f9eb5d7cc460bb686f3d0291a3ecc7fbc0c1e423","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    Tests the following operations in the Neutron API using the REST client for"},{"line_number":25,"context_line":"    Neutron:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        Create bgp-speaker"},{"line_number":28,"context_line":"        Delete bgp-speaker"},{"line_number":29,"context_line":"        Create bgp-peer"},{"line_number":30,"context_line":"        Update bgp-peer"}],"source_content_type":"text/x-python","patch_set":61,"id":"5a5ae5dd_b921d9b6","line":27,"updated":"2016-02-09 04:55:36.000000000","message":"I think the doc string doesn\u0027t match the implementation. Plz check.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"c5c19a3df9f957e0140e127b8cfb3deb9144f692","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    Tests the following operations in the Neutron API using the REST client for"},{"line_number":25,"context_line":"    Neutron:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        Create bgp-speaker"},{"line_number":28,"context_line":"        Delete bgp-speaker"},{"line_number":29,"context_line":"        Create bgp-peer"},{"line_number":30,"context_line":"        Update bgp-peer"}],"source_content_type":"text/x-python","patch_set":61,"id":"3a57f1b5_cb1086ab","line":27,"in_reply_to":"5a5ae5dd_b921d9b6","updated":"2016-02-09 19:56:40.000000000","message":"Good catch, will fix.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"}],"neutron/tests/api/test_subnetpools.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"59b7af69aa93660488159607e5734dc48fbd2db4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"5a5ae5dd_91cb9f72","updated":"2016-02-03 04:38:46.000000000","message":"Hmmm.  More head scratching...","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"0f08db2735803ea03a787eb0bd646aa807a8e00d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"5a5ae5dd_67c42192","in_reply_to":"5a5ae5dd_91cb9f72","updated":"2016-02-03 05:55:28.000000000","message":"Again, these tempest runs are now mysteriously running with a different client than Neutron network_client module (neutron/tests/tempest/services/network/json/network_client.py).  I believe for some reason these tests now run with the neutronclient library, hence the subtly different way of invoking the client.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"23c512c8ca37fa3f4480a67c4a9232f21f4d6851","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":57,"id":"5a5ae5dd_6eb7b1d8","updated":"2016-02-04 20:05:46.000000000","message":"ditto","commit_id":"83111b795396d4a0be5c4b3d3be42f53c585bc13"}],"neutron/tests/api/test_subnetpools_negative.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"59b7af69aa93660488159607e5734dc48fbd2db4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"5a5ae5dd_51c52759","updated":"2016-02-03 04:38:46.000000000","message":"My head is starting to hurt with all this scratching...  ;)","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"0f08db2735803ea03a787eb0bd646aa807a8e00d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"5a5ae5dd_c7ce35b4","in_reply_to":"5a5ae5dd_51c52759","updated":"2016-02-03 05:55:28.000000000","message":"Again, these tempest runs are now mysteriously running with a different client than Neutron network_client module (neutron/tests/tempest/services/network/json/network_client.py).  I believe for some reason these tests now run with the neutronclient library, hence the subtly different way of invoking the client.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"23c512c8ca37fa3f4480a67c4a9232f21f4d6851","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":57,"id":"5a5ae5dd_cea9057d","updated":"2016-02-04 20:05:46.000000000","message":"ditto","commit_id":"83111b795396d4a0be5c4b3d3be42f53c585bc13"}],"neutron/tests/contrib/gate_hook.sh":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"baa8dcef4681dd9bc6db5ee907d59d74d7b5f2f4","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    $BASE/new/devstack-gate/devstack-vm-gate.sh"},{"line_number":54,"context_line":"elif [ \"$VENV\" \u003d\u003d \"dsvm-plus\" ]"},{"line_number":55,"context_line":"then"},{"line_number":56,"context_line":"    # We need the qos service enabled to add corresponding scenario tests to tempest"},{"line_number":57,"context_line":"    export DEVSTACK_LOCAL_CONFIG+\u003d\""},{"line_number":58,"context_line":"enable_plugin neutron git://git.openstack.org/openstack/neutron"},{"line_number":59,"context_line":"enable_service q-bgp"}],"source_content_type":"text/x-sh","patch_set":53,"id":"9a68dd71_0820a848","line":56,"updated":"2016-01-27 06:44:31.000000000","message":"Rephrase comment to include bgp as well.","commit_id":"0682a47b7a0b3f9821780bb78262488ae58ff45a"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6b5cb72a6c09ec8c929ae7bbe71fef8211284a94","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    export DEVSTACK_LOCAL_CONFIG+\u003d\""},{"line_number":47,"context_line":"enable_plugin neutron-vpnaas git://git.openstack.org/openstack/neutron-vpnaas"},{"line_number":48,"context_line":"enable_plugin neutron git://git.openstack.org/openstack/neutron"},{"line_number":49,"context_line":"enable_service q-bgp"},{"line_number":50,"context_line":"enable_service q-qos"},{"line_number":51,"context_line":"\""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-sh","patch_set":56,"id":"5a5ae5dd_4773254e","line":49,"updated":"2016-02-03 06:06:13.000000000","message":"this shouldn\u0027t go here. I am surprised q-qos is too to be honest.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"dc8d5cdc024b102411c98b37c9199d99edb3961d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    export DEVSTACK_LOCAL_CONFIG+\u003d\""},{"line_number":47,"context_line":"enable_plugin neutron-vpnaas git://git.openstack.org/openstack/neutron-vpnaas"},{"line_number":48,"context_line":"enable_plugin neutron git://git.openstack.org/openstack/neutron"},{"line_number":49,"context_line":"enable_service q-bgp"},{"line_number":50,"context_line":"enable_service q-qos"},{"line_number":51,"context_line":"\""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-sh","patch_set":56,"id":"5a5ae5dd_06a18f94","line":49,"in_reply_to":"5a5ae5dd_4773254e","updated":"2016-02-03 16:47:18.000000000","message":"Ugh, how do we get the service plugin running in the gate? This is how we got the dsvm-api tests passing, otherwise the service plugin isn\u0027t loaded and the API tests bomb out. Back to the drawing board I suppose.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1bff2a6407dcd45768fadf20e785e9ac07eef866","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    export DEVSTACK_LOCAL_CONFIG+\u003d\""},{"line_number":63,"context_line":"enable_plugin neutron-vpnaas git://git.openstack.org/openstack/neutron-vpnaas"},{"line_number":64,"context_line":"enable_plugin neutron git://git.openstack.org/openstack/neutron"},{"line_number":65,"context_line":"enable_service q-bgp"},{"line_number":66,"context_line":"enable_service q-qos"},{"line_number":67,"context_line":"\""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-sh","patch_set":61,"id":"3a57f1b5_39d88953","line":65,"updated":"2016-02-09 23:07:32.000000000","message":"Why didn\u0027t you reach out to me to get this resolved? Ignoring me is not gonna get your patch approved, is it? :)\n\nIt\u0027s my understanding that for non-core features we should use the -plus job. My apologies if I did not provide enough context the first time around.\n\n[1] https://review.openstack.org/#/c/247697/8","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"33b3d345196abaac3e2f9c3e570836516412b1ea","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    export DEVSTACK_LOCAL_CONFIG+\u003d\""},{"line_number":63,"context_line":"enable_plugin neutron-vpnaas git://git.openstack.org/openstack/neutron-vpnaas"},{"line_number":64,"context_line":"enable_plugin neutron git://git.openstack.org/openstack/neutron"},{"line_number":65,"context_line":"enable_service q-bgp"},{"line_number":66,"context_line":"enable_service q-qos"},{"line_number":67,"context_line":"\""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-sh","patch_set":61,"id":"3a57f1b5_394f2994","line":65,"in_reply_to":"3a57f1b5_39d88953","updated":"2016-02-09 23:15:20.000000000","message":"I ran check experimental. line 75 should suffice to trigger the execution of BGP tests. If that works drop this line and we should be good.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad2521d1d205e87df51359897d01c60c50ba12ed","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    export DEVSTACK_LOCAL_CONFIG+\u003d\""},{"line_number":63,"context_line":"enable_plugin neutron-vpnaas git://git.openstack.org/openstack/neutron-vpnaas"},{"line_number":64,"context_line":"enable_plugin neutron git://git.openstack.org/openstack/neutron"},{"line_number":65,"context_line":"enable_service q-bgp"},{"line_number":66,"context_line":"enable_service q-qos"},{"line_number":67,"context_line":"\""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-sh","patch_set":61,"id":"3a57f1b5_9fd15dfe","line":65,"in_reply_to":"3a57f1b5_39d88953","updated":"2016-02-10 00:27:37.000000000","message":"Not ignoring you. I meant to come back to this (I promise!). I think I understand what you mean now. I had some help with the changes in this file, I just now noticed that L75 should be enough to get the job done.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad2521d1d205e87df51359897d01c60c50ba12ed","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    export DEVSTACK_LOCAL_CONFIG+\u003d\""},{"line_number":63,"context_line":"enable_plugin neutron-vpnaas git://git.openstack.org/openstack/neutron-vpnaas"},{"line_number":64,"context_line":"enable_plugin neutron git://git.openstack.org/openstack/neutron"},{"line_number":65,"context_line":"enable_service q-bgp"},{"line_number":66,"context_line":"enable_service q-qos"},{"line_number":67,"context_line":"\""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-sh","patch_set":61,"id":"3a57f1b5_df9ef506","line":65,"in_reply_to":"3a57f1b5_39d88953","updated":"2016-02-10 00:27:37.000000000","message":"Not ignoring you. I meant to come back to this (I promise!). I think I understand what you mean now. I had some help with the changes in this file, I just now noticed that L75 should be enough to get the job done.","commit_id":"7aabb05b8009cb379209af74e4a9746fff9d0868"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"59d52e6a9d9ee8bf25eb998ea03a02f01c478bef","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    export DEVSTACK_LOCAL_CONFIG+\u003d\""},{"line_number":63,"context_line":"enable_plugin neutron-vpnaas git://git.openstack.org/openstack/neutron-vpnaas"},{"line_number":64,"context_line":"enable_plugin neutron git://git.openstack.org/openstack/neutron"},{"line_number":65,"context_line":"enable_service q-qos"},{"line_number":66,"context_line":"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    $BASE/new/devstack-gate/devstack-vm-gate.sh"}],"source_content_type":"text/x-sh","patch_set":63,"id":"3a57f1b5_49be9ed5","line":65,"updated":"2016-02-10 20:58:40.000000000","message":"after some consideration, it sounds like if we do want to exercise BGP in the gate we may have to enable the service here. I was operating under the assumption that the -plus job was more mature than it actually is and we may need to defer some cleanup to later. Please add a TODO(armax) to capture the need to make sure we have a slightly more formal process to vet what API\u0027s are exercised in the gate.","commit_id":"fbfa624db1d0f1ef0f2b9b1d5cca529216ba3350"}],"neutron/tests/tempest/services/network/json/network_client.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6b5cb72a6c09ec8c929ae7bbe71fef8211284a94","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                return method_functors[index](name[prefix_len:])"},{"line_number":173,"context_line":"        raise AttributeError(name)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    # Subnetpool methods"},{"line_number":176,"context_line":"    def create_subnetpool(self, post_data):"},{"line_number":177,"context_line":"        body \u003d self.serialize_list(post_data, \"subnetpools\", \"subnetpool\")"},{"line_number":178,"context_line":"        uri \u003d self.get_uri(\"subnetpools\")"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_67a3c19f","line":175,"updated":"2016-02-03 06:06:13.000000000","message":"um I wonder if can break this tie between this patch and these subnet pool related modifications.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"69e528b206041bb2dc08929e1cad00ac96475457","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                return method_functors[index](name[prefix_len:])"},{"line_number":173,"context_line":"        raise AttributeError(name)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    # Subnetpool methods"},{"line_number":176,"context_line":"    def create_subnetpool(self, post_data):"},{"line_number":177,"context_line":"        body \u003d self.serialize_list(post_data, \"subnetpools\", \"subnetpool\")"},{"line_number":178,"context_line":"        uri \u003d self.get_uri(\"subnetpools\")"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_407a0126","line":175,"in_reply_to":"5a5ae5dd_4646a724","updated":"2016-02-03 21:12:59.000000000","message":"Maybe this just needs to be broken out in to a new patch set on which this one depends.","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"dc8d5cdc024b102411c98b37c9199d99edb3961d","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                return method_functors[index](name[prefix_len:])"},{"line_number":173,"context_line":"        raise AttributeError(name)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    # Subnetpool methods"},{"line_number":176,"context_line":"    def create_subnetpool(self, post_data):"},{"line_number":177,"context_line":"        body \u003d self.serialize_list(post_data, \"subnetpools\", \"subnetpool\")"},{"line_number":178,"context_line":"        uri \u003d self.get_uri(\"subnetpools\")"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_4646a724","line":175,"in_reply_to":"5a5ae5dd_67a3c19f","updated":"2016-02-03 16:47:18.000000000","message":"BGP depends on subnetpools and address scopes. We need the fixtures to be able to test.  I do need to look at why the subnetpool methods here are showing that they\u0027ve been modified or created new. I thought these already existed.....","commit_id":"2f9f4fffb11cda921e7ca73e4db6aac1928fbc68"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"23c512c8ca37fa3f4480a67c4a9232f21f4d6851","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                return method_functors[index](name[prefix_len:])"},{"line_number":173,"context_line":"        raise AttributeError(name)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    # Subnetpool methods"},{"line_number":176,"context_line":"    def create_subnetpool(self, post_data):"},{"line_number":177,"context_line":"        body \u003d self.serialize_list(post_data, \"subnetpools\", \"subnetpool\")"},{"line_number":178,"context_line":"        uri \u003d self.get_uri(\"subnetpools\")"}],"source_content_type":"text/x-python","patch_set":57,"id":"5a5ae5dd_4e9d1558","line":175,"updated":"2016-02-04 20:05:46.000000000","message":"ditto","commit_id":"83111b795396d4a0be5c4b3d3be42f53c585bc13"}],"neutron/tests/unit/db/test_bgp_db.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"feb36d322c6ddb129e93c88319cd1f712cfd9389","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from neutron.tests.unit.db import test_db_base_plugin_v2 as test_db_base_plugin"},{"line_number":27,"context_line":"from neutron.tests.unit.extensions import test_l3"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from webob import exc"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_uuid \u003d uuidutils.generate_uuid"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"7a740942_cd4a73ac","line":29,"updated":"2015-12-07 09:11:40.000000000","message":"this import should be above","commit_id":"442fb9e331e296908ae65ad850f54d4577858a0d"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"3aa3818464dd9b4d5539a16ac7f65bc1265ab744","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @contextlib.contextmanager"},{"line_number":155,"context_line":"    def bgp_peer(self, tenant_id\u003d_uuid(), remote_as\u003d\u00274321\u0027,"},{"line_number":156,"context_line":"                 peer_ip\u003d\"192.168.1.1\", auth_type\u003d\"MD5\", password\u003d\"my-secret\","},{"line_number":157,"context_line":"                 fmt\u003dNone, set_context\u003dFalse):"},{"line_number":158,"context_line":"        fmt \u003d fmt or self.fmt"},{"line_number":159,"context_line":"        bgp_peer \u003d self._create_bgp_peer(tenant_id, remote_as, peer_ip,"}],"source_content_type":"text/x-python","patch_set":40,"id":"1a7b0d38_ace36432","line":156,"range":{"start_line":156,"start_character":51,"end_line":156,"end_character":54},"updated":"2015-12-26 11:48:38.000000000","message":"The allowed auth type is none or md5, must change MD5 to md5.\nPls change other MD5 in this file to md5.","commit_id":"ef3def989b682e347e755559ba33abdb6d0a3913"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3f842142e9abbcf1283f804a74d0d77b6c970309","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @contextlib.contextmanager"},{"line_number":155,"context_line":"    def bgp_peer(self, tenant_id\u003d_uuid(), remote_as\u003d\u00274321\u0027,"},{"line_number":156,"context_line":"                 peer_ip\u003d\"192.168.1.1\", auth_type\u003d\"MD5\", password\u003d\"my-secret\","},{"line_number":157,"context_line":"                 fmt\u003dNone, set_context\u003dFalse):"},{"line_number":158,"context_line":"        fmt \u003d fmt or self.fmt"},{"line_number":159,"context_line":"        bgp_peer \u003d self._create_bgp_peer(tenant_id, remote_as, peer_ip,"}],"source_content_type":"text/x-python","patch_set":40,"id":"1a7b0d38_a4493862","line":156,"range":{"start_line":156,"start_character":51,"end_line":156,"end_character":54},"in_reply_to":"1a7b0d38_ace36432","updated":"2015-12-27 04:49:42.000000000","message":"Ok. Will change!","commit_id":"ef3def989b682e347e755559ba33abdb6d0a3913"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"95875cb838b7530b2b55d0e843e74ab3f0e52ebf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett Packard Enterprise Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":53,"id":"9a68dd71_5b3ea32a","line":1,"updated":"2016-01-26 08:39:57.000000000","message":"2016","commit_id":"0682a47b7a0b3f9821780bb78262488ae58ff45a"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"20d95b8132ba146a7b3345410b4dedb3abe5793b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett Packard Enterprise Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":55,"id":"7a5de9d1_afda55e6","line":1,"updated":"2016-01-30 09:00:32.000000000","message":"2016","commit_id":"b159834d6fd4f86a89e9c6c947335aeaca26fe83"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a88b310e7233e7f420a66a798c1816c119a680e7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett Packard Enterprise Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":55,"id":"7a5de9d1_c2eaceda","line":1,"in_reply_to":"7a5de9d1_afda55e6","updated":"2016-02-01 22:37:25.000000000","message":"Done, I have cleaned up all the copyrights.","commit_id":"b159834d6fd4f86a89e9c6c947335aeaca26fe83"}],"neutron/tests/unit/extensions/test_bgp_speaker.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            mock.ANY, bgp_speaker_id)"},{"line_number":129,"context_line":"        self.assertEqual(exc.HTTPNoContent.code, res.status_int)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    # def test_add_router_to_routinginstance(self):"},{"line_number":132,"context_line":"    #     routinginstance_id \u003d _uuid()"},{"line_number":133,"context_line":"    #     router_id \u003d _uuid()"},{"line_number":134,"context_line":"    #     data \u003d {\u0027router_id\u0027: router_id}"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_c87a11bd","line":131,"updated":"2015-07-15 20:34:20.000000000","message":"WIP? Dead?","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        instance.create_bgp_speaker.assert_called_once_with(mock.ANY,"},{"line_number":99,"context_line":"                                                       bgp_speaker\u003ddata)"},{"line_number":100,"context_line":"        self.assertEqual(exc.HTTPCreated.code, res.status_int)"},{"line_number":101,"context_line":"        self._ensure_data_integrity_bgp_speaker(res, return_value)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def test_bgp_speaker_delete(self):"},{"line_number":104,"context_line":"        bgp_speaker_id \u003d _uuid()"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_52174354","line":101,"updated":"2015-08-22 09:36:40.000000000","message":"Better to keep \"test_bgp_speaker_update\" and test it for other updatable attributes.","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        instance.create_bgp_speaker.assert_called_once_with(mock.ANY,"},{"line_number":99,"context_line":"                                                       bgp_speaker\u003ddata)"},{"line_number":100,"context_line":"        self.assertEqual(exc.HTTPCreated.code, res.status_int)"},{"line_number":101,"context_line":"        self._ensure_data_integrity_bgp_speaker(res, return_value)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def test_bgp_speaker_delete(self):"},{"line_number":104,"context_line":"        bgp_speaker_id \u003d _uuid()"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_187565ca","line":101,"updated":"2015-08-27 06:31:16.000000000","message":"Address PS16 comment.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"1a54389953a58299f91d0fc46dec9db607915fc3","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.assertEqual(exc.HTTPOk.code, res.status_int)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        instance.get_bgp_speaker.assert_called_once_with("},{"line_number":76,"context_line":"            mock.ANY, unicode(bgp_speaker_id), fields\u003dmock.ANY)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        self._ensure_data_integrity_bgp_speaker(res, return_value)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba15a1d1_e9af9a92","line":76,"updated":"2015-09-14 01:16:07.000000000","message":"IIRC, unicode is not part of py34, so I think you are going to need to come up with another solution.","commit_id":"f6816a1a76bb872fd7e3ba0ce65e8e64968b71c2"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"17ae898c614626645a8ae97a00b571f06ff25d68","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.assertEqual(exc.HTTPOk.code, res.status_int)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        instance.get_bgp_speaker.assert_called_once_with("},{"line_number":76,"context_line":"            mock.ANY, unicode(bgp_speaker_id), fields\u003dmock.ANY)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        self._ensure_data_integrity_bgp_speaker(res, return_value)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba15a1d1_032654ce","line":76,"in_reply_to":"ba15a1d1_e9af9a92","updated":"2015-09-14 14:59:29.000000000","message":"Good catch, thanks!","commit_id":"f6816a1a76bb872fd7e3ba0ce65e8e64968b71c2"}],"neutron/tests/unit/extensions/test_l3.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dc0c698e8e0ea05d884bb9182c310143b27d53fa","unresolved":false,"context_lines":[{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    @contextlib.contextmanager"},{"line_number":448,"context_line":"    def floatingip_with_assoc(self, port_id\u003dNone, fmt\u003dNone, fixed_ip\u003dNone,"},{"line_number":449,"context_line":"                              public_cidr\u003d\u002711.0.0.0/24\u0027, set_context\u003dFalse):"},{"line_number":450,"context_line":"        with self.subnet(cidr\u003dpublic_cidr) as public_sub:"},{"line_number":451,"context_line":"            self._set_net_external(public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":452,"context_line":"            private_port \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_bb4be02a","line":449,"updated":"2015-07-25 15:08:12.000000000","message":"Are these changes related to BGP dynamic routing changes?","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fbb096a9c6c737c1edde7109cfd33253e9456aa0","unresolved":false,"context_lines":[{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    @contextlib.contextmanager"},{"line_number":448,"context_line":"    def floatingip_with_assoc(self, port_id\u003dNone, fmt\u003dNone, fixed_ip\u003dNone,"},{"line_number":449,"context_line":"                              public_cidr\u003d\u002711.0.0.0/24\u0027, set_context\u003dFalse):"},{"line_number":450,"context_line":"        with self.subnet(cidr\u003dpublic_cidr) as public_sub:"},{"line_number":451,"context_line":"            self._set_net_external(public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":452,"context_line":"            private_port \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_cf25c6c2","line":449,"in_reply_to":"3a50d1a3_bb4be02a","updated":"2015-07-26 04:58:41.000000000","message":"Yes, this is needed to help build out unit tests.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"}],"neutron/tests/unit/services/bgp_speaker/test_bgp_speaker.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":277,"context_line":"    def test_advertise_network(self):"},{"line_number":278,"context_line":"        with self.network() as network:"},{"line_number":279,"context_line":"            network_id \u003d network[\u0027network\u0027][\u0027id\u0027]"},{"line_number":280,"context_line":"            with self.bgp_speaker() as speaker:"},{"line_number":281,"context_line":"                bgp_speaker \u003d speaker[\u0027bgp_speaker\u0027]"},{"line_number":282,"context_line":"                req \u003d self.new_update_request(\u0027bgp-speakers\u0027,"},{"line_number":283,"context_line":"                                              {\u0027network_id\u0027: network_id},"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_c80f7135","line":280,"updated":"2015-07-15 20:34:20.000000000","message":"Nit:Could join the two with clauses and reduce indentation.","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                res_body \u003d self.deserialize(self.fmt,"},{"line_number":321,"context_line":"                                            req.get_response(self.ext_api))"},{"line_number":322,"context_line":"                networks_list \u003d res_body[\u0027bgp_speaker\u0027][\u0027networks\u0027]"},{"line_number":323,"context_line":"                self.assertTrue(not networks_list)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def test_advertise_non_existent_network(self):"},{"line_number":326,"context_line":"        network_id \u003d \"imaginary\""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_f366e6eb","line":323,"updated":"2015-07-15 20:34:20.000000000","message":"assertFalse","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"c17495a787660da4640764acbf47e2786ade44d3","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        helper \u003d bgp_speaker_db.BgpRouteHelper()"},{"line_number":445,"context_line":"        with self.floatingip_with_assoc(public_cidr\u003d\u002710.10.10.0/24\u0027) as fip1:"},{"line_number":446,"context_line":"            fip1_dict \u003d fip1[\u0027floatingip\u0027]"},{"line_number":447,"context_line":"            with self.floatingip_with_assoc(public_cidr\u003d\u00271.1.1.0/24\u0027) as fip2:"},{"line_number":448,"context_line":"                fip2_dict \u003d fip2[\u0027floatingip\u0027]"},{"line_number":449,"context_line":"                bgp_networks \u003d [fip1_dict[\u0027floating_network_id\u0027],"},{"line_number":450,"context_line":"                                fip2_dict[\u0027floating_network_id\u0027]]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_b38a9e62","line":447,"updated":"2015-07-15 20:34:20.000000000","message":"can combine with\u0027s and reduce indent","commit_id":"f8ec368cb0f59f9abf4e97243df4bf8edbaf67c8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"65fa6cf17c657446952fe235510392bb8bdab1d0","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            with self.bgp_speaker(4) as b:"},{"line_number":211,"context_line":"                self._test_list_resources(\u0027bgp-speaker\u0027, [a, b])"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_bgp_speaker_update_local_as(self):"},{"line_number":214,"context_line":"        local_as_1 \u003d 1234"},{"line_number":215,"context_line":"        local_as_2 \u003d 4321"},{"line_number":216,"context_line":"        with self.bgp_speaker(4) as rp:"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_32164f56","line":213,"updated":"2015-08-22 09:36:40.000000000","message":"Since this is a negative test can we rename it as \"test_bgp_speaker_update_local_as_is_invalid\". or anything better.\n\nGot confused with the test-case name and felt we can update the local_as of a BGP speaker :-)","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1320581eacdb5de7ca2caaab6b1e51ac84444477","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            with self.bgp_speaker(4) as b:"},{"line_number":211,"context_line":"                self._test_list_resources(\u0027bgp-speaker\u0027, [a, b])"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_bgp_speaker_update_local_as(self):"},{"line_number":214,"context_line":"        local_as_1 \u003d 1234"},{"line_number":215,"context_line":"        local_as_2 \u003d 4321"},{"line_number":216,"context_line":"        with self.bgp_speaker(4) as rp:"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_a5aada83","line":213,"in_reply_to":"fa1b9901_32164f56","updated":"2015-08-24 19:17:35.000000000","message":"Done","commit_id":"c03f5ed099f58bebb94fe7422c86346750da6ced"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8fdb8945bca1b1b75e337b84d7faf90c108457ff","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            with self.bgp_speaker(4, 4321) as b:"},{"line_number":214,"context_line":"                self._test_list_resources(\u0027bgp-speaker\u0027, [a, b])"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def test_bgp_speaker_update_local_as(self):"},{"line_number":217,"context_line":"        local_as_1 \u003d 1234"},{"line_number":218,"context_line":"        local_as_2 \u003d 4321"},{"line_number":219,"context_line":"        with self.bgp_speaker(4, local_as_1) as rp:"}],"source_content_type":"text/x-python","patch_set":21,"id":"da20952f_d855ad1d","line":216,"updated":"2015-08-27 06:31:16.000000000","message":"Address PS16 comment.","commit_id":"116f38421877e760d1a386611d57632e4cadaf01"}],"setup.cfg":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"176ac113f9c1e09de71ef7c600bc7c34f840ea4f","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":143,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":144,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":145,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":146,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":147,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":148,"context_line":"neutron.service_providers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":4,"id":"3a50d1a3_3404f67c","line":145,"updated":"2015-07-20 06:47:20.000000000","message":"Request you add new plugin changes to /etc/neutron.conf as well.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"586598662d793769a7018aaa3aa5e5fa0259e9e1","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":143,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":144,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":145,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":146,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":147,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":148,"context_line":"neutron.service_providers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":4,"id":"3a50d1a3_e911a55e","line":145,"in_reply_to":"3a50d1a3_3404f67c","updated":"2015-07-25 15:08:03.000000000","message":"Addressed in PS6.","commit_id":"fd4c0083f68a8d095b6ecc81d287d57d40912dd8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e13ff30edd63755c19abc287c70c4c3284cac0ba","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":141,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":142,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":143,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":144,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":145,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":146,"context_line":"neutron.service_providers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":5,"id":"3a50d1a3_e834434b","line":143,"updated":"2015-07-25 06:25:35.000000000","message":"I believe this should be neutron.services.bgp_speaker.plugin:BgpSpeakerPluginML2","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"fd5db254b773585f3b0a449b3233845a82b1f9cb","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":141,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":142,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":143,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":144,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":145,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":146,"context_line":"neutron.service_providers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":5,"id":"3a50d1a3_5776363f","line":143,"updated":"2015-07-25 00:21:21.000000000","message":"curious why is this required when you already have bgp_dr below?","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dc0c698e8e0ea05d884bb9182c310143b27d53fa","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":141,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":142,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":143,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":144,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":145,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":146,"context_line":"neutron.service_providers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":5,"id":"3a50d1a3_bb41a03b","line":143,"in_reply_to":"3a50d1a3_5776363f","updated":"2015-07-25 15:08:12.000000000","message":"@Abhishek: bgp_dr is used in neutron.conf. Request you to kindly refer PS6.","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dc0c698e8e0ea05d884bb9182c310143b27d53fa","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":141,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":142,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":143,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":144,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":145,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":146,"context_line":"neutron.service_providers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":5,"id":"3a50d1a3_fb564805","line":143,"in_reply_to":"3a50d1a3_e834434b","updated":"2015-07-25 15:08:12.000000000","message":"This could be neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin or neutron.services.bgp_speaker.plugin:BgpSpeakerPluginML2","commit_id":"fe5d42faa742ac34731959b0c537c474b360fcbc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6dff983fab506788d8f779b960cd3299a35293ec","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":126,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":127,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":128,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":129,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":130,"context_line":"    qos \u003d neutron.services.qos.qos_plugin:QoSPlugin"},{"line_number":131,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"}],"source_content_type":"text/x-ttcn-cfg","patch_set":23,"id":"da20952f_813ba3d0","line":128,"updated":"2015-09-05 07:47:32.000000000","message":"I feel this is not required and can be achieved via L131.","commit_id":"9f26dba490055365ea0920d73ae5e429f260a985"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6dff983fab506788d8f779b960cd3299a35293ec","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":129,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":130,"context_line":"    qos \u003d neutron.services.qos.qos_plugin:QoSPlugin"},{"line_number":131,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":132,"context_line":"neutron.service_providers \u003d"},{"line_number":133,"context_line":"    # These are for backwards compat with Juno firewall service provider configuration values"},{"line_number":134,"context_line":"    neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver \u003d neutron_fwaas.services.firewall.drivers.linux.iptables_fwaas:IptablesFwaasDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":23,"id":"da20952f_c11c3b68","line":131,"updated":"2015-09-05 07:47:32.000000000","message":"bgp_dr can be renamed to \"bgp_speaker\"","commit_id":"9f26dba490055365ea0920d73ae5e429f260a985"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8c149f9a503e063c63a0ecb3f332bf62649d7f56","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":126,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":127,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":128,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":129,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":130,"context_line":"    qos \u003d neutron.services.qos.qos_plugin:QoSPlugin"},{"line_number":131,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"}],"source_content_type":"text/x-ttcn-cfg","patch_set":24,"id":"da20952f_61e1af29","line":128,"updated":"2015-09-05 07:49:51.000000000","message":"I feel this is not required and can be achieved via L131.","commit_id":"1b247ef6a823d3e0328f65426bf69b5ea45a932e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8c149f9a503e063c63a0ecb3f332bf62649d7f56","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":129,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":130,"context_line":"    qos \u003d neutron.services.qos.qos_plugin:QoSPlugin"},{"line_number":131,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":132,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":133,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":134,"context_line":"neutron.ml2.type_drivers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":24,"id":"da20952f_01d1d356","line":131,"updated":"2015-09-05 07:49:51.000000000","message":"bgp_dr can be renamed to \"bgp_speaker\"","commit_id":"1b247ef6a823d3e0328f65426bf69b5ea45a932e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c30b9fa4925270dae176c36ee681b34faaf3db9e","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    neutron.services.firewall.fwaas_plugin.FirewallPlugin \u003d neutron_fwaas.services.firewall.fwaas_plugin:FirewallPlugin"},{"line_number":126,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":127,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":128,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":129,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":130,"context_line":"    qos \u003d neutron.services.qos.qos_plugin:QoSPlugin"},{"line_number":131,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"}],"source_content_type":"text/x-ttcn-cfg","patch_set":25,"id":"da20952f_c1543bc7","line":128,"updated":"2015-09-05 08:02:30.000000000","message":"I feel this is not required and can be achieved via L131.","commit_id":"244a1abf2cc9d44b9fa423d8efae72f3173c03f4"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c30b9fa4925270dae176c36ee681b34faaf3db9e","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    neutron.services.bgp_speaker.plugin.BgpSpeakerPlugin \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":129,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":130,"context_line":"    qos \u003d neutron.services.qos.qos_plugin:QoSPlugin"},{"line_number":131,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpSpeakerPlugin"},{"line_number":132,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":133,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":134,"context_line":"neutron.ml2.type_drivers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":25,"id":"da20952f_e1593ffe","line":131,"updated":"2015-09-05 08:02:30.000000000","message":"bgp_dr can be renamed to \"bgp_speaker\"","commit_id":"244a1abf2cc9d44b9fa423d8efae72f3173c03f4"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e354c749f00cdf8f7aa80f999411d1c153b3d3aa","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    neutron.services.bgp.plugin.BgpPlugin \u003d neutron.services.bgp.plugin:BgpPlugin"},{"line_number":126,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":127,"context_line":"    qos \u003d neutron.services.qos.qos_plugin:QoSPlugin"},{"line_number":128,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpPlugin"},{"line_number":129,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":130,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":131,"context_line":"neutron.ml2.type_drivers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":31,"id":"ba15a1d1_f384b9d3","line":128,"updated":"2015-09-24 06:30:35.000000000","message":"Change the service name from \u0027bgp_dr\u0027 to \u0027bgp\u0027\n\nPlease correct the plugin path.\n\nbgp \u003d neutron.services.bgp.plugin:BgpPlugin","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fe22c9348256fa8cc3330b12fc2b592e843bb7b0","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    neutron.services.bgp.plugin.BgpPlugin \u003d neutron.services.bgp.plugin:BgpPlugin"},{"line_number":126,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":127,"context_line":"    qos \u003d neutron.services.qos.qos_plugin:QoSPlugin"},{"line_number":128,"context_line":"    bgp_dr \u003d neutron.services.bgp_speaker.plugin:BgpPlugin"},{"line_number":129,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":130,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":131,"context_line":"neutron.ml2.type_drivers \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":31,"id":"9a1a9d01_d7783cfb","line":128,"in_reply_to":"ba15a1d1_f384b9d3","updated":"2015-09-24 13:51:17.000000000","message":"Oops, good catch.  I missed this.","commit_id":"d6bb4b55a4adc58a2c99cfa098b109fde369785d"}]}
