)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"78045422c5665cd8aa245e66d2872c58f948eb7a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"addition to this the patch also implements the basic CRUD requirement for"},{"line_number":12,"context_line":"binding BgpSpeakers and BgpDrAgent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"BgpSpeaker to BgpDrAgent association can be 1-to-n. An admin user can only"},{"line_number":15,"context_line":"associate/disassociate BgpSpeaker to/from a BgpDRAgent. Default scheduler"},{"line_number":16,"context_line":"class will only assign non-assigned BgpSpeaker to an active BgpDrAgent."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"9a1a9d01_6356b65d","line":14,"updated":"2015-09-29 14:10:15.000000000","message":"I think the relationship can be N:1 now and not 1:N.","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"78045422c5665cd8aa245e66d2872c58f948eb7a","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Outstanding Item:"},{"line_number":19,"context_line":" - Rescheduling of a BgpSpeaker to a new BgpDrAgent, when the scheduled"},{"line_number":20,"context_line":"   BgpDrAgent goes down."},{"line_number":21,"context_line":" - Maximum number of BgpSpeaker which the BgpDrScheduler can schedule will"},{"line_number":22,"context_line":"   depend upon the driver support. To realise this BgpDrScheduler need to"},{"line_number":23,"context_line":"   query BgpDrAgent and get this information. Currenly, only 1:1 scheduling"},{"line_number":24,"context_line":"   is realised. Need to change it for 1:N support."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"9a1a9d01_c346a27a","line":21,"updated":"2015-09-29 14:10:15.000000000","message":"Please rephrase: \n - Multiple BgppSpeaker support depend upon the driver. To realise this BgpDrScheduler need to\tquery BgpDrAgent and schedule accordingly.","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"78045422c5665cd8aa245e66d2872c58f948eb7a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"   depend upon the driver support. To realise this BgpDrScheduler need to"},{"line_number":23,"context_line":"   query BgpDrAgent and get this information. Currenly, only 1:1 scheduling"},{"line_number":24,"context_line":"   is realised. Need to change it for 1:N support."},{"line_number":25,"context_line":" - Check for the existing test sufficiency and coverage."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: Id305d9a583116e155441ac5979bf3f6aa6a8258b"},{"line_number":28,"context_line":"Partially-Implements: blueprint bgp-dynamic-routing"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"9a1a9d01_06a268fd","line":25,"updated":"2015-09-29 14:10:15.000000000","message":"I am not sure, If we have planned this as of now:\n - Same BgpSpeaker should be allowed to scheduled on multiple BgpDrAgents for HA.","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4e6c6603640ca98206ea0a0579852c4c37c1cdb9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Outstanding Item:"},{"line_number":19,"context_line":" - Rescheduling of a BgpSpeaker to a new BgpDrAgent, when the scheduled"},{"line_number":20,"context_line":"   BgpDrAgent goes down."},{"line_number":21,"context_line":" - Maximum number of BgpSpeaker which the BgpDrScheduler can schedule will"},{"line_number":22,"context_line":"   depend upon the driver support. To realise this BgpDrScheduler need to"},{"line_number":23,"context_line":"   query BgpDrAgent and get this information. Currenly, only 1:1 scheduling"},{"line_number":24,"context_line":"   is realised. Need to change it for 1:N support."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"3a7e1126_34f55456","line":21,"range":{"start_line":21,"start_character":21,"end_line":21,"end_character":31},"updated":"2015-12-19 10:42:49.000000000","message":"Raise RFE bug for the outstanding items which will be considered later.","commit_id":"91845a3d443b217b5b33559a3a11c4906361078c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cfbb5610db796eb98458278d7cb2dbf49bec647c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Outstanding Item:"},{"line_number":19,"context_line":" - Rescheduling of a BgpSpeaker to a new BgpDrAgent, when the scheduled"},{"line_number":20,"context_line":"   BgpDrAgent goes down."},{"line_number":21,"context_line":" - Maximum number of BgpSpeaker which the BgpDrScheduler can schedule will"},{"line_number":22,"context_line":"   depend upon the driver support. To realise this BgpDrScheduler need to"},{"line_number":23,"context_line":"   query BgpDrAgent and get this information. Currenly, only 1:1 scheduling"},{"line_number":24,"context_line":"   is realised. Need to change it for 1:N support."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"fa69d971_5b6c599c","line":21,"range":{"start_line":21,"start_character":21,"end_line":21,"end_character":31},"in_reply_to":"3a7e1126_34f55456","updated":"2015-12-30 08:45:27.000000000","message":"Done","commit_id":"91845a3d443b217b5b33559a3a11c4906361078c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"69a5c4a56b031162725c05b2ef02b9bf96f86675","unresolved":false,"context_lines":[{"line_number":15,"context_line":"associate/disassociate BgpSpeaker to/from a BgpDRAgent. Default scheduler"},{"line_number":16,"context_line":"class will only assign non-assigned BgpSpeaker to an active BgpDrAgent."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Outstanding Item:"},{"line_number":19,"context_line":" - Rescheduling of a BgpSpeaker to a new BgpDrAgent, when the scheduled"},{"line_number":20,"context_line":"   BgpDrAgent goes down."},{"line_number":21,"context_line":" - Maximum number of BgpSpeaker which the BgpDrScheduler can schedule will"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":43,"id":"9a68dd71_e872f448","line":18,"updated":"2016-01-27 06:48:55.000000000","message":"Separate RFE\u0027s are raised for open items. Let\u0027s remove this from here..","commit_id":"57a10874fa1657ddf7bbedce460c1c3d634af6a6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a9b7838471e8798245e2a8c5395a3d129f871b4f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"associate/disassociate BgpSpeaker to/from a BgpDRAgent. Default scheduler"},{"line_number":16,"context_line":"class will only assign non-assigned BgpSpeaker to an active BgpDrAgent."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Outstanding Item:"},{"line_number":19,"context_line":" - Rescheduling of a BgpSpeaker to a new BgpDrAgent, when the scheduled"},{"line_number":20,"context_line":"   BgpDrAgent goes down."},{"line_number":21,"context_line":" - Maximum number of BgpSpeaker which the BgpDrScheduler can schedule will"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":44,"id":"7a5de9d1_168961c9","line":18,"updated":"2016-01-29 14:55:54.000000000","message":"Separate RFE\u0027s are raised for open items. Let\u0027s remove this from here..","commit_id":"4b04e230c5318fbd18d89ec4ac3e9a1761bdece6"}],"etc/neutron.conf":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":188,"context_line":"# Driver to use for scheduling a loadbalancer pool to an lbaas agent"},{"line_number":189,"context_line":"# loadbalancer_pool_scheduler_driver \u003d neutron.services.loadbalancer.agent_scheduler.ChanceScheduler"},{"line_number":190,"context_line":"# Driver to use for scheduling bgp speaker entities to a dr agent"},{"line_number":191,"context_line":"# bgp_dr_scheduler_driver \u003d neutron.scheduler.bgp_dragent_scheduler.BgpDynamicRoutingScheduler"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"# (StrOpt) Representing the resource type whose load is being reported by"},{"line_number":194,"context_line":"# the agent."}],"source_content_type":"text/plain","patch_set":1,"id":"3a50d1a3_de522f35","line":191,"updated":"2015-08-01 05:24:36.000000000","message":"How about renaming \"bgp_dr_scheduler_driver\" as \"bgp_speaker_scheduler_driver\"?","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":188,"context_line":"# Driver to use for scheduling a loadbalancer pool to an lbaas agent"},{"line_number":189,"context_line":"# loadbalancer_pool_scheduler_driver \u003d neutron.services.loadbalancer.agent_scheduler.ChanceScheduler"},{"line_number":190,"context_line":"# Driver to use for scheduling bgp speaker entities to a dr agent"},{"line_number":191,"context_line":"# bgp_dr_scheduler_driver \u003d neutron.scheduler.bgp_dragent_scheduler.BgpDynamicRoutingScheduler"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"# (StrOpt) Representing the resource type whose load is being reported by"},{"line_number":194,"context_line":"# the agent."}],"source_content_type":"text/plain","patch_set":1,"id":"1a4dcd0f_8e5b502e","line":191,"in_reply_to":"3a50d1a3_de522f35","updated":"2015-08-10 12:34:57.000000000","message":"Will rename to \"bgp_drscheduler_driver\"","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e0772da6b7e6cf2e17c4d7e63635416225711a25","unresolved":false,"context_lines":[{"line_number":195,"context_line":"# router_scheduler_driver \u003d neutron.scheduler.l3_agent_scheduler.ChanceScheduler"},{"line_number":196,"context_line":"# Driver to use for scheduling a loadbalancer pool to an lbaas agent"},{"line_number":197,"context_line":"# loadbalancer_pool_scheduler_driver \u003d neutron.services.loadbalancer.agent_scheduler.ChanceScheduler"},{"line_number":198,"context_line":"# Driver to use for scheduling BGP speaker entities to a DR agent"},{"line_number":199,"context_line":"# bgp_drscheduler_driver \u003d neutron.scheduler.bgp_dragent_scheduler.ChanceScheduler"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"# (StrOpt) Representing the resource type whose load is being reported by"}],"source_content_type":"text/plain","patch_set":17,"id":"da20952f_7db2aa07","line":198,"updated":"2015-09-06 07:10:56.000000000","message":"change BGP Speaker \u003d\u003d\u003e BgpSpeaker and DR agent \u003d\u003d\u003e BgpDrAgent.","commit_id":"9797b6b55c46a44601899da67fc70d5de5591d7b"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"130b028e9b0e68b7c5afadea33963d2782a50956","unresolved":false,"context_lines":[{"line_number":196,"context_line":"# Driver to use for scheduling a loadbalancer pool to an lbaas agent"},{"line_number":197,"context_line":"# loadbalancer_pool_scheduler_driver \u003d neutron.services.loadbalancer.agent_scheduler.ChanceScheduler"},{"line_number":198,"context_line":"# Driver to use for scheduling BGP speaker entities to a BGP DrAgent"},{"line_number":199,"context_line":"# bgp_drscheduler_driver \u003d neutron.services.bgp.agent.scheduler.bgp_dragent_scheduler.ChanceScheduler"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"# (StrOpt) Representing the resource type whose load is being reported by"},{"line_number":202,"context_line":"# the agent."}],"source_content_type":"text/plain","patch_set":24,"id":"9a1a9d01_b69defbd","line":199,"updated":"2015-09-29 13:42:57.000000000","message":"Scheduler class is actually at:\n\nneutron.services.bgp.scheduler.bgp_dragent_scheduler.ChanceSchedule","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"78045422c5665cd8aa245e66d2872c58f948eb7a","unresolved":false,"context_lines":[{"line_number":196,"context_line":"# Driver to use for scheduling a loadbalancer pool to an lbaas agent"},{"line_number":197,"context_line":"# loadbalancer_pool_scheduler_driver \u003d neutron.services.loadbalancer.agent_scheduler.ChanceScheduler"},{"line_number":198,"context_line":"# Driver to use for scheduling BGP speaker entities to a BGP DrAgent"},{"line_number":199,"context_line":"# bgp_drscheduler_driver \u003d neutron.services.bgp.agent.scheduler.bgp_dragent_scheduler.ChanceScheduler"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"# (StrOpt) Representing the resource type whose load is being reported by"},{"line_number":202,"context_line":"# the agent."}],"source_content_type":"text/plain","patch_set":24,"id":"9a1a9d01_e35f26e3","line":199,"in_reply_to":"9a1a9d01_b69defbd","updated":"2015-09-29 14:10:15.000000000","message":"Nice catch. Will change. Missed during re-factoring.","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"}],"etc/policy.json":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":193,"context_line":"    \"stop_network_advertisement\": \"rule:admin_only\","},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\""},{"line_number":196,"context_line":"    "},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","}],"source_content_type":"application/json","patch_set":1,"id":"3a50d1a3_3e3a33e8","line":196,"updated":"2015-08-01 05:24:36.000000000","message":"nits: spaces","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":193,"context_line":"    \"stop_network_advertisement\": \"rule:admin_only\","},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\""},{"line_number":196,"context_line":"    "},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","}],"source_content_type":"application/json","patch_set":1,"id":"1a4dcd0f_ce0958df","line":196,"in_reply_to":"3a50d1a3_3e3a33e8","updated":"2015-08-10 12:34:57.000000000","message":"done.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cdff2937567037cdcdfaa504a7952c66664ba75f","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\","},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","},{"line_number":200,"context_line":"    \"list_dragent_hosting_bgp_speaker\": \"rule:admin\""}],"source_content_type":"application/json","patch_set":4,"id":"1a4dcd0f_420a6f27","line":197,"updated":"2015-08-12 20:51:47.000000000","message":"rule:admin_only for these","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a8e11aa0f1628d94bd2ff12b2ecd551e1c7d44eb","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\","},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","},{"line_number":200,"context_line":"    \"list_dragent_hosting_bgp_speaker\": \"rule:admin\""}],"source_content_type":"application/json","patch_set":4,"id":"fa1b9901_7d18811e","line":197,"in_reply_to":"1a4dcd0f_030a1726","updated":"2015-08-20 12:14:44.000000000","message":"Done.","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ac73a25509aa74c775288f04c4dc5e701fbfb792","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\","},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","},{"line_number":200,"context_line":"    \"list_dragent_hosting_bgp_speaker\": \"rule:admin\""}],"source_content_type":"application/json","patch_set":4,"id":"1a4dcd0f_030a1726","line":197,"in_reply_to":"1a4dcd0f_420a6f27","updated":"2015-08-13 04:39:45.000000000","message":"+1","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"130b028e9b0e68b7c5afadea33963d2782a50956","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin_only\","},{"line_number":221,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin_only\","},{"line_number":222,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin_only\","},{"line_number":223,"context_line":"    \"list_dragent_hosting_bgp_speaker\": \"rule:admin_only\""},{"line_number":224,"context_line":"}"}],"source_content_type":"application/json","patch_set":24,"id":"9a1a9d01_168cdb7d","line":223,"updated":"2015-09-29 13:42:57.000000000","message":"Since the relationship is 1-to-n it may (only suggesting) make sense to rename it as:\n\n\u0027get_dragent_hosting_bgp_speaker\u0027","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"78045422c5665cd8aa245e66d2872c58f948eb7a","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin_only\","},{"line_number":221,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin_only\","},{"line_number":222,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin_only\","},{"line_number":223,"context_line":"    \"list_dragent_hosting_bgp_speaker\": \"rule:admin_only\""},{"line_number":224,"context_line":"}"}],"source_content_type":"application/json","patch_set":24,"id":"9a1a9d01_c328e235","line":223,"in_reply_to":"9a1a9d01_168cdb7d","updated":"2015-09-29 14:10:15.000000000","message":"Sorry, the relationship is N:1, where N BgpSpeakers can be scheduled on a BgpDrAgent. Will update the commit message.\n\nMoreover, for HA we need to allow the scheduling of same BgpSpeakers by multiple agents as well. Need to think over this.","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"}],"neutron/agent/bgp/bgp_dragent_scheduler.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c853e01615e8a988ee01c758a1d9e3dcc81b677","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_7ba9f6de","line":1,"updated":"2016-01-08 03:49:27.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_78e6f845","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2016-01-08 19:18:55.000000000","message":"nit:  2016  ;)","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_3072ee4a","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"in_reply_to":"fa69d971_78e6f845","updated":"2016-01-26 08:38:11.000000000","message":"done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def bind(self, context, agents, bgp_speaker_id):"},{"line_number":35,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":36,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":37,"context_line":"        for agent in agents:"},{"line_number":38,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":39,"context_line":"            # saving agent_id to use it after rollback to avoid"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_1816dc55","line":36,"range":{"start_line":36,"start_character":8,"end_line":36,"end_character":32},"updated":"2016-01-08 19:18:55.000000000","message":"Instead of making a copy and modifying the original, consider creating a new list and appending to the list on success.  Is there a reason you need this method to have the side-effect of modifying the original?","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def bind(self, context, agents, bgp_speaker_id):"},{"line_number":35,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":36,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":37,"context_line":"        for agent in agents:"},{"line_number":38,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":39,"context_line":"            # saving agent_id to use it after rollback to avoid"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_a4524033","line":36,"range":{"start_line":36,"start_character":8,"end_line":36,"end_character":32},"in_reply_to":"fa69d971_1816dc55","updated":"2016-02-08 15:16:21.000000000","message":"This will be called from \"https://github.com/openstack/neutron/blob/master/neutron/scheduler/base_scheduler.py#L47\" with the list of chosen_agents. I think intention here is to remove failed agents from the list.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":36,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":37,"context_line":"        for agent in agents:"},{"line_number":38,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":39,"context_line":"            # saving agent_id to use it after rollback to avoid"},{"line_number":40,"context_line":"            # DetachedInstanceError"},{"line_number":41,"context_line":"            agent_id \u003d agent.id"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_d83b6437","line":38,"range":{"start_line":38,"start_character":12,"end_line":38,"end_character":55},"updated":"2016-01-08 19:18:55.000000000","message":"I\u0027m not sure why you\u0027re using this with explicit commit and rollback instead of simply relying on this:\n\n  with context.session.begin(subtransactions\u003dTrue):\n\nIs it just to remove the agent from bound_agents after rollback?  I think that can still be done with the manager pattern.  I think the agent_id will still be in scope after rollback too.\n\n  try:\n      with context.session.begin...:\n          ...\n  except db_exc.DBDuplicateEntry:\n      bound_agents.remove(agent)\n      ...\n\nI\u0027m really not a fan of explicit commit/rollback when there is a better pattern.  But, I might be missing something subtle.  Let me know.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"5c8223784f57e4faa61ee2dd6fcbeccadc493122","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":36,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":37,"context_line":"        for agent in agents:"},{"line_number":38,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":39,"context_line":"            # saving agent_id to use it after rollback to avoid"},{"line_number":40,"context_line":"            # DetachedInstanceError"},{"line_number":41,"context_line":"            agent_id \u003d agent.id"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_dbb144e1","line":38,"range":{"start_line":38,"start_character":12,"end_line":38,"end_character":55},"in_reply_to":"5a5ae5dd_e7a11a95","updated":"2016-02-08 21:27:45.000000000","message":"Yuck.  ok","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":36,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":37,"context_line":"        for agent in agents:"},{"line_number":38,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":39,"context_line":"            # saving agent_id to use it after rollback to avoid"},{"line_number":40,"context_line":"            # DetachedInstanceError"},{"line_number":41,"context_line":"            agent_id \u003d agent.id"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_e7a11a95","line":38,"range":{"start_line":38,"start_character":12,"end_line":38,"end_character":55},"in_reply_to":"fa69d971_d83b6437","updated":"2016-02-08 15:16:21.000000000","message":"Just followed the same patter as DHCP  https://github.com/openstack/neutron/blob/master/neutron/scheduler/dhcp_agent_scheduler.py#L139","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            except db_exc.DBDuplicateEntry:"},{"line_number":49,"context_line":"                # it\u0027s totally ok, someone just did our job!"},{"line_number":50,"context_line":"                context.session.rollback()"},{"line_number":51,"context_line":"                bound_agents.remove(agent)"},{"line_number":52,"context_line":"                LOG.info(_LI(\u0027BgpDrAgent %s already present\u0027), agent_id)"},{"line_number":53,"context_line":"            LOG.debug(\u0027BgpSpeaker %(bgp_speaker_id)s is scheduled to be \u0027"},{"line_number":54,"context_line":"                      \u0027hosted by BgpDrAgent %(agent_id)s\u0027,"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_731cd96a","line":51,"range":{"start_line":51,"start_character":16,"end_line":51,"end_character":42},"updated":"2016-01-08 19:18:55.000000000","message":"See my comment on L36.  This feels backwards.  It feels like you should be building up a new list to pass to super on L57 instead of modifying the original list.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            except db_exc.DBDuplicateEntry:"},{"line_number":49,"context_line":"                # it\u0027s totally ok, someone just did our job!"},{"line_number":50,"context_line":"                context.session.rollback()"},{"line_number":51,"context_line":"                bound_agents.remove(agent)"},{"line_number":52,"context_line":"                LOG.info(_LI(\u0027BgpDrAgent %s already present\u0027), agent_id)"},{"line_number":53,"context_line":"            LOG.debug(\u0027BgpSpeaker %(bgp_speaker_id)s is scheduled to be \u0027"},{"line_number":54,"context_line":"                      \u0027hosted by BgpDrAgent %(agent_id)s\u0027,"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_07af967d","line":51,"range":{"start_line":51,"start_character":16,"end_line":51,"end_character":42},"in_reply_to":"fa69d971_731cd96a","updated":"2016-02-08 15:16:21.000000000","message":"Replied @L36","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        \"\"\"Return the agents that can host the BgpSpeaker.\"\"\""},{"line_number":62,"context_line":"        agents_dict \u003d self._get_bgp_speaker_hostable_dragents("},{"line_number":63,"context_line":"            plugin, context, bgp_speaker)"},{"line_number":64,"context_line":"        if not agents_dict[\u0027hostable_agents\u0027] or agents_dict[\u0027n_agents\u0027] \u003c\u003d 0:"},{"line_number":65,"context_line":"            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}"},{"line_number":66,"context_line":"        return agents_dict"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _get_active_dragents(self, plugin, context):"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_f35689cd","line":65,"range":{"start_line":64,"start_character":8,"end_line":65,"end_character":57},"updated":"2016-01-08 19:18:55.000000000","message":"I\u0027m curious, what are you going for here?  Why would n_agents be \u003c 0?  Is there a change that agents_dict[\u0027hostable_agent\u0027] might be something other than an empty list (and evaluate to False)?","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                    \u0027agent_type\u0027: [constants.AGENT_TYPE_BGP_ROUTING],"},{"line_number":74,"context_line":"                    \u0027admin_state_up\u0027: [True]})"},{"line_number":75,"context_line":"            if not active_dragents:"},{"line_number":76,"context_line":"                LOG.warn(_LW(\u0027No more BgpDrAgents\u0027))"},{"line_number":77,"context_line":"                return []"},{"line_number":78,"context_line":"        return active_dragents"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_935e2d11","line":76,"updated":"2016-01-08 19:18:55.000000000","message":"I\u0027m not sure why this constitutes a warning in this context.  Why should the getter warn about none being there?  Shouldn\u0027t it be the caller that knows if an empty list of agents is a problem or not?\n\nThis seems like it should be a dumb getter and not try to determine if an empty list is a problem or not.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                    \u0027agent_type\u0027: [constants.AGENT_TYPE_BGP_ROUTING],"},{"line_number":74,"context_line":"                    \u0027admin_state_up\u0027: [True]})"},{"line_number":75,"context_line":"            if not active_dragents:"},{"line_number":76,"context_line":"                LOG.warn(_LW(\u0027No more BgpDrAgents\u0027))"},{"line_number":77,"context_line":"                return []"},{"line_number":78,"context_line":"        return active_dragents"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_47158e99","line":76,"in_reply_to":"fa69d971_935e2d11","updated":"2016-02-08 15:16:21.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        dragents \u003d [dragent_binding.agent_id"},{"line_number":83,"context_line":"                    for dragent_binding in dragent_bindings"},{"line_number":84,"context_line":"                    if dragent_binding.bgp_speaker_id \u003d\u003d bgp_speaker_id]"},{"line_number":85,"context_line":"        return len(dragents)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_bgp_speaker_hostable_dragents(self, plugin, context, bgp_speaker):"},{"line_number":88,"context_line":"        \"\"\"Return number of BgpDrAgents which will actually host the given"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_d8f5a4cb","line":85,"range":{"start_line":85,"start_character":15,"end_line":85,"end_character":28},"updated":"2016-01-08 19:18:55.000000000","message":"nit:  Seems a bit wasteful to generate a list just to count its elements.  Maybe something like this:\n\n  return sum(1 if dragent_binding.bgp_speaker_id \u003d\u003d bgp_speaker_id else 0\n      for dragent_binding in dragent_bindings.\n\nThe above should avoid generating the list and just walk the original iterator.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        dragents \u003d [dragent_binding.agent_id"},{"line_number":83,"context_line":"                    for dragent_binding in dragent_bindings"},{"line_number":84,"context_line":"                    if dragent_binding.bgp_speaker_id \u003d\u003d bgp_speaker_id]"},{"line_number":85,"context_line":"        return len(dragents)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_bgp_speaker_hostable_dragents(self, plugin, context, bgp_speaker):"},{"line_number":88,"context_line":"        \"\"\"Return number of BgpDrAgents which will actually host the given"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_6a372fff","line":85,"range":{"start_line":85,"start_character":15,"end_line":85,"end_character":28},"in_reply_to":"fa69d971_d8f5a4cb","updated":"2016-02-08 15:16:21.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return len(dragents)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_bgp_speaker_hostable_dragents(self, plugin, context, bgp_speaker):"},{"line_number":88,"context_line":"        \"\"\"Return number of BgpDrAgents which will actually host the given"},{"line_number":89,"context_line":"           BgpSpeaker and a list of BgpDrAgents which can host the given"},{"line_number":90,"context_line":"           BgpSpeaker"},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_73fb7948","line":88,"range":{"start_line":88,"start_character":25,"end_line":88,"end_character":39},"updated":"2016-01-08 19:18:55.000000000","message":"*of additional BgpDrAgents\n\nI say this because it appears there could already be some agents hosting it and the number returned represents the number of additional agents.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return len(dragents)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_bgp_speaker_hostable_dragents(self, plugin, context, bgp_speaker):"},{"line_number":88,"context_line":"        \"\"\"Return number of BgpDrAgents which will actually host the given"},{"line_number":89,"context_line":"           BgpSpeaker and a list of BgpDrAgents which can host the given"},{"line_number":90,"context_line":"           BgpSpeaker"},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_6a1e4f71","line":88,"range":{"start_line":88,"start_character":25,"end_line":88,"end_character":39},"in_reply_to":"fa69d971_73fb7948","updated":"2016-02-08 15:16:21.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":90,"context_line":"           BgpSpeaker"},{"line_number":91,"context_line":"        \"\"\""},{"line_number":92,"context_line":"        # only one BgpSpeaker can be hosted by a BgpDrAgent for now."},{"line_number":93,"context_line":"        dragents_per_bgp_speaker \u003d 1"},{"line_number":94,"context_line":"        dragent_bindings \u003d plugin.get_dragent_bgp_speaker_bindings(context)"},{"line_number":95,"context_line":"        agents_hosting \u003d [dragent_binding.agent_id"},{"line_number":96,"context_line":"                          for dragent_binding in dragent_bindings]"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_332bc135","line":93,"range":{"start_line":93,"start_character":35,"end_line":93,"end_character":36},"updated":"2016-01-08 19:18:55.000000000","message":"This should be a constant.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"           BgpSpeaker"},{"line_number":91,"context_line":"        \"\"\""},{"line_number":92,"context_line":"        # only one BgpSpeaker can be hosted by a BgpDrAgent for now."},{"line_number":93,"context_line":"        dragents_per_bgp_speaker \u003d 1"},{"line_number":94,"context_line":"        dragent_bindings \u003d plugin.get_dragent_bgp_speaker_bindings(context)"},{"line_number":95,"context_line":"        agents_hosting \u003d [dragent_binding.agent_id"},{"line_number":96,"context_line":"                          for dragent_binding in dragent_bindings]"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_3bd72fef","line":93,"range":{"start_line":93,"start_character":35,"end_line":93,"end_character":36},"in_reply_to":"fa69d971_332bc135","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        active_dragents \u003d self._get_active_dragents(plugin, context)"},{"line_number":106,"context_line":"        if not active_dragents:"},{"line_number":107,"context_line":"            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        hostable_dragents \u003d ["},{"line_number":110,"context_line":"            agent for agent in set(active_dragents)"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_734db9c3","line":107,"range":{"start_line":106,"start_character":8,"end_line":107,"end_character":57},"updated":"2016-01-08 19:18:55.000000000","message":"This whole check is redundant.  If this is empty then hostable_dragents will be empty.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        active_dragents \u003d self._get_active_dragents(plugin, context)"},{"line_number":106,"context_line":"        if not active_dragents:"},{"line_number":107,"context_line":"            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        hostable_dragents \u003d ["},{"line_number":110,"context_line":"            agent for agent in set(active_dragents)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_35f51cec","line":107,"range":{"start_line":106,"start_character":8,"end_line":107,"end_character":57},"in_reply_to":"fa69d971_734db9c3","updated":"2016-02-08 15:16:21.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        hostable_dragents \u003d ["},{"line_number":110,"context_line":"            agent for agent in set(active_dragents)"},{"line_number":111,"context_line":"            if agent.id not in agents_hosting and plugin.is_eligible_agent("},{"line_number":112,"context_line":"                True, agent)"},{"line_number":113,"context_line":"        ]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        if not hostable_dragents:"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_53baf5c1","line":112,"range":{"start_line":112,"start_character":16,"end_line":112,"end_character":20},"updated":"2016-01-08 19:18:55.000000000","message":"Try to avoid passing hard-coded magic values to a method without the context to know what it means.  Otherwise, I have to go look up the method to see what argument you\u0027re passing True for.\n\nThis would help:\n\n  ....is_eligible_agent(active\u003dTrue, agent\u003dagent)\n\nIf you swapped the order of the arguments, you could call like this:\n\n  ....is_eligible_agent(agent, active\u003dTrue)","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        hostable_dragents \u003d ["},{"line_number":110,"context_line":"            agent for agent in set(active_dragents)"},{"line_number":111,"context_line":"            if agent.id not in agents_hosting and plugin.is_eligible_agent("},{"line_number":112,"context_line":"                True, agent)"},{"line_number":113,"context_line":"        ]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        if not hostable_dragents:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_753714ff","line":112,"range":{"start_line":112,"start_character":16,"end_line":112,"end_character":20},"in_reply_to":"fa69d971_53baf5c1","updated":"2016-02-08 15:16:21.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"class BgpDrAgentSchedulerBase(BgpDrAgentFilter):"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":124,"context_line":"        \"\"\"Schedule non-hosted BgpSpeaker to a BgpDrAgent."},{"line_number":125,"context_line":"        \"\"\""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_8eb5a232","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":13},"updated":"2016-01-08 19:18:55.000000000","message":"What is \"auto\" about this method?  Maybe a better name would be:\n\n  schedule_unscheduled_bpg_speakers_to_host\n\n... or something like that.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"class BgpDrAgentSchedulerBase(BgpDrAgentFilter):"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":124,"context_line":"        \"\"\"Schedule non-hosted BgpSpeaker to a BgpDrAgent."},{"line_number":125,"context_line":"        \"\"\""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_75663452","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":13},"in_reply_to":"fa69d971_8eb5a232","updated":"2016-02-08 15:16:21.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e79672f2f8c43139d1c18f280f4528a95e323376","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"class BgpDrAgentSchedulerBase(BgpDrAgentFilter):"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":124,"context_line":"        \"\"\"Schedule non-hosted BgpSpeaker to a BgpDrAgent."},{"line_number":125,"context_line":"        \"\"\""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_e03ba6cf","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":13},"in_reply_to":"fa69d971_8eb5a232","updated":"2016-01-09 04:02:42.000000000","message":"ok","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                LOG.warn(_LW(\u0027BgpDrAgent %s is down\u0027), bgp_dragent.id)"},{"line_number":143,"context_line":"                return False"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            if self._is_bgp_speaker_hosted(context, bgp_dragent[\u0027id\u0027]):"},{"line_number":146,"context_line":"                # One BgpDrAgent can only host one BGP speaker"},{"line_number":147,"context_line":"                LOG.debug(\u0027BgpDrAgent already hosting a speaker on host %s. \u0027"},{"line_number":148,"context_line":"                          \u0027Cannot schedule an another one\u0027, host)"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_2ee83616","line":145,"range":{"start_line":145,"start_character":20,"end_line":145,"end_character":42},"updated":"2016-01-08 19:18:55.000000000","message":"Could this be joined into the original query to avoid a second round-trip to the db?","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"5c8223784f57e4faa61ee2dd6fcbeccadc493122","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                LOG.warn(_LW(\u0027BgpDrAgent %s is down\u0027), bgp_dragent.id)"},{"line_number":143,"context_line":"                return False"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            if self._is_bgp_speaker_hosted(context, bgp_dragent[\u0027id\u0027]):"},{"line_number":146,"context_line":"                # One BgpDrAgent can only host one BGP speaker"},{"line_number":147,"context_line":"                LOG.debug(\u0027BgpDrAgent already hosting a speaker on host %s. \u0027"},{"line_number":148,"context_line":"                          \u0027Cannot schedule an another one\u0027, host)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_5b1474e7","line":145,"range":{"start_line":145,"start_character":20,"end_line":145,"end_character":42},"in_reply_to":"5a5ae5dd_908f3e74","updated":"2016-02-08 21:27:45.000000000","message":"What?  There\u0027s still just one db, right?","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                LOG.warn(_LW(\u0027BgpDrAgent %s is down\u0027), bgp_dragent.id)"},{"line_number":143,"context_line":"                return False"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            if self._is_bgp_speaker_hosted(context, bgp_dragent[\u0027id\u0027]):"},{"line_number":146,"context_line":"                # One BgpDrAgent can only host one BGP speaker"},{"line_number":147,"context_line":"                LOG.debug(\u0027BgpDrAgent already hosting a speaker on host %s. \u0027"},{"line_number":148,"context_line":"                          \u0027Cannot schedule an another one\u0027, host)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_908f3e74","line":145,"range":{"start_line":145,"start_character":20,"end_line":145,"end_character":42},"in_reply_to":"fa69d971_2ee83616","updated":"2016-02-08 15:16:21.000000000","message":"Different DB\u0027s are queried","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"c4016479ed67e3cbdeb90019acf41b28be9d8900","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                return False"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            if self._is_bgp_speaker_hosted(context, bgp_dragent[\u0027id\u0027]):"},{"line_number":146,"context_line":"                # One BgpDrAgent can only host one BGP speaker"},{"line_number":147,"context_line":"                LOG.debug(\u0027BgpDrAgent already hosting a speaker on host %s. \u0027"},{"line_number":148,"context_line":"                          \u0027Cannot schedule an another one\u0027, host)"},{"line_number":149,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_14b0c78a","line":146,"range":{"start_line":146,"start_character":55,"end_line":146,"end_character":62},"updated":"2016-01-08 04:41:10.000000000","message":"If one dragent can only host one bgp speaker, what the function BgpDriverBase.is_multi_bgp_speaker_supported is used for?","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"492b6221f66be8a1952f8448df9090c9c1385532","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                return False"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            if self._is_bgp_speaker_hosted(context, bgp_dragent[\u0027id\u0027]):"},{"line_number":146,"context_line":"                # One BgpDrAgent can only host one BGP speaker"},{"line_number":147,"context_line":"                LOG.debug(\u0027BgpDrAgent already hosting a speaker on host %s. \u0027"},{"line_number":148,"context_line":"                          \u0027Cannot schedule an another one\u0027, host)"},{"line_number":149,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":37,"id":"5a5ae5dd_50d30660","line":146,"range":{"start_line":146,"start_character":55,"end_line":146,"end_character":62},"in_reply_to":"fa69d971_14b0c78a","updated":"2016-02-08 15:16:21.000000000","message":"It\u0027s being removed.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_60709d0b","line":1,"updated":"2016-01-26 05:51:47.000000000","message":"2016","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import agents_db"},{"line_number":23,"context_line":"from neutron.db import bgp_db"},{"line_number":24,"context_line":"from neutron.db import bgp_dragentscheduler_db as bgp_dras_db"},{"line_number":25,"context_line":"from neutron.i18n import _LI, _LW"},{"line_number":26,"context_line":"from neutron.scheduler import base_resource_filter"},{"line_number":27,"context_line":"from neutron.scheduler import base_scheduler"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_e0624d3d","line":25,"updated":"2016-01-26 05:51:47.000000000","message":"use _i18n instead of i18n","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"}],"neutron/common/constants.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bbd1f5a7ba975acd38ed800955e24d0c820e9c9a","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"FLOODING_ENTRY \u003d (\u002700:00:00:00:00:00\u0027, \u00270.0.0.0\u0027)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"AGENT_TYPE_BGP_ROUTING \u003d \u0027BGP dynamic routing agent\u0027"},{"line_number":102,"context_line":"AGENT_TYPE_DHCP \u003d \u0027DHCP agent\u0027"},{"line_number":103,"context_line":"AGENT_TYPE_OVS \u003d \u0027Open vSwitch agent\u0027"},{"line_number":104,"context_line":"AGENT_TYPE_LINUXBRIDGE \u003d \u0027Linux bridge agent\u0027"}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_a26527e2","line":101,"updated":"2016-02-03 06:33:42.000000000","message":"these string literals should go closer to the bgp module.","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4556d3decbe9d5484c1519445940e7f70d664651","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"FLOODING_ENTRY \u003d (\u002700:00:00:00:00:00\u0027, \u00270.0.0.0\u0027)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"AGENT_TYPE_BGP_ROUTING \u003d \u0027BGP dynamic routing agent\u0027"},{"line_number":102,"context_line":"AGENT_TYPE_DHCP \u003d \u0027DHCP agent\u0027"},{"line_number":103,"context_line":"AGENT_TYPE_OVS \u003d \u0027Open vSwitch agent\u0027"},{"line_number":104,"context_line":"AGENT_TYPE_LINUXBRIDGE \u003d \u0027Linux bridge agent\u0027"}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_9e1e766e","line":101,"in_reply_to":"5a5ae5dd_0cae9b2e","updated":"2016-02-08 12:30:09.000000000","message":"Done","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f0d5b5a2db92586dc0f3591497b26d45219b3e4c","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"FLOODING_ENTRY \u003d (\u002700:00:00:00:00:00\u0027, \u00270.0.0.0\u0027)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"AGENT_TYPE_BGP_ROUTING \u003d \u0027BGP dynamic routing agent\u0027"},{"line_number":102,"context_line":"AGENT_TYPE_DHCP \u003d \u0027DHCP agent\u0027"},{"line_number":103,"context_line":"AGENT_TYPE_OVS \u003d \u0027Open vSwitch agent\u0027"},{"line_number":104,"context_line":"AGENT_TYPE_LINUXBRIDGE \u003d \u0027Linux bridge agent\u0027"}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_0cae9b2e","line":101,"in_reply_to":"5a5ae5dd_a26527e2","updated":"2016-02-03 14:01:52.000000000","message":"you want us to define it inside services/bgp/ folder?","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"}],"neutron/common/topics.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb77514ef9d65a516872e3d38648e6836619a34f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"FIREWALL_PLUGIN \u003d \u0027q-firewall-plugin\u0027"},{"line_number":33,"context_line":"METERING_PLUGIN \u003d \u0027q-metering-plugin\u0027"},{"line_number":34,"context_line":"LOADBALANCER_PLUGIN \u003d \u0027n-lbaas-plugin\u0027"},{"line_number":35,"context_line":"BGP_SPEAKER_PLUGIN \u003d \u0027n-bgp-speaker-plugin\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"},{"line_number":38,"context_line":"DHCP_AGENT \u003d \u0027dhcp_agent\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba15a1d1_11a285ae","line":35,"updated":"2015-09-24 07:23:24.000000000","message":"I feel we can rename the plugin as \u0027BGP_PLUGIN\u0027, \u0027n-bgp-plugin\u0027","commit_id":"df0d32089960cf18849cffad39be8f89ad292c4f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REPORTS \u003d \u0027q-reports-plugin\u0027"},{"line_number":32,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":33,"context_line":"METERING_PLUGIN \u003d \u0027q-metering-plugin\u0027"},{"line_number":34,"context_line":"BGP_PLUGIN \u003d \u0027n-bgp-plugin\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"},{"line_number":37,"context_line":"DHCP_AGENT \u003d \u0027dhcp_agent\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_4903240e","line":34,"range":{"start_line":34,"start_character":14,"end_line":34,"end_character":16},"updated":"2016-01-08 19:18:55.000000000","message":"This should still be q-.  n- means nova.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e79672f2f8c43139d1c18f280f4528a95e323376","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REPORTS \u003d \u0027q-reports-plugin\u0027"},{"line_number":32,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":33,"context_line":"METERING_PLUGIN \u003d \u0027q-metering-plugin\u0027"},{"line_number":34,"context_line":"BGP_PLUGIN \u003d \u0027n-bgp-plugin\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"},{"line_number":37,"context_line":"DHCP_AGENT \u003d \u0027dhcp_agent\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_c02ea28b","line":34,"range":{"start_line":34,"start_character":14,"end_line":34,"end_character":16},"in_reply_to":"fa69d971_4903240e","updated":"2016-01-09 04:02:42.000000000","message":"+1000. You really got good pair of eyes.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REPORTS \u003d \u0027q-reports-plugin\u0027"},{"line_number":32,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":33,"context_line":"METERING_PLUGIN \u003d \u0027q-metering-plugin\u0027"},{"line_number":34,"context_line":"BGP_PLUGIN \u003d \u0027n-bgp-plugin\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"},{"line_number":37,"context_line":"DHCP_AGENT \u003d \u0027dhcp_agent\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_1bc34b3a","line":34,"range":{"start_line":34,"start_character":14,"end_line":34,"end_character":16},"in_reply_to":"fa69d971_c02ea28b","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REPORTS \u003d \u0027q-reports-plugin\u0027"},{"line_number":32,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":33,"context_line":"METERING_PLUGIN \u003d \u0027q-metering-plugin\u0027"},{"line_number":34,"context_line":"LOADBALANCER_PLUGIN \u003d \u0027n-lbaas-plugin\u0027"},{"line_number":35,"context_line":"BGP_PLUGIN \u003d \u0027n-bgp-plugin\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_a058d58a","line":34,"updated":"2016-01-26 05:51:47.000000000","message":"un-related change. Plz remove.","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":33,"context_line":"METERING_PLUGIN \u003d \u0027q-metering-plugin\u0027"},{"line_number":34,"context_line":"LOADBALANCER_PLUGIN \u003d \u0027n-lbaas-plugin\u0027"},{"line_number":35,"context_line":"BGP_PLUGIN \u003d \u0027n-bgp-plugin\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"},{"line_number":38,"context_line":"DHCP_AGENT \u003d \u0027dhcp_agent\u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_c05b8984","line":35,"updated":"2016-01-26 05:51:47.000000000","message":"should be q-bgp-plugin","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bbd1f5a7ba975acd38ed800955e24d0c820e9c9a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REPORTS \u003d \u0027q-reports-plugin\u0027"},{"line_number":32,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":33,"context_line":"METERING_PLUGIN \u003d \u0027q-metering-plugin\u0027"},{"line_number":34,"context_line":"BGP_PLUGIN \u003d \u0027q-bgp-plugin\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"},{"line_number":37,"context_line":"DHCP_AGENT \u003d \u0027dhcp_agent\u0027"}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_029bdbca","line":34,"updated":"2016-02-03 06:33:42.000000000","message":"ditto","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4556d3decbe9d5484c1519445940e7f70d664651","unresolved":false,"context_lines":[{"line_number":31,"context_line":"REPORTS \u003d \u0027q-reports-plugin\u0027"},{"line_number":32,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":33,"context_line":"METERING_PLUGIN \u003d \u0027q-metering-plugin\u0027"},{"line_number":34,"context_line":"BGP_PLUGIN \u003d \u0027q-bgp-plugin\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"},{"line_number":37,"context_line":"DHCP_AGENT \u003d \u0027dhcp_agent\u0027"}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_de006e04","line":34,"in_reply_to":"5a5ae5dd_029bdbca","updated":"2016-02-08 12:30:09.000000000","message":"Done","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"}],"neutron/db/bgp/bgp_dragentscheduler_db.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"130b028e9b0e68b7c5afadea33963d2782a50956","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":85,"context_line":"                raise bgp_dras_ext.DrAgentInvalid(id\u003dagent_id)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"},{"line_number":88,"context_line":"            query \u003d query.filter_by(agent_id\u003dagent_id)"},{"line_number":89,"context_line":"            try:"},{"line_number":90,"context_line":"                binding \u003d query.one()"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a1a9d01_8c445c1b","line":87,"updated":"2015-09-29 13:42:57.000000000","message":"Why don\u0027t call the \u0027bind\u0027 method of the bgp_drscheduler here? I understand this method is the standard way to associate a bgp speaker to an agent in database. Behaviour should be the same","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"130b028e9b0e68b7c5afadea33963d2782a50956","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                      {\u0027bgp_speaker_id\u0027: speaker_id,"},{"line_number":126,"context_line":"                       \u0027agent_id\u0027: agent_id})"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def get_dragents_hosting_bgp_speakers(self, context, bgp_speaker_ids,"},{"line_number":129,"context_line":"                                          active\u003dNone, admin_state_up\u003dNone):"},{"line_number":130,"context_line":"        query \u003d context.session.query(BgpSpeakerDrAgentBinding)"},{"line_number":131,"context_line":"        query \u003d query.options(orm.contains_eager("}],"source_content_type":"text/x-python","patch_set":24,"id":"9a1a9d01_6c9d4809","line":128,"updated":"2015-09-29 13:42:57.000000000","message":"set this method private: _get_dragent_...","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"}],"neutron/db/bgp/bgp_dragentschedulers_db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb77514ef9d65a516872e3d38648e6836619a34f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":12,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"# under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_log import helpers as log_helpers"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba15a1d1_7671770b","line":14,"updated":"2015-09-24 07:23:24.000000000","message":"How about renaming it to \u0027bgp_dragentscheduler_db.py\u0027? \u0027schedulers\u0027 sounds little odd.","commit_id":"df0d32089960cf18849cffad39be8f89ad292c4f"}],"neutron/db/bgp_dragentscheduler_db.py":[{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"c26da8e7abf0ec6fe65fd5037bfe76c39d27e2e2","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        return [binding.dragent"},{"line_number":147,"context_line":"                for binding in query"},{"line_number":148,"context_line":"                if self.is_eligible_agent(active,"},{"line_number":149,"context_line":"                                          binding.dragent)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def get_dragent_bgp_speaker_bindings(self, context):"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a8ffd7b_f896dcee","line":148,"updated":"2015-11-27 06:33:11.000000000","message":"is_eligible_agent is staticmethod, should call by as_db.AgentSchedulerDbMixin.is_eligible_agent","commit_id":"6db462c543f8856e5938456aea31f8f73c1a22bb"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"c0c0587a77004111fb3384c8a482ac0a1412caa5","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        return [binding.dragent"},{"line_number":147,"context_line":"                for binding in query"},{"line_number":148,"context_line":"                if self.is_eligible_agent(active,"},{"line_number":149,"context_line":"                                          binding.dragent)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def get_dragent_bgp_speaker_bindings(self, context):"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a7e1126_321da10f","line":148,"range":{"start_line":148,"start_character":24,"end_line":148,"end_character":41},"updated":"2015-12-18 02:03:31.000000000","message":"is_eligible_agent is staticmethod, should call by as_db.AgentSchedulerDbMixin.is_eligible_agent, I comment this in patch set 29, pls address this comment.","commit_id":"91845a3d443b217b5b33559a3a11c4906361078c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4e6c6603640ca98206ea0a0579852c4c37c1cdb9","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        return [binding.dragent"},{"line_number":147,"context_line":"                for binding in query"},{"line_number":148,"context_line":"                if self.is_eligible_agent(active,"},{"line_number":149,"context_line":"                                          binding.dragent)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def get_dragent_bgp_speaker_bindings(self, context):"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a7e1126_14f05866","line":148,"range":{"start_line":148,"start_character":24,"end_line":148,"end_character":41},"in_reply_to":"3a7e1126_321da10f","updated":"2015-12-19 10:42:49.000000000","message":"ok","commit_id":"91845a3d443b217b5b33559a3a11c4906361078c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"57023c7aabaf3d27a919be76d61b6b607486032f","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        return [binding.dragent"},{"line_number":147,"context_line":"                for binding in query"},{"line_number":148,"context_line":"                if self.is_eligible_agent(active,"},{"line_number":149,"context_line":"                                          binding.dragent)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def get_dragent_bgp_speaker_bindings(self, context):"}],"source_content_type":"text/x-python","patch_set":32,"id":"fa69d971_beda2377","line":148,"updated":"2015-12-30 08:56:31.000000000","message":"Plz address Na Zhu\u0027s comment: \n\n\"is_eligible_agent is staticmethod, should call by as_db.AgentSchedulerDbMixin.is_eligible_agent, I comment this in patch set 29, pls address this comment.\"\n\nSorry for not addressing this in this PS.","commit_id":"41af9798cf339d41a8fd05bc70f70f870919596e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c853e01615e8a988ee01c758a1d9e3dcc81b677","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_bb868e63","line":1,"updated":"2016-01-08 03:49:27.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    bgp_drscheduler \u003d None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @log_helpers.log_method_call"},{"line_number":68,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":69,"context_line":"        if self.bgp_drscheduler:"},{"line_number":70,"context_line":"            return self.bgp_drscheduler.auto_schedule_bgp_speakers("}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_89303cea","line":67,"range":{"start_line":67,"start_character":4,"end_line":67,"end_character":32},"updated":"2016-01-08 19:18:55.000000000","message":"Do you intend to leave these permanently (i.e. merge with this in)?","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e79672f2f8c43139d1c18f280f4528a95e323376","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    bgp_drscheduler \u003d None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @log_helpers.log_method_call"},{"line_number":68,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":69,"context_line":"        if self.bgp_drscheduler:"},{"line_number":70,"context_line":"            return self.bgp_drscheduler.auto_schedule_bgp_speakers("}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_40595234","line":67,"range":{"start_line":67,"start_character":4,"end_line":67,"end_character":32},"in_reply_to":"fa69d971_89303cea","updated":"2016-01-09 04:02:42.000000000","message":"Atleast we can keep these for a cycle and then remove it off.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    bgp_drscheduler \u003d None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @log_helpers.log_method_call"},{"line_number":68,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":69,"context_line":"        if self.bgp_drscheduler:"},{"line_number":70,"context_line":"            return self.bgp_drscheduler.auto_schedule_bgp_speakers("}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_9b1e5b5e","line":67,"range":{"start_line":67,"start_character":4,"end_line":67,"end_character":32},"in_reply_to":"fa69d971_89303cea","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \"\"\"Associate a BgpDrAgent with a BgpSpeaker.\"\"\""},{"line_number":81,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":82,"context_line":"            agent_db \u003d self._get_agent(context, agent_id)"},{"line_number":83,"context_line":"            if (agent_db[\u0027agent_type\u0027] !\u003d constants.AGENT_TYPE_BGP_ROUTING"},{"line_number":84,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":85,"context_line":"                raise bgp_dras_ext.DrAgentInvalid(id\u003dagent_id)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_69b8682b","line":84,"range":{"start_line":83,"start_character":15,"end_line":84,"end_character":54},"updated":"2016-01-08 19:18:55.000000000","message":"Any time an if condition wraps, I wonder if a local variable should be introduced to avoid the wrap and to self-document what the condition is.\n\n  agent_up \u003d agent_db[\u0027admin_state_up\u0027]\n  is_agent_bgp \u003d agent_db[\u0027agent_type\u0027] \u003d\u003d constants.AGENT_TYPE_BGP_ROUTING\n  if not is_agent_bgp or not agent_up:\n\nI guess I just don\u0027t like wrapping control statements if it can be avoided.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \"\"\"Associate a BgpDrAgent with a BgpSpeaker.\"\"\""},{"line_number":81,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":82,"context_line":"            agent_db \u003d self._get_agent(context, agent_id)"},{"line_number":83,"context_line":"            if (agent_db[\u0027agent_type\u0027] !\u003d constants.AGENT_TYPE_BGP_ROUTING"},{"line_number":84,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":85,"context_line":"                raise bgp_dras_ext.DrAgentInvalid(id\u003dagent_id)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_5baea3e8","line":84,"range":{"start_line":83,"start_character":15,"end_line":84,"end_character":54},"in_reply_to":"fa69d971_69b8682b","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e79672f2f8c43139d1c18f280f4528a95e323376","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \"\"\"Associate a BgpDrAgent with a BgpSpeaker.\"\"\""},{"line_number":81,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":82,"context_line":"            agent_db \u003d self._get_agent(context, agent_id)"},{"line_number":83,"context_line":"            if (agent_db[\u0027agent_type\u0027] !\u003d constants.AGENT_TYPE_BGP_ROUTING"},{"line_number":84,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":85,"context_line":"                raise bgp_dras_ext.DrAgentInvalid(id\u003dagent_id)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_407072a4","line":84,"range":{"start_line":83,"start_character":15,"end_line":84,"end_character":54},"in_reply_to":"fa69d971_69b8682b","updated":"2016-01-09 04:02:42.000000000","message":"ok","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"},{"line_number":88,"context_line":"            query \u003d query.filter_by(agent_id\u003dagent_id)"},{"line_number":89,"context_line":"            try:"},{"line_number":90,"context_line":"                binding \u003d query.one()"},{"line_number":91,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":92,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":93,"context_line":"            except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_69194822","line":90,"range":{"start_line":90,"start_character":16,"end_line":90,"end_character":37},"updated":"2016-01-08 19:18:55.000000000","message":"Why are you querying here.  I think it would be better to have the proper constraints in the DB to reject the add on L99 if a record already exists in the binding.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e79672f2f8c43139d1c18f280f4528a95e323376","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"},{"line_number":88,"context_line":"            query \u003d query.filter_by(agent_id\u003dagent_id)"},{"line_number":89,"context_line":"            try:"},{"line_number":90,"context_line":"                binding \u003d query.one()"},{"line_number":91,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":92,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":93,"context_line":"            except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_e06966bf","line":90,"range":{"start_line":90,"start_character":16,"end_line":90,"end_character":37},"in_reply_to":"fa69d971_69194822","updated":"2016-01-09 04:02:42.000000000","message":"ok","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            query \u003d query.filter_by(agent_id\u003dagent_id)"},{"line_number":89,"context_line":"            try:"},{"line_number":90,"context_line":"                binding \u003d query.one()"},{"line_number":91,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":92,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":93,"context_line":"            except exc.NoResultFound:"},{"line_number":94,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_295d90ec","line":91,"range":{"start_line":91,"start_character":16,"end_line":91,"end_character":21},"updated":"2016-01-08 19:18:55.000000000","message":"I\u0027m not thrilling about this pattern.  I\u0027d rather see:\n\n  binding \u003d query.first()\n  if binding is None:\n       raise ...\n\nI\u0027m in the \"exceptions should be used for exceptional conditions\" camp.  I don\u0027t think exceptions should be used for expected conditions.  But, see my comment on L99.  I don\u0027t think either of these should be used?","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            binding \u003d BgpSpeakerDrAgentBinding()"},{"line_number":97,"context_line":"            binding.bgp_speaker_id \u003d speaker_id"},{"line_number":98,"context_line":"            binding.agent_id \u003d agent_id"},{"line_number":99,"context_line":"            context.session.add(binding)"},{"line_number":100,"context_line":"            LOG.debug(\u0027BgpSpeaker %(bgp_speaker_id)s added to \u0027"},{"line_number":101,"context_line":"                      \u0027BgpDrAgent %(agent_id)s\u0027,"},{"line_number":102,"context_line":"                      {\u0027bgp_speaker_id\u0027: speaker_id,"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_09e1acfe","line":99,"range":{"start_line":99,"start_character":12,"end_line":99,"end_character":40},"updated":"2016-01-08 19:18:55.000000000","message":"This should raise an exception if it is a duplicate rendering L87-94 completely unnecessary.  I personally prefer this approach strongly.  See also my comment on L90.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    def remove_bgp_speaker_from_dragent(self, context, agent_id, speaker_id):"},{"line_number":107,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":108,"context_line":"            agent_db \u003d self._get_agent(context, agent_id)"},{"line_number":109,"context_line":"            if (agent_db[\u0027agent_type\u0027] !\u003d constants.AGENT_TYPE_BGP_ROUTING"},{"line_number":110,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":111,"context_line":"                raise bgp_dras_ext.DrAgentInvalid(id\u003dagent_id)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_ecc9c35b","line":110,"range":{"start_line":109,"start_character":15,"end_line":110,"end_character":54},"updated":"2016-01-08 19:18:55.000000000","message":"ditto (L83)","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    def remove_bgp_speaker_from_dragent(self, context, agent_id, speaker_id):"},{"line_number":107,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":108,"context_line":"            agent_db \u003d self._get_agent(context, agent_id)"},{"line_number":109,"context_line":"            if (agent_db[\u0027agent_type\u0027] !\u003d constants.AGENT_TYPE_BGP_ROUTING"},{"line_number":110,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":111,"context_line":"                raise bgp_dras_ext.DrAgentInvalid(id\u003dagent_id)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_3bb5ef30","line":110,"range":{"start_line":109,"start_character":15,"end_line":110,"end_character":54},"in_reply_to":"fa69d971_ecc9c35b","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"c4016479ed67e3cbdeb90019acf41b28be9d8900","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            agent_db \u003d self._get_agent(context, agent_id)"},{"line_number":109,"context_line":"            if (agent_db[\u0027agent_type\u0027] !\u003d constants.AGENT_TYPE_BGP_ROUTING"},{"line_number":110,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":111,"context_line":"                raise bgp_dras_ext.DrAgentInvalid(id\u003dagent_id)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"},{"line_number":114,"context_line":"            query \u003d query.filter_by(bgp_speaker_id\u003dspeaker_id,"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_f1ed05f0","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":16},"updated":"2016-01-08 04:41:10.000000000","message":"I already add this comment in another patch, but i think this is the right patch, so i add here again.\nyou check the dragent state must be up here, so when the dragent host the bgp speaker change from active to inactive, you can not delete the bgp speaker any more, so i think should remove the check about dragent \"admin_state_up\"","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            agent_db \u003d self._get_agent(context, agent_id)"},{"line_number":109,"context_line":"            if (agent_db[\u0027agent_type\u0027] !\u003d constants.AGENT_TYPE_BGP_ROUTING"},{"line_number":110,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":111,"context_line":"                raise bgp_dras_ext.DrAgentInvalid(id\u003dagent_id)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"},{"line_number":114,"context_line":"            query \u003d query.filter_by(bgp_speaker_id\u003dspeaker_id,"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_7bd92783","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":16},"in_reply_to":"fa69d971_f1ed05f0","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        dragents \u003d self.get_dragents_hosting_bgp_speakers(context,"},{"line_number":157,"context_line":"                                                          [speaker_id])"},{"line_number":158,"context_line":"        agent_ids \u003d [dragent.id for dragent in dragents]"},{"line_number":159,"context_line":"        if agent_ids:"},{"line_number":160,"context_line":"            return {"},{"line_number":161,"context_line":"                \u0027agents\u0027: self.get_agents(context, filters\u003d{\u0027id\u0027: agent_ids})}"},{"line_number":162,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_cfe1519c","line":159,"range":{"start_line":159,"start_character":11,"end_line":159,"end_character":20},"updated":"2016-01-08 19:18:55.000000000","message":"If you reverse the sense of this if you might have a little more room to avoid wrapping:\n\n  if not agent_ids:\n      return {\u0027agents\u0027: []}\n  return {\u0027agents\u0027: self.get_agents(context, filters\u003d{\u0027id\u0027: agent_ids})}","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        dragents \u003d self.get_dragents_hosting_bgp_speakers(context,"},{"line_number":157,"context_line":"                                                          [speaker_id])"},{"line_number":158,"context_line":"        agent_ids \u003d [dragent.id for dragent in dragents]"},{"line_number":159,"context_line":"        if agent_ids:"},{"line_number":160,"context_line":"            return {"},{"line_number":161,"context_line":"                \u0027agents\u0027: self.get_agents(context, filters\u003d{\u0027id\u0027: agent_ids})}"},{"line_number":162,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_db5cd3f2","line":159,"range":{"start_line":159,"start_character":11,"end_line":159,"end_character":20},"in_reply_to":"fa69d971_cfe1519c","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e79672f2f8c43139d1c18f280f4528a95e323376","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        dragents \u003d self.get_dragents_hosting_bgp_speakers(context,"},{"line_number":157,"context_line":"                                                          [speaker_id])"},{"line_number":158,"context_line":"        agent_ids \u003d [dragent.id for dragent in dragents]"},{"line_number":159,"context_line":"        if agent_ids:"},{"line_number":160,"context_line":"            return {"},{"line_number":161,"context_line":"                \u0027agents\u0027: self.get_agents(context, filters\u003d{\u0027id\u0027: agent_ids})}"},{"line_number":162,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_a0484e5d","line":159,"range":{"start_line":159,"start_character":11,"end_line":159,"end_character":20},"in_reply_to":"fa69d971_cfe1519c","updated":"2016-01-09 04:02:42.000000000","message":"Make sense","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            return {\u0027bgp_speakers\u0027:"},{"line_number":173,"context_line":"                    self.get_bgp_speakers(context,"},{"line_number":174,"context_line":"                                          filters\u003d{\u0027id\u0027: bgp_speaker_ids})}"},{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            # Exception will be thrown if the requested agent does not exist."},{"line_number":177,"context_line":"            self._get_agent(context, agent_id)"},{"line_number":178,"context_line":"            return {\u0027bgp_speakers\u0027: []}"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_d07c42b7","line":175,"range":{"start_line":175,"start_character":8,"end_line":175,"end_character":12},"updated":"2016-01-08 19:18:55.000000000","message":"nit:  Don\u0027t include else after a return statement so that you don\u0027t need to indent unnecessarily.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            return {\u0027bgp_speakers\u0027:"},{"line_number":173,"context_line":"                    self.get_bgp_speakers(context,"},{"line_number":174,"context_line":"                                          filters\u003d{\u0027id\u0027: bgp_speaker_ids})}"},{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            # Exception will be thrown if the requested agent does not exist."},{"line_number":177,"context_line":"            self._get_agent(context, agent_id)"},{"line_number":178,"context_line":"            return {\u0027bgp_speakers\u0027: []}"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_5bf8e3c4","line":175,"range":{"start_line":175,"start_character":8,"end_line":175,"end_character":12},"in_reply_to":"fa69d971_d07c42b7","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_60573d58","line":1,"updated":"2016-01-26 05:51:47.000000000","message":"2016","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    bgp_drscheduler \u003d None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @log_helpers.log_method_call"},{"line_number":68,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":69,"context_line":"        if self.bgp_drscheduler:"},{"line_number":70,"context_line":"            return self.bgp_drscheduler.auto_schedule_bgp_speakers("}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_204dc5c3","line":67,"updated":"2016-01-26 05:51:47.000000000","message":"logging not required.","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4341b4885343d96851a95a4d4d81b7febfce22f4","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"},{"line_number":86,"context_line":"            query \u003d query.filter_by(agent_id\u003dagent_id)"},{"line_number":87,"context_line":"            try:"},{"line_number":88,"context_line":"                binding \u003d query.one()"},{"line_number":89,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":90,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":91,"context_line":"            except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a68dd71_442ebfa6","line":88,"updated":"2016-01-26 11:39:17.000000000","message":"Check PS37 comment","commit_id":"57a10874fa1657ddf7bbedce460c1c3d634af6a6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bead5d7e20ce833d25a28cceb4458c849878a70b","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":67,"context_line":"        if self.bgp_drscheduler:"},{"line_number":68,"context_line":"            return self.bgp_drscheduler.auto_schedule_bgp_speakers("},{"line_number":69,"context_line":"                context, host)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def schedule_bgp_speaker(self, context, created_bgp_speaker):"}],"source_content_type":"text/x-python","patch_set":44,"id":"7a5de9d1_f18b6f66","line":68,"updated":"2016-01-29 15:01:38.000000000","message":"^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m    request.context, reservation.reservation_id)\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m  File \"/usr/local/lib/python2.7/dist-packages/oslo_utils/excutils.py\", line 204, in __exit__\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m    six.reraise(self.type_, self.value, self.tb)\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m  File \"/opt/stack/neutron/neutron/api/v2/base.py\", line 494, in do_create\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m    return obj_creator(request.context, **kwargs)\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m  File \"/opt/stack/neutron/neutron/db/bgp_rpc_db.py\", line 59, in create_bgp_speaker\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m    self.schedule_bgp_speaker(context, bgp_speaker)\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m  File \"/opt/stack/neutron/neutron/db/bgp_dragentscheduler_db.py\", line 77, in schedule_bgp_speaker\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m    created_bgp_speaker)\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m  File \"/opt/stack/neutron/neutron/scheduler/base_scheduler.py\", line 43, in schedule\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00m    hosted_agents \u003d filtered_agents_dict[\u0027hosted_agents\u0027]\n^[[01;31m2016-01-28 20:45:25.692 TRACE neutron.api.v2.resource ^[[01;35m^[[00mKeyError: \u0027hosted_agents\u0027","commit_id":"4b04e230c5318fbd18d89ec4ac3e9a1761bdece6"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                               nullable\u003dFalse,"},{"line_number":53,"context_line":"                               primary_key\u003dTrue)"},{"line_number":54,"context_line":"    dragent \u003d orm.relation(agents_db.Agent)"},{"line_number":55,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":56,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":57,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":58,"context_line":"                         nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_0e7a3888","line":55,"range":{"start_line":55,"start_character":4,"end_line":55,"end_character":12},"updated":"2016-02-08 21:07:58.000000000","message":"Based on the code here on L89, this column should have a unique constraint on it.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7b366138664a49268241002f7cd5c70d7020c10c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                               nullable\u003dFalse,"},{"line_number":53,"context_line":"                               primary_key\u003dTrue)"},{"line_number":54,"context_line":"    dragent \u003d orm.relation(agents_db.Agent)"},{"line_number":55,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":56,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":57,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":58,"context_line":"                         nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":51,"id":"3a57f1b5_793ccb2f","line":55,"range":{"start_line":55,"start_character":4,"end_line":55,"end_character":12},"in_reply_to":"3a57f1b5_fecbc11c","updated":"2016-02-09 19:37:26.000000000","message":"Your argument makes a lot of sense.  I think for now, a unique constraint makes the code easier and avoids races.  Otherwise, we\u0027ll have to tighten up the code in add_bgp_speaker_to_dragent to avoid races somehow for this implementation which does only allow one per agent.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a3882e7bd7ff3ed1946b9140ec1c29f5b4899a51","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                               nullable\u003dFalse,"},{"line_number":53,"context_line":"                               primary_key\u003dTrue)"},{"line_number":54,"context_line":"    dragent \u003d orm.relation(agents_db.Agent)"},{"line_number":55,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":56,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":57,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":58,"context_line":"                         nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":51,"id":"3a57f1b5_fecbc11c","line":55,"range":{"start_line":55,"start_character":4,"end_line":55,"end_character":12},"in_reply_to":"5a5ae5dd_0e7a3888","updated":"2016-02-09 19:28:18.000000000","message":"What we may want to allow in the future is for more than 1 bgp_speaker to be bound to an agent.  Some drivers (like ryu) may only support 1 speaker per agent, but other implementations might allow it.  I think for now we may just go with a unique constraint, it\u0027s possible to relax this constraint in the future.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    bgp_drscheduler \u003d None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def schedule_unscheduled_bgp_speakers(self, context, host):"},{"line_number":68,"context_line":"        if self.bgp_drscheduler:"},{"line_number":69,"context_line":"            return self.bgp_drscheduler.schedule_unscheduled_bgp_speakers("},{"line_number":70,"context_line":"                context, host)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_18cda230","line":68,"range":{"start_line":68,"start_character":11,"end_line":68,"end_character":31},"updated":"2016-02-08 21:07:58.000000000","message":"Should we be silent if this is None.  Seems like a bigger problem to me.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ee2f7b417b80c06a47ddd278fe7a695096590181","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    bgp_drscheduler \u003d None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def schedule_unscheduled_bgp_speakers(self, context, host):"},{"line_number":68,"context_line":"        if self.bgp_drscheduler:"},{"line_number":69,"context_line":"            return self.bgp_drscheduler.schedule_unscheduled_bgp_speakers("},{"line_number":70,"context_line":"                context, host)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_fd2982f3","line":68,"range":{"start_line":68,"start_character":11,"end_line":68,"end_character":31},"in_reply_to":"5a5ae5dd_18cda230","updated":"2016-02-09 03:10:55.000000000","message":"Agreed. I think we can log a warning here. Faced an issue during testing where we missed to initialize the scheduler interface and scratched our head for hours to figure out why the speaker was not getting scheduled ;)","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                context, host)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def schedule_bgp_speaker(self, context, created_bgp_speaker):"},{"line_number":73,"context_line":"        if self.bgp_drscheduler:"},{"line_number":74,"context_line":"            self.bgp_drscheduler.schedule(context, created_bgp_speaker)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def add_bgp_speaker_to_dragent(self, context, agent_id, speaker_id):"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_d8d2aad0","line":73,"range":{"start_line":73,"start_character":11,"end_line":73,"end_character":31},"updated":"2016-02-08 21:07:58.000000000","message":"ditto","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ee2f7b417b80c06a47ddd278fe7a695096590181","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                context, host)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def schedule_bgp_speaker(self, context, created_bgp_speaker):"},{"line_number":73,"context_line":"        if self.bgp_drscheduler:"},{"line_number":74,"context_line":"            self.bgp_drscheduler.schedule(context, created_bgp_speaker)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def add_bgp_speaker_to_dragent(self, context, agent_id, speaker_id):"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_3d487acc","line":73,"range":{"start_line":73,"start_character":11,"end_line":73,"end_character":31},"in_reply_to":"5a5ae5dd_d8d2aad0","updated":"2016-02-09 03:10:55.000000000","message":"Will add a warning.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            query \u003d context.session.query(BgpSpeakerDrAgentBinding)"},{"line_number":87,"context_line":"            query \u003d query.filter_by(agent_id\u003dagent_id)"},{"line_number":88,"context_line":"            try:"},{"line_number":89,"context_line":"                binding \u003d query.one()"},{"line_number":90,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":91,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":92,"context_line":"            except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_3b9e5863","line":89,"range":{"start_line":89,"start_character":16,"end_line":89,"end_character":37},"updated":"2016-02-08 21:07:58.000000000","message":"A UniqueConstraint on the agent_id field of BgpSpeakerDrAgentBinding should make this unnecessary.  I always prefer maintaining constraints at the DB level when I can.\n\nYou could surround L98 with try / except and raise the association error there if you catch a duplicate entry exception","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":91,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":92,"context_line":"            except exc.NoResultFound:"},{"line_number":93,"context_line":"                pass"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            binding \u003d BgpSpeakerDrAgentBinding()"},{"line_number":96,"context_line":"            binding.bgp_speaker_id \u003d speaker_id"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_fba3e0af","line":93,"range":{"start_line":93,"start_character":16,"end_line":93,"end_character":20},"updated":"2016-02-08 21:07:58.000000000","message":"Exceptions should be used for exceptional conditions.  In this case you\u0027re expecting an exception for normal flow control.  But, really, I think this whole thing is unnecessary.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7b366138664a49268241002f7cd5c70d7020c10c","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":91,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":92,"context_line":"            except exc.NoResultFound:"},{"line_number":93,"context_line":"                pass"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            binding \u003d BgpSpeakerDrAgentBinding()"},{"line_number":96,"context_line":"            binding.bgp_speaker_id \u003d speaker_id"}],"source_content_type":"text/x-python","patch_set":51,"id":"3a57f1b5_b9ba436d","line":93,"range":{"start_line":93,"start_character":16,"end_line":93,"end_character":20},"in_reply_to":"3a57f1b5_5e3f7525","updated":"2016-02-09 19:37:26.000000000","message":"As it is, this code is racy.  If we don\u0027t do a unique constraint then I think what we\u0027ll need to do is commit the transaction and then do another query to ensure that we\u0027re the only active binding.  If that query finds that we\u0027ve just added a second query, we\u0027ll have to delete it and raise an error.\n\nI\u0027d rather just start with a unique constraint with a nice comment about how one might relax it in the future and call it good for this iteration.\n\nEven having said that, I realize that DB migrations are not allowed in backports.  So, if we constrain it now for Mitaka anyone creating another implementation for Mitaka would be subject to the constraint.  How bad is that?  It doesn\u0027t seem like the end of the world.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a3882e7bd7ff3ed1946b9140ec1c29f5b4899a51","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":91,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":92,"context_line":"            except exc.NoResultFound:"},{"line_number":93,"context_line":"                pass"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            binding \u003d BgpSpeakerDrAgentBinding()"},{"line_number":96,"context_line":"            binding.bgp_speaker_id \u003d speaker_id"}],"source_content_type":"text/x-python","patch_set":51,"id":"3a57f1b5_5e3f7525","line":93,"range":{"start_line":93,"start_character":16,"end_line":93,"end_character":20},"in_reply_to":"5a5ae5dd_51d89aef","updated":"2016-02-09 19:28:18.000000000","message":"OK, so I started looking into this and there may be a good reason to not add the unique constraint. See comments at L55. This code still only allows for only 1 speaker to be bound to an agent.  Either way, a little adjustment here would be nice.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"864a88781c39d0ec51c3a1f69935ee6db87092e0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":91,"context_line":"                    agent_id\u003dbinding.agent_id)"},{"line_number":92,"context_line":"            except exc.NoResultFound:"},{"line_number":93,"context_line":"                pass"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            binding \u003d BgpSpeakerDrAgentBinding()"},{"line_number":96,"context_line":"            binding.bgp_speaker_id \u003d speaker_id"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_51d89aef","line":93,"range":{"start_line":93,"start_character":16,"end_line":93,"end_character":20},"in_reply_to":"5a5ae5dd_fba3e0af","updated":"2016-02-09 17:32:40.000000000","message":"Yes, I think if a unique constraint is added to agent_id above, you can simply attempt to add the binding and handle any failures instead of introducing this check.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                raise bgp_dras_ext.DrAgentNotHostingBgpSpeaker("},{"line_number":119,"context_line":"                    bgp_speaker_id\u003dspeaker_id,"},{"line_number":120,"context_line":"                    agent_id\u003dagent_id)"},{"line_number":121,"context_line":"            context.session.delete(binding)"},{"line_number":122,"context_line":"            LOG.debug(\u0027BgpSpeaker %(bgp_speaker_id)s removed from \u0027"},{"line_number":123,"context_line":"                      \u0027BgpDrAgent %(agent_id)s\u0027,"},{"line_number":124,"context_line":"                      {\u0027bgp_speaker_id\u0027: speaker_id,"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_ee8a3c1a","line":121,"updated":"2016-02-08 21:07:58.000000000","message":"L115 - L121 would be better written like this to avoid races and extra queries:\n\n  num_deleted \u003d query.delete()\n  if not num_deleted:\n      raise bgp_dras_ext.DrAgentNotHostingBgpSpeaker(...)","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ee2f7b417b80c06a47ddd278fe7a695096590181","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                raise bgp_dras_ext.DrAgentNotHostingBgpSpeaker("},{"line_number":119,"context_line":"                    bgp_speaker_id\u003dspeaker_id,"},{"line_number":120,"context_line":"                    agent_id\u003dagent_id)"},{"line_number":121,"context_line":"            context.session.delete(binding)"},{"line_number":122,"context_line":"            LOG.debug(\u0027BgpSpeaker %(bgp_speaker_id)s removed from \u0027"},{"line_number":123,"context_line":"                      \u0027BgpDrAgent %(agent_id)s\u0027,"},{"line_number":124,"context_line":"                      {\u0027bgp_speaker_id\u0027: speaker_id,"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_ddd4c6be","line":121,"in_reply_to":"5a5ae5dd_ee8a3c1a","updated":"2016-02-09 03:10:55.000000000","message":"ok","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"22e863cc8d3a7a6f4f9de008086da45c85813092","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027bgp_drscheduler_driver\u0027,"},{"line_number":36,"context_line":"        default\u003d\u0027neutron.services.bgp.scheduler\u0027"},{"line_number":37,"context_line":"                \u0027.bgp_dragent_scheduler.ChanceScheduler\u0027,"},{"line_number":38,"context_line":"        help\u003d_(\u0027Driver used for scheduling BGP speakers to BGP DrAgent\u0027)),"},{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"cfg.CONF.register_opts(BGP_DRAGENT_SCHEDULER_OPTS)"}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_5a4bfab0","line":38,"range":{"start_line":38,"start_character":13,"end_line":38,"end_character":14},"updated":"2016-02-09 22:25:28.000000000","message":"For this you need to import _ from neutron._i18n","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d3f26919b956ce6cfa35d67cc2d81917d24f30e","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    __tablename__ \u003d \u0027bgp_speaker_dragent_bindings\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    __table_args__ \u003d ("},{"line_number":50,"context_line":"        sa.UniqueConstraint("},{"line_number":51,"context_line":"                        \u0027agent_id\u0027,"},{"line_number":52,"context_line":"                        name\u003d\u0027uniq_bgp_speaker_dragent_bindings0agent_id\u0027),"},{"line_number":53,"context_line":"        model_base.BASEV2.__table_args__"}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_ff4c1878","line":50,"range":{"start_line":50,"start_character":11,"end_line":50,"end_character":27},"updated":"2016-02-09 21:22:39.000000000","message":"Given L66, do you need this at all?  Seems redundant.","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"22e863cc8d3a7a6f4f9de008086da45c85813092","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    __tablename__ \u003d \u0027bgp_speaker_dragent_bindings\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    __table_args__ \u003d ("},{"line_number":50,"context_line":"        sa.UniqueConstraint("},{"line_number":51,"context_line":"                        \u0027agent_id\u0027,"},{"line_number":52,"context_line":"                        name\u003d\u0027uniq_bgp_speaker_dragent_bindings0agent_id\u0027),"},{"line_number":53,"context_line":"        model_base.BASEV2.__table_args__"}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_9048712f","line":50,"range":{"start_line":50,"start_character":11,"end_line":50,"end_character":27},"in_reply_to":"3a57f1b5_ff4c1878","updated":"2016-02-09 22:25:28.000000000","message":"I don\u0027t see any need for it.","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"06a16bef1d0ae19b630a0948cbc51f3c5043051f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":64,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":65,"context_line":"                         nullable\u003dFalse,"},{"line_number":66,"context_line":"                         unique\u003dTrue,"},{"line_number":67,"context_line":"                         primary_key\u003dTrue)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_bf59c090","line":66,"range":{"start_line":66,"start_character":25,"end_line":66,"end_character":31},"updated":"2016-02-09 21:33:23.000000000","message":"Thinking about it more, I\u0027m sure this is redundant with L50.  One of the two should be removed.  I\u0027m inclined to prefer this one over L50 unless someone has a reason to prefer the other.","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"22e863cc8d3a7a6f4f9de008086da45c85813092","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":64,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":65,"context_line":"                         nullable\u003dFalse,"},{"line_number":66,"context_line":"                         unique\u003dTrue,"},{"line_number":67,"context_line":"                         primary_key\u003dTrue)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_906f1192","line":66,"range":{"start_line":66,"start_character":25,"end_line":66,"end_character":31},"in_reply_to":"3a57f1b5_bf59c090","updated":"2016-02-09 22:25:28.000000000","message":"+1. Keep this and remove L49-54.","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d3f26919b956ce6cfa35d67cc2d81917d24f30e","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":92,"context_line":"                    agent_id\u003dagent_id)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"            LOG.debug(\u0027BgpSpeaker %(bgp_speaker_id)s added to \u0027"},{"line_number":95,"context_line":"                      \u0027BgpDrAgent %(agent_id)s\u0027,"},{"line_number":96,"context_line":"                      {\u0027bgp_speaker_id\u0027: speaker_id,"},{"line_number":97,"context_line":"                       \u0027agent_id\u0027: agent_id})"}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_dfa91ce1","line":94,"range":{"start_line":94,"start_character":12,"end_line":94,"end_character":21},"updated":"2016-02-09 21:22:39.000000000","message":"Indented too much.  As it is, this is dead code.  :(","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"227747a540b80a08f30b11d05ce72ded44bd8be5","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            raise bgp_dras_ext.DrAgentAssociationError("},{"line_number":92,"context_line":"                    agent_id\u003dagent_id)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"            LOG.debug(\u0027BgpSpeaker %(bgp_speaker_id)s added to \u0027"},{"line_number":95,"context_line":"                      \u0027BgpDrAgent %(agent_id)s\u0027,"},{"line_number":96,"context_line":"                      {\u0027bgp_speaker_id\u0027: speaker_id,"},{"line_number":97,"context_line":"                       \u0027agent_id\u0027: agent_id})"}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_dfa35c4e","line":94,"range":{"start_line":94,"start_character":12,"end_line":94,"end_character":21},"in_reply_to":"3a57f1b5_dfa91ce1","updated":"2016-02-09 21:36:43.000000000","message":"Oops, that\u0027s not what we want.  Pull this back 4 columns","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"3896e2063111fe0192c3d54a42d911d2dc97780b","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":58,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":59,"context_line":"                         nullable\u003dFalse,"},{"line_number":60,"context_line":"                         unique\u003dTrue,"},{"line_number":61,"context_line":"                         primary_key\u003dTrue)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_b086c6b7","line":60,"updated":"2016-02-10 01:54:21.000000000","message":"Thinking about this some more ...\n\nIf the agent_id is a unique field, then you don\u0027t need to make \u003cagent_id, bgp_speaker_id\u003e the primary key, it can be just \u003cagent_id\u003e.\n\nIn other words, remove L54 and L60. Making just agent_id the primary will force it to be unique.\n\nOh, and then you don\u0027t need L59 either.","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1b5c92f98ec6b3bb0780b4aa861ef2ca1df2183a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":58,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":59,"context_line":"                         nullable\u003dFalse,"},{"line_number":60,"context_line":"                         unique\u003dTrue,"},{"line_number":61,"context_line":"                         primary_key\u003dTrue)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_06b17d8f","line":60,"in_reply_to":"3a57f1b5_965fff0d","updated":"2016-02-10 17:28:04.000000000","message":"I did a little reading this morning and I\u0027m pretty sure that twiddling the primary constraints in a migrate script isn\u0027t that much of a problem.  I think we should do what makes sense today and worry about migration when that becomes an issue.  (I tend to think it won\u0027t become an issue)\n\nSo, I think Henry\u0027s suggestion makes the most sense today.  I\u0027ll update a new patch set following this advice.","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"8e6b3685bd2663d257947844ef042dbf2fa75843","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":58,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":59,"context_line":"                         nullable\u003dFalse,"},{"line_number":60,"context_line":"                         unique\u003dTrue,"},{"line_number":61,"context_line":"                         primary_key\u003dTrue)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_a61d0975","line":60,"in_reply_to":"3a57f1b5_965fff0d","updated":"2016-02-10 17:29:20.000000000","message":"I was thinking about this a little more, and I don\u0027t think it will be any problem to migrate this. Making agent_id is the PK is the right thing to do.","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"2f652c679cc7fac17b600d1f84524cdabfe8e1b3","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":58,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":59,"context_line":"                         nullable\u003dFalse,"},{"line_number":60,"context_line":"                         unique\u003dTrue,"},{"line_number":61,"context_line":"                         primary_key\u003dTrue)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_965fff0d","line":60,"in_reply_to":"3a57f1b5_b086c6b7","updated":"2016-02-10 05:03:05.000000000","message":"Something to consider in the future is support for multiple bindings per agent.  While we aren\u0027t supporting it yet, I wonder if simply making agent_id the PK makes it harder to adjust the schema to support it in the future.","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"25b8977e800ffeff86cf965f8403d6f69ad687f9","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_db import exception as db_exc"},{"line_number":18,"context_line":"from oslo_i18n._i18n import _"},{"line_number":19,"context_line":"from oslo_log import log as logging"},{"line_number":20,"context_line":"import sqlalchemy as sa"},{"line_number":21,"context_line":"from sqlalchemy import orm"}],"source_content_type":"text/x-python","patch_set":58,"id":"3a57f1b5_905b402e","line":18,"updated":"2016-02-11 07:40:09.000000000","message":"import from neutron","commit_id":"40f58ec9c6b2f4bbfe77fa144384ffa9cf46b844"}],"neutron/db/bgp_dragentschedulers_db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"BGP_DRAGENT_SCHEDULER_OPTS \u003d ["},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027bgp_dr_scheduler_driver\u0027,"},{"line_number":35,"context_line":"        default\u003d\u0027neutron.scheduler.bgp_dragent_scheduler.\u0027"},{"line_number":36,"context_line":"                \u0027BgpDynamicRoutingScheduler\u0027,"},{"line_number":37,"context_line":"        help\u003d_(\u0027Driver used for scheduling BGP speakers to DR agent\u0027)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_de29cf9c","line":34,"updated":"2015-08-01 05:24:36.000000000","message":"How about renaming it as \"bgp_speaker_scheduler_driver\"","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"BGP_DRAGENT_SCHEDULER_OPTS \u003d ["},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027bgp_dr_scheduler_driver\u0027,"},{"line_number":35,"context_line":"        default\u003d\u0027neutron.scheduler.bgp_dragent_scheduler.\u0027"},{"line_number":36,"context_line":"                \u0027BgpDynamicRoutingScheduler\u0027,"},{"line_number":37,"context_line":"        help\u003d_(\u0027Driver used for scheduling BGP speakers to DR agent\u0027)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_2ef9dcc8","line":34,"in_reply_to":"3a50d1a3_de29cf9c","updated":"2015-08-10 12:34:57.000000000","message":"renamed to \"bgp_drscheduler_driver\"","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":43,"context_line":"cfg.CONF.register_opts(BGP_DRAGENT_SCHEDULER_OPTS)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class BgpSpeakerDrAgentBinding(model_base.BASEV2):"},{"line_number":47,"context_line":"    \"\"\"Binding between bgp speaker and agents\"\"\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    __tablename__ \u003d \u0027bgp_speaker_dragent_bindings\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_be572325","line":46,"updated":"2015-08-01 05:24:36.000000000","message":"PEP8: Note: When using abbreviations in CapWords, capitalize all the letters of the abbreviation. Thus HTTPServerError is better than HttpServerError.\n\nI think we should rename it as BGPSpeakerDRAgentBinding. Need to take care of this at all the places.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":43,"context_line":"cfg.CONF.register_opts(BGP_DRAGENT_SCHEDULER_OPTS)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class BgpSpeakerDrAgentBinding(model_base.BASEV2):"},{"line_number":47,"context_line":"    \"\"\"Binding between bgp speaker and agents\"\"\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    __tablename__ \u003d \u0027bgp_speaker_dragent_bindings\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_ee0214b4","line":46,"in_reply_to":"3a50d1a3_be572325","updated":"2015-08-10 12:34:57.000000000","message":"Done.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cdff2937567037cdcdfaa504a7952c66664ba75f","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                            ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":50,"context_line":"                              nullable\u003dFalse,"},{"line_number":51,"context_line":"                              primary_key\u003dTrue)"},{"line_number":52,"context_line":"    BgpSpeaker \u003d orm.relation(bgp_speaker_db.BgpSpeaker)"},{"line_number":53,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":54,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":55,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_386f4bc5","line":52,"updated":"2015-08-12 20:51:47.000000000","message":"Is this necessary?  I don\u0027t necessarily want to join bgp_speakers when I read the binding.  The bgp_speaker_id should be sufficient.","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cdff2937567037cdcdfaa504a7952c66664ba75f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":79,"context_line":"                raise bgp_dras_ext.DRAgentInvalid(id\u003dagent_id)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            BgpSpeaker_db \u003d self._get_bgp_speaker(context, speaker_id)"},{"line_number":82,"context_line":"            query \u003d context.session.query(BGPSpeakerDRAgentBinding)"},{"line_number":83,"context_line":"            query \u003d query.filter_by(agent_id\u003dagent_id)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_5814979e","line":81,"updated":"2015-08-12 20:51:47.000000000","message":"This is unecessary IMO.  With the proper foreign key constraints in place, we don\u0027t need to read the BgpSpeaker or Agent before saving the binding.","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a8e11aa0f1628d94bd2ff12b2ecd551e1c7d44eb","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":79,"context_line":"                raise bgp_dras_ext.DRAgentInvalid(id\u003dagent_id)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            BgpSpeaker_db \u003d self._get_bgp_speaker(context, speaker_id)"},{"line_number":82,"context_line":"            query \u003d context.session.query(BGPSpeakerDRAgentBinding)"},{"line_number":83,"context_line":"            query \u003d query.filter_by(agent_id\u003dagent_id)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_5d657db2","line":81,"in_reply_to":"1a4dcd0f_5814979e","updated":"2015-08-20 12:14:44.000000000","message":"Done.","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cdff2937567037cdcdfaa504a7952c66664ba75f","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":107,"context_line":"                raise bgp_dras_ext.DRAgentInvalid(id\u003dagent_id)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            BgpSpeaker_db \u003d self._get_bgp_speaker(context, speaker_id)"},{"line_number":110,"context_line":"            query \u003d context.session.query(BGPSpeakerDRAgentBinding)"},{"line_number":111,"context_line":"            query \u003d query.filter_by("},{"line_number":112,"context_line":"                bgp_speaker_id\u003dBgpSpeaker_db.id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_788dd32f","line":109,"updated":"2015-08-12 20:51:47.000000000","message":"This lookup is unnecessary.  We\u0027ve got the bgp_speaker_id passed to us.  Just need to see if a binding exists for the speaker_id and agent_id.  If no binding exists, simply report that no binding exists.  No need to actually load the BgpSpeaker itself IMO.","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a8e11aa0f1628d94bd2ff12b2ecd551e1c7d44eb","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                    or not agent_db[\u0027admin_state_up\u0027]):"},{"line_number":107,"context_line":"                raise bgp_dras_ext.DRAgentInvalid(id\u003dagent_id)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            BgpSpeaker_db \u003d self._get_bgp_speaker(context, speaker_id)"},{"line_number":110,"context_line":"            query \u003d context.session.query(BGPSpeakerDRAgentBinding)"},{"line_number":111,"context_line":"            query \u003d query.filter_by("},{"line_number":112,"context_line":"                bgp_speaker_id\u003dBgpSpeaker_db.id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_fd5571c1","line":109,"in_reply_to":"1a4dcd0f_788dd32f","updated":"2015-08-20 12:14:44.000000000","message":"Done.","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"dfb39ab2eafb3b0d5f38c99917df05c0f226ce78","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                            ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":50,"context_line":"                              nullable\u003dFalse,"},{"line_number":51,"context_line":"                              primary_key\u003dTrue)"},{"line_number":52,"context_line":"    BgpSpeaker \u003d orm.relation(bgp_speaker_db.BgpSpeaker)"},{"line_number":53,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":54,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":55,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_ef5a8cf1","line":52,"updated":"2015-08-20 14:50:43.000000000","message":"Check PS4 comment.","commit_id":"6bd8505181edf3060bf66c0bfba3019b70087a90"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e9d67a3b04fb317fb0289578353a799e1f8b7322","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                            ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":50,"context_line":"                              nullable\u003dFalse,"},{"line_number":51,"context_line":"                              primary_key\u003dTrue)"},{"line_number":52,"context_line":"    BgpSpeaker \u003d orm.relation(bgp_speaker_db.BgpSpeaker)"},{"line_number":53,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":54,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":55,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_05fd036e","line":52,"updated":"2015-08-22 10:38:58.000000000","message":"Check PS4 comment.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3da9b34570a82c3437e20380beaedc7b3b0242f5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                                             ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":51,"context_line":"                               nullable\u003dFalse,"},{"line_number":52,"context_line":"                               primary_key\u003dTrue)"},{"line_number":53,"context_line":"    dragent \u003d orm.relation(agents_db.Agent)"},{"line_number":54,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":55,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":56,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_b7dd5616","line":53,"updated":"2015-08-27 12:43:53.000000000","message":"Why we need this?","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"14a2b1f94d204616fb7415072c0422bace58ca4b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                                             ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":51,"context_line":"                               nullable\u003dFalse,"},{"line_number":52,"context_line":"                               primary_key\u003dTrue)"},{"line_number":53,"context_line":"    dragent \u003d orm.relation(agents_db.Agent)"},{"line_number":54,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":55,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":56,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_c656ba29","line":53,"in_reply_to":"da20952f_b7dd5616","updated":"2015-08-29 06:06:52.000000000","message":"Its used below in the function : get_dragents_hosting_bgp_speakers","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"01b4066eee186f9a1af995a1dc56c645faff87dc","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                                             ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":51,"context_line":"                               nullable\u003dFalse,"},{"line_number":52,"context_line":"                               primary_key\u003dTrue)"},{"line_number":53,"context_line":"    dragent \u003d orm.relation(agents_db.Agent)"},{"line_number":54,"context_line":"    agent_id \u003d sa.Column(sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":55,"context_line":"                         sa.ForeignKey(\"agents.id\","},{"line_number":56,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_607c711f","line":53,"in_reply_to":"da20952f_c656ba29","updated":"2015-08-29 10:12:17.000000000","message":"+1.","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"01b4066eee186f9a1af995a1dc56c645faff87dc","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                         primary_key\u003dTrue)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class BgpDrAgentSchedulerDbMixin(bgp_dras_ext.BgpDrSchedulerPluginBase,"},{"line_number":62,"context_line":"                                 as_db.AgentSchedulerDbMixin):"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    bgp_drscheduler \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_8080a5f8","line":61,"updated":"2015-08-29 10:12:17.000000000","message":"I think we need the code to reschedule an hosted BgpSpeaker to another available DRAgent, if the hosted DRAgent goes down.","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"813601d86ac7b83ce9a34930f4f00a3ae6704f8d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                         primary_key\u003dTrue)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class BgpDrAgentSchedulerDbMixin(bgp_dras_ext.BgpDrSchedulerPluginBase,"},{"line_number":62,"context_line":"                                 as_db.AgentSchedulerDbMixin):"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    bgp_drscheduler \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_0189d325","line":61,"in_reply_to":"da20952f_8080a5f8","updated":"2015-09-05 08:31:54.000000000","message":"This is being marked as an outstanding Item in the commit msg.","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"}],"neutron/db/migration/alembic_migrations/versions/liberty/expand/3ef856796c1c_add_bgp_speaker_model_data.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9f3252093312e35980de06277fb7bf18284935cf","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_bgp_speaker_model_data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 3ef856796c1c"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_5a34fcdc","line":15,"updated":"2015-08-24 20:31:39.000000000","message":"Let\u0027s not rename this file.  We don\u0027t even need to be making changes in this file.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"43cee3afd0c427e3b5f34f715b3ab42581dfba59","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_bgp_speaker_model_data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 3ef856796c1c"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_79577c02","line":15,"in_reply_to":"fa1b9901_5a34fcdc","updated":"2015-08-25 06:56:27.000000000","message":"ok.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"}],"neutron/db/migration/alembic_migrations/versions/liberty/expand/b4caf27aae4_add_bgp_speaker_model_data.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0a8f72ae5b1170d3a87d776d88c2be42a3bf6a48","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_bgp_speaker_model_data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: b4caf27aae4"},{"line_number":19,"context_line":"Revises: 3ef856796c1c"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_2387dfd8","line":16,"updated":"2015-08-22 14:05:47.000000000","message":"Rename this file as \"add_bgp_dragent_model_data\"","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9f3252093312e35980de06277fb7bf18284935cf","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_bgp_speaker_model_data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: b4caf27aae4"},{"line_number":19,"context_line":"Revises: 3ef856796c1c"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_da56cc05","line":16,"in_reply_to":"fa1b9901_2387dfd8","updated":"2015-08-24 20:31:39.000000000","message":"+1, rename this file.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"}],"neutron/db/migration/alembic_migrations/versions/mitaka/expand/b4caf27aae4_add_bgp_dragent_model_data.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c853e01615e8a988ee01c758a1d9e3dcc81b677","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"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":37,"id":"fa69d971_1b96ba94","line":1,"updated":"2016-01-08 03:49:27.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"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":37,"id":"9a68dd71_5b1f8309","line":1,"in_reply_to":"fa69d971_1b96ba94","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"add_bgp_dragent_model_data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: b4caf27aae4"},{"line_number":19,"context_line":"Revises: 15be7321482"},{"line_number":20,"context_line":"Create Date: 2015-08-20 17:05:31.038704"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_0bc06b7b","line":18,"updated":"2016-01-08 19:18:55.000000000","message":"Aren\u0027t these completely redundant?  Why document a value in a comment that is already present (and perfectly readable) in the code itself?","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"e79672f2f8c43139d1c18f280f4528a95e323376","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"add_bgp_dragent_model_data"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: b4caf27aae4"},{"line_number":19,"context_line":"Revises: 15be7321482"},{"line_number":20,"context_line":"Create Date: 2015-08-20 17:05:31.038704"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_60757696","line":18,"in_reply_to":"fa69d971_0bc06b7b","updated":"2016-01-09 04:02:42.000000000","message":"Just followed others. \nhttps://github.com/openstack/neutron/blob/master/neutron/db/migration/alembic_migrations/versions/mitaka/expand/13cfb89f881a_add_is_default_to_subnetpool.py#L16-L22","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"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":41,"id":"9a68dd71_4048f9b2","line":1,"updated":"2016-01-26 05:51:47.000000000","message":"2016","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d3f26919b956ce6cfa35d67cc2d81917d24f30e","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    op.create_table("},{"line_number":39,"context_line":"        \u0027bgp_speaker_dragent_bindings\u0027,"},{"line_number":40,"context_line":"        sa.Column(\u0027agent_id\u0027,"},{"line_number":41,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":42,"context_line":"                  nullable\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_ffcf38b1","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":29},"updated":"2016-02-09 21:22:39.000000000","message":"This should have the unique flag on it too, right?","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"22e863cc8d3a7a6f4f9de008086da45c85813092","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    op.create_table("},{"line_number":39,"context_line":"        \u0027bgp_speaker_dragent_bindings\u0027,"},{"line_number":40,"context_line":"        sa.Column(\u0027agent_id\u0027,"},{"line_number":41,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":42,"context_line":"                  nullable\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_50bbd90e","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":29},"in_reply_to":"3a57f1b5_ffcf38b1","updated":"2016-02-09 22:25:28.000000000","message":"Yes, add unique\u003dTrue here and drop line 50.","commit_id":"fdbb4b68127b4c07e2f347bcb5d1fb15ba776817"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"3896e2063111fe0192c3d54a42d911d2dc97780b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027bgp_speaker_dragent_bindings\u0027,"},{"line_number":38,"context_line":"        sa.Column(\u0027agent_id\u0027,"},{"line_number":39,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":40,"context_line":"                  unique\u003dTrue,"},{"line_number":41,"context_line":"                  nullable\u003dFalse),"},{"line_number":42,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"},{"line_number":43,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_50067221","line":40,"range":{"start_line":40,"start_character":18,"end_line":40,"end_character":24},"updated":"2016-02-10 01:54:21.000000000","message":"replace with primary_key\u003dTrue","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"2f652c679cc7fac17b600d1f84524cdabfe8e1b3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027bgp_speaker_dragent_bindings\u0027,"},{"line_number":38,"context_line":"        sa.Column(\u0027agent_id\u0027,"},{"line_number":39,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":40,"context_line":"                  unique\u003dTrue,"},{"line_number":41,"context_line":"                  nullable\u003dFalse),"},{"line_number":42,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"},{"line_number":43,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_56874761","line":40,"range":{"start_line":40,"start_character":18,"end_line":40,"end_character":24},"in_reply_to":"3a57f1b5_50067221","updated":"2016-02-10 05:03:05.000000000","message":"See comments in neutron/db/bgp_dragentscheduler_db.py","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1b5c92f98ec6b3bb0780b4aa861ef2ca1df2183a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027bgp_speaker_dragent_bindings\u0027,"},{"line_number":38,"context_line":"        sa.Column(\u0027agent_id\u0027,"},{"line_number":39,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":40,"context_line":"                  unique\u003dTrue,"},{"line_number":41,"context_line":"                  nullable\u003dFalse),"},{"line_number":42,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"},{"line_number":43,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_86632d1a","line":40,"range":{"start_line":40,"start_character":18,"end_line":40,"end_character":24},"in_reply_to":"3a57f1b5_56874761","updated":"2016-02-10 17:28:04.000000000","message":"Done","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"3896e2063111fe0192c3d54a42d911d2dc97780b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027agent_id\u0027,"},{"line_number":39,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":40,"context_line":"                  unique\u003dTrue,"},{"line_number":41,"context_line":"                  nullable\u003dFalse),"},{"line_number":42,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"},{"line_number":43,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":44,"context_line":"                  nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_ab373be2","line":41,"range":{"start_line":41,"start_character":18,"end_line":41,"end_character":32},"updated":"2016-02-10 01:54:21.000000000","message":"Not needed.","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1b5c92f98ec6b3bb0780b4aa861ef2ca1df2183a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027agent_id\u0027,"},{"line_number":39,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":40,"context_line":"                  unique\u003dTrue,"},{"line_number":41,"context_line":"                  nullable\u003dFalse),"},{"line_number":42,"context_line":"        sa.Column(\u0027bgp_speaker_id\u0027,"},{"line_number":43,"context_line":"                  sa.String(length\u003dconstants.UUID_STRING_LENGTH),"},{"line_number":44,"context_line":"                  nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_a668a9f6","line":41,"range":{"start_line":41,"start_character":18,"end_line":41,"end_character":32},"in_reply_to":"3a57f1b5_ab373be2","updated":"2016-02-10 17:28:04.000000000","message":"Done","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"3896e2063111fe0192c3d54a42d911d2dc97780b","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":47,"context_line":"        sa.ForeignKeyConstraint([\u0027bgp_speaker_id\u0027], [\u0027bgp_speakers.id\u0027],"},{"line_number":48,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":49,"context_line":"        sa.PrimaryKeyConstraint(\u0027agent_id\u0027, \u0027bgp_speaker_id\u0027)"},{"line_number":50,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_70036e10","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":61},"updated":"2016-02-10 01:54:21.000000000","message":"Not needed.","commit_id":"58486786f962d5db0e81d1143d081e019017a471"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1b5c92f98ec6b3bb0780b4aa861ef2ca1df2183a","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":47,"context_line":"        sa.ForeignKeyConstraint([\u0027bgp_speaker_id\u0027], [\u0027bgp_speakers.id\u0027],"},{"line_number":48,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":49,"context_line":"        sa.PrimaryKeyConstraint(\u0027agent_id\u0027, \u0027bgp_speaker_id\u0027)"},{"line_number":50,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":54,"id":"3a57f1b5_6672b1e7","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":61},"in_reply_to":"3a57f1b5_70036e10","updated":"2016-02-10 17:28:04.000000000","message":"Done","commit_id":"58486786f962d5db0e81d1143d081e019017a471"}],"neutron/extensions/bgp_dragentscheduler.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                \"by the DR agent %(agent_id)s.\")"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"# Vikram: Currently, only one BGP speaker could be associated"},{"line_number":50,"context_line":"# with one DrAgent. If we got to support multiple then need to"},{"line_number":51,"context_line":"# revisit below code."},{"line_number":52,"context_line":"class DrAgentAssociationError(exceptions.Conflict):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_590b9924","line":49,"updated":"2015-08-01 05:24:36.000000000","message":"Do we really need this comment or just mention this in the devref document? I can find such comment at multiple places and making the code looks clumsy.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                \"to a BGP speaker.\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class BgpDynamicRoutingSchedulerController(wsgi.Controller):"},{"line_number":58,"context_line":"    \"\"\"Schedule BGP speakers for DrAgents\"\"\""},{"line_number":59,"context_line":"    def get_plugin(self):"},{"line_number":60,"context_line":"        plugin \u003d manager.NeutronManager.get_service_plugins().get("}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_b933bdf5","line":57,"updated":"2015-08-01 05:24:36.000000000","message":"Need to follow PEP8 naming convention by mentioning Bgp as BGP.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                \"to a BGP speaker.\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class BgpDynamicRoutingSchedulerController(wsgi.Controller):"},{"line_number":58,"context_line":"    \"\"\"Schedule BGP speakers for DrAgents\"\"\""},{"line_number":59,"context_line":"    def get_plugin(self):"},{"line_number":60,"context_line":"        plugin \u003d manager.NeutronManager.get_service_plugins().get("}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_ce3078a1","line":57,"in_reply_to":"3a50d1a3_b933bdf5","updated":"2015-08-10 12:34:57.000000000","message":"Done.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class BgpDynamicRoutingSchedulerController(wsgi.Controller):"},{"line_number":58,"context_line":"    \"\"\"Schedule BGP speakers for DrAgents\"\"\""},{"line_number":59,"context_line":"    def get_plugin(self):"},{"line_number":60,"context_line":"        plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":61,"context_line":"            constants.BGP_SPEAKER)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_994fe169","line":58,"updated":"2015-08-01 05:24:36.000000000","message":"Let\u0027s change DrAgent to \"DRAgent\" as per PEP8 guidelines.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class BgpDynamicRoutingSchedulerController(wsgi.Controller):"},{"line_number":58,"context_line":"    \"\"\"Schedule BGP speakers for DrAgents\"\"\""},{"line_number":59,"context_line":"    def get_plugin(self):"},{"line_number":60,"context_line":"        plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":61,"context_line":"            constants.BGP_SPEAKER)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_6e25a45a","line":58,"in_reply_to":"3a50d1a3_994fe169","updated":"2015-08-10 12:34:57.000000000","message":"Done.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"130b028e9b0e68b7c5afadea33963d2782a50956","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"BGP_DRINSTANCE \u003d \u0027bgp-drinstance\u0027"},{"line_number":36,"context_line":"BGP_DRINSTANCES \u003d BGP_DRINSTANCE + \u0027s\u0027"},{"line_number":37,"context_line":"BGP_DRAGENT \u003d \u0027bgp-dragent\u0027"},{"line_number":38,"context_line":"BGP_DRAGENTS \u003d BGP_DRAGENT + \u0027s\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a1a9d01_e7e3b3a2","line":35,"updated":"2015-09-29 13:42:57.000000000","message":"I\u0027m not sure if this endpoint should be called \u0027drinstance\u0027","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"78045422c5665cd8aa245e66d2872c58f948eb7a","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"BGP_DRINSTANCE \u003d \u0027bgp-drinstance\u0027"},{"line_number":36,"context_line":"BGP_DRINSTANCES \u003d BGP_DRINSTANCE + \u0027s\u0027"},{"line_number":37,"context_line":"BGP_DRAGENT \u003d \u0027bgp-dragent\u0027"},{"line_number":38,"context_line":"BGP_DRAGENTS \u003d BGP_DRAGENT + \u0027s\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a1a9d01_a3092e86","line":35,"in_reply_to":"9a1a9d01_e7e3b3a2","updated":"2015-09-29 14:10:15.000000000","message":"I think bgp-drinstance is fine as of now, as it\u0027s no more generic ;)","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c853e01615e8a988ee01c758a1d9e3dcc81b677","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_9be86a18","line":1,"updated":"2016-01-08 03:49:27.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_9bdbbb4f","line":1,"in_reply_to":"fa69d971_9be86a18","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_00cd2130","line":1,"updated":"2016-01-26 05:51:47.000000000","message":"2016","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.common import constants as common_constants"},{"line_number":24,"context_line":"from neutron.common import exceptions"},{"line_number":25,"context_line":"from neutron.extensions import agent"},{"line_number":26,"context_line":"from neutron.i18n import _LE"},{"line_number":27,"context_line":"from neutron.plugins.common import constants as plugin_constants"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from neutron import manager"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_a0cf7527","line":26,"updated":"2016-01-26 05:51:47.000000000","message":"use _i18n","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"b3e17669631e5c4dc923ec02387c7b73ea00fd23","unresolved":false,"context_lines":[{"line_number":55,"context_line":"class BgpDrSchedulerController(wsgi.Controller):"},{"line_number":56,"context_line":"    \"\"\"Schedule BgpSpeaker for a BgpDrAgent\"\"\""},{"line_number":57,"context_line":"    def get_plugin(self):"},{"line_number":58,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":59,"context_line":"        if not plugin:"},{"line_number":60,"context_line":"            LOG.error(_LE(\u0027No plugin for BGP routing registered\u0027))"},{"line_number":61,"context_line":"            msg \u003d _(\u0027The resource could not be found.\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"7a5de9d1_c37b7e7a","line":58,"updated":"2016-01-27 15:43:48.000000000","message":"plugin \u003d manager.NeutronManager.get_service_plugins().get(\n            plugin_constants.BGP)","commit_id":"57a10874fa1657ddf7bbedce460c1c3d634af6a6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"b3e17669631e5c4dc923ec02387c7b73ea00fd23","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class BgpDrAgentController(wsgi.Controller):"},{"line_number":84,"context_line":"    def get_plugin(self):"},{"line_number":85,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":86,"context_line":"        if not plugin:"},{"line_number":87,"context_line":"            LOG.error(_LE(\u0027No plugin for BGP routing registered\u0027))"},{"line_number":88,"context_line":"            msg \u003d _LE(\u0027The resource could not be found.\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"7a5de9d1_4390ee95","line":85,"updated":"2016-01-27 15:43:48.000000000","message":"plugin \u003d manager.NeutronManager.get_service_plugins().get(\n            plugin_constants.BGP)","commit_id":"57a10874fa1657ddf7bbedce460c1c3d634af6a6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a9b7838471e8798245e2a8c5395a3d129f871b4f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"class BgpDrSchedulerController(wsgi.Controller):"},{"line_number":56,"context_line":"    \"\"\"Schedule BgpSpeaker for a BgpDrAgent\"\"\""},{"line_number":57,"context_line":"    def get_plugin(self):"},{"line_number":58,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":59,"context_line":"        if not plugin:"},{"line_number":60,"context_line":"            LOG.error(_LE(\u0027No plugin for BGP routing registered\u0027))"},{"line_number":61,"context_line":"            msg \u003d _(\u0027The resource could not be found.\u0027)"}],"source_content_type":"text/x-python","patch_set":44,"id":"7a5de9d1_7665351c","line":58,"updated":"2016-01-29 14:55:54.000000000","message":"plugin \u003d manager.NeutronManager.get_service_plugins().get(\n            plugin_constants.BGP)","commit_id":"4b04e230c5318fbd18d89ec4ac3e9a1761bdece6"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"99b9aebafd70c5e75760402113288f546a1d2baf","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                extradhcpopt_db.ExtraDhcpOptMixin,"},{"line_number":97,"context_line":"                netmtu_db.Netmtu_db_mixin,"},{"line_number":98,"context_line":"                address_scope_db.AddressScopeDbMixin,"},{"line_number":99,"context_line":"                bgp_db.BgpDbMixin,"},{"line_number":100,"context_line":"                bgp_dragentscheduler_db.BgpDrAgentSchedulerDbMixin):"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    \"\"\"Implement the Neutron L2 abstractions using modules."}],"source_content_type":"text/x-python","patch_set":29,"id":"9a8ffd7b_55c77363","line":99,"updated":"2015-11-30 03:28:39.000000000","message":"bgp dynamic routing is a service plugin, it should be load by neutron.conf (add bgp to service_plugins), not by ML2plugin.\nSo i think have to remove bgp_db.BgpDbMixin from here and change neutron.conf and entry_points.txt.","commit_id":"6db462c543f8856e5938456aea31f8f73c1a22bb"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"afc2b9facb957af32b81db45621598fbaf52b04a","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                extradhcpopt_db.ExtraDhcpOptMixin,"},{"line_number":97,"context_line":"                netmtu_db.Netmtu_db_mixin,"},{"line_number":98,"context_line":"                address_scope_db.AddressScopeDbMixin,"},{"line_number":99,"context_line":"                bgp_db.BgpDbMixin,"},{"line_number":100,"context_line":"                bgp_dragentscheduler_db.BgpDrAgentSchedulerDbMixin):"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    \"\"\"Implement the Neutron L2 abstractions using modules."}],"source_content_type":"text/x-python","patch_set":29,"id":"9a8ffd7b_0eac47ec","line":99,"in_reply_to":"9a8ffd7b_55c77363","updated":"2015-11-30 23:49:23.000000000","message":"Not a service plugin anymore.  The purpose of the recent refactoring and rebasing exercise was to move away from the service plugin design.","commit_id":"6db462c543f8856e5938456aea31f8f73c1a22bb"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"ce85a636809a687f9bdf02eb258f05edc5bb8c2e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                    \"multi-provider\", \"allowed-address-pairs\","},{"line_number":123,"context_line":"                                    \"extra_dhcp_opt\", \"subnet_allocation\","},{"line_number":124,"context_line":"                                    \"net-mtu\", \"vlan-transparent\","},{"line_number":125,"context_line":"                                    \"address-scope\", \"dns-integration\","},{"line_number":126,"context_line":"                                    \"availability_zone\", \"bgp\"]"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a8ffd7b_7d017e37","line":125,"updated":"2015-11-27 05:37:55.000000000","message":"Should add \"bgp_dragent_scheduler\" to _supported_extension_aliases","commit_id":"6db462c543f8856e5938456aea31f8f73c1a22bb"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"afc2b9facb957af32b81db45621598fbaf52b04a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                    \"multi-provider\", \"allowed-address-pairs\","},{"line_number":123,"context_line":"                                    \"extra_dhcp_opt\", \"subnet_allocation\","},{"line_number":124,"context_line":"                                    \"net-mtu\", \"vlan-transparent\","},{"line_number":125,"context_line":"                                    \"address-scope\", \"dns-integration\","},{"line_number":126,"context_line":"                                    \"availability_zone\", \"bgp\"]"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a8ffd7b_aeb89b2b","line":125,"in_reply_to":"9a8ffd7b_7d017e37","updated":"2015-11-30 23:49:23.000000000","message":"Done","commit_id":"6db462c543f8856e5938456aea31f8f73c1a22bb"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"5660da0d682d070daa899e12bc50dd55a53eb98a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                    \"extra_dhcp_opt\", \"subnet_allocation\","},{"line_number":125,"context_line":"                                    \"net-mtu\", \"vlan-transparent\","},{"line_number":126,"context_line":"                                    \"address-scope\", \"dns-integration\","},{"line_number":127,"context_line":"                                    \"availability_zone\","},{"line_number":128,"context_line":"                                    \"network_availability_zone\", \"bgp\"]"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_146d31cc","line":127,"updated":"2015-12-01 03:54:44.000000000","message":"Should add \"bgp_dragent_scheduler\" to _supported_extension_aliases","commit_id":"b6bde47e635f757adb340eb5d453ffeadce83b60"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"349b57142385d6d9836e11019e2eddb6cdd16f50","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                    \"extra_dhcp_opt\", \"subnet_allocation\","},{"line_number":125,"context_line":"                                    \"net-mtu\", \"vlan-transparent\","},{"line_number":126,"context_line":"                                    \"address-scope\", \"dns-integration\","},{"line_number":127,"context_line":"                                    \"availability_zone\","},{"line_number":128,"context_line":"                                    \"network_availability_zone\", \"bgp\"]"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_c347ed49","line":127,"in_reply_to":"9a8ffd7b_146d31cc","updated":"2015-12-01 06:59:29.000000000","message":"Yes, a definite oversight :)","commit_id":"b6bde47e635f757adb340eb5d453ffeadce83b60"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"c0c0587a77004111fb3384c8a482ac0a1412caa5","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                                    \"net-mtu\", \"vlan-transparent\","},{"line_number":126,"context_line":"                                    \"address-scope\", \"dns-integration\","},{"line_number":127,"context_line":"                                    \"availability_zone\","},{"line_number":128,"context_line":"                                    \"network_availability_zone\", \"bgp\"]"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @property"},{"line_number":131,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a7e1126_925fb5e4","line":128,"range":{"start_line":128,"start_character":69,"end_line":128,"end_character":71},"updated":"2015-12-18 02:03:31.000000000","message":"Should add \"bgp_dragent_scheduler\" to _supported_extension_aliases, I comment this in patch set 29 and patch set 30, pls address it.","commit_id":"91845a3d443b217b5b33559a3a11c4906361078c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4e6c6603640ca98206ea0a0579852c4c37c1cdb9","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                                    \"net-mtu\", \"vlan-transparent\","},{"line_number":126,"context_line":"                                    \"address-scope\", \"dns-integration\","},{"line_number":127,"context_line":"                                    \"availability_zone\","},{"line_number":128,"context_line":"                                    \"network_availability_zone\", \"bgp\"]"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @property"},{"line_number":131,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a7e1126_f4ea6c73","line":128,"range":{"start_line":128,"start_character":69,"end_line":128,"end_character":71},"in_reply_to":"3a7e1126_925fb5e4","updated":"2015-12-19 10:42:49.000000000","message":"+1. Will correct.","commit_id":"91845a3d443b217b5b33559a3a11c4906361078c"}],"neutron/scheduler/bgp_dragent_scheduler.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9f3252093312e35980de06277fb7bf18284935cf","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class BGPDRScheduler(BGPDRSchedulerBase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Schedule non-hosted BGP speaker to a DR agent."},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_eddf5838","line":42,"updated":"2015-08-24 20:31:39.000000000","message":"I\u0027d prefer an API for auto-scheduling from the perspective of the bgp_speaker rather initiating scheduling from the perspective of the agent.  From an operator perspective, I would be expecting to take a bgp_speaker and schedule it somewhere.  I think the API should reflect that.  Instead of specifying an agent and automatically identifying a bgp_speaker, I think we should specify a bgp_speaker and automatically Identify an agent for it.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fa9dd1504b7fd50df648e2e95b904fa8b5aa657d","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class BGPDRScheduler(BGPDRSchedulerBase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Schedule non-hosted BGP speaker to a DR agent."},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_548eba2e","line":42,"in_reply_to":"fa1b9901_b3ea16ab","updated":"2015-08-26 09:53:03.000000000","message":"Addressed in PS11.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"c247ba099b70d9c9860e38e9459ee75d915156bb","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class BGPDRScheduler(BGPDRSchedulerBase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def auto_schedule_bgp_speakers(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Schedule non-hosted BGP speaker to a DR agent."},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_b3ea16ab","line":42,"in_reply_to":"fa1b9901_eddf5838","updated":"2015-08-25 04:21:59.000000000","message":"+1. A new scheduler needs to be implemented (may be derived from BaseScheduler (https://github.com/openstack/neutron/blob/master/neutron/scheduler/base_scheduler.py#L54)","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9f3252093312e35980de06277fb7bf18284935cf","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        return query.count() \u003e 0"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _bind_bgp_speakers(self, context, bgp_speaker_id, agent_id):"},{"line_number":88,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":89,"context_line":"            binding \u003d bgp_dras_db.BGPSpeakerDRAgentBinding()"},{"line_number":90,"context_line":"            binding.agent_id \u003d agent_id"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_7aec60f3","line":87,"updated":"2015-08-24 20:31:39.000000000","message":"nit: rename to _bind_bgp_speaker()","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fa9dd1504b7fd50df648e2e95b904fa8b5aa657d","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        return query.count() \u003e 0"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _bind_bgp_speakers(self, context, bgp_speaker_id, agent_id):"},{"line_number":88,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":89,"context_line":"            binding \u003d bgp_dras_db.BGPSpeakerDRAgentBinding()"},{"line_number":90,"context_line":"            binding.agent_id \u003d agent_id"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_d493aa59","line":87,"in_reply_to":"fa1b9901_7aec60f3","updated":"2015-08-26 09:53:03.000000000","message":"Addressed in PS11.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3da9b34570a82c3437e20380beaedc7b3b0242f5","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"            unscheduled_speakers \u003d self._get_unscheduled_bgp_speakers(context)"},{"line_number":63,"context_line":"            if not unscheduled_speakers:"},{"line_number":64,"context_line":"                LOG.debug(\u0027Nothing to auto-schedule on host %s\u0027, host)"},{"line_number":65,"context_line":"                return False"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"            self._bind_bgp_speaker(context, unscheduled_speakers[0],"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_5752ba68","line":64,"updated":"2015-08-27 12:43:53.000000000","message":"Can we reword as \"No BGP speaker to auto-schedule on host %s\".","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3da9b34570a82c3437e20380beaedc7b3b0242f5","unresolved":false,"context_lines":[{"line_number":114,"context_line":"class BgpDrAgentFilter(base_resource_filter.BaseResourceFilter):"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def bind(self, context, agents, bgp_speaker_id):"},{"line_number":117,"context_line":"        \"\"\"Bind the bgp speaker to the agents.\"\"\""},{"line_number":118,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":119,"context_line":"        for agent in agents:"},{"line_number":120,"context_line":"            context.session.begin(subtransactions\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_77b49ef1","line":117,"updated":"2015-08-27 12:43:53.000000000","message":"Please use \"dragent\" for uniformity. Request to check all occurrences.","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3da9b34570a82c3437e20380beaedc7b3b0242f5","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            # saving agent_id to use it after rollback to avoid"},{"line_number":122,"context_line":"            # DetachedInstanceError"},{"line_number":123,"context_line":"            agent_id \u003d agent.id"},{"line_number":124,"context_line":"            binding \u003d bgp_dras_db.BgpSpeakerDrAgentBinding()"},{"line_number":125,"context_line":"            binding.agent_id \u003d agent_id"},{"line_number":126,"context_line":"            binding.bgp_speaker_id \u003d bgp_speaker_id"},{"line_number":127,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_37dce6e3","line":124,"updated":"2015-08-27 12:43:53.000000000","message":"This logic is same as \"_bind_bgp_speaker\". Can we reuse the same function over here?","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"}],"neutron/services/bgp/agent/scheduler/bgp_dragent_scheduler.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb77514ef9d65a516872e3d38648e6836619a34f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":12,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"# under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_db import exception as db_exc"},{"line_number":17,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba15a1d1_d631635a","line":14,"updated":"2015-09-24 07:23:24.000000000","message":"Let\u0027s rename it to \u0027bgp_dragentscheduler.py\u0027 to make it consistent with bgp_dragentschedulers_db.py naming convention.","commit_id":"df0d32089960cf18849cffad39be8f89ad292c4f"}],"neutron/services/bgp/bgp_plugin.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"                bgp_db.BgpDbMixin,"},{"line_number":23,"context_line":"                bgp_dragentscheduler_db.BgpDrAgentSchedulerDbMixin):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    supported_extension_aliases \u003d [\"bgp\"]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self):"},{"line_number":28,"context_line":"        super(BgpPlugin, self).__init__()"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_80f6f18c","line":25,"updated":"2016-01-26 05:51:47.000000000","message":"enable bgp_drscheduler extension.","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4341b4885343d96851a95a4d4d81b7febfce22f4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    supported_extension_aliases \u003d [\"bgp\", \"bgp_dragent_scheduler\"]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self):"},{"line_number":28,"context_line":"        super(BgpPlugin, self).__init__()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def get_plugin_name(self):"},{"line_number":31,"context_line":"        return constants.BGP"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a68dd71_3fa95225","line":28,"updated":"2016-01-26 11:39:17.000000000","message":"Add:\nself.bgp_drscheduler \u003d importutils.import_object(cfg.CONF.bgp_drscheduler_driver)","commit_id":"57a10874fa1657ddf7bbedce460c1c3d634af6a6"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self):"},{"line_number":35,"context_line":"        super(BgpPlugin, self).__init__()"},{"line_number":36,"context_line":"        self.bgp_drscheduler \u003d importutils.import_object("},{"line_number":37,"context_line":"            cfg.CONF.bgp_drscheduler_driver)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def get_plugin_name(self):"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_38a97e24","line":36,"range":{"start_line":36,"start_character":13,"end_line":36,"end_character":28},"updated":"2016-02-08 21:07:58.000000000","message":"I\u0027m curious why this is set here and not in the scheduler mixin.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ee2f7b417b80c06a47ddd278fe7a695096590181","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self):"},{"line_number":35,"context_line":"        super(BgpPlugin, self).__init__()"},{"line_number":36,"context_line":"        self.bgp_drscheduler \u003d importutils.import_object("},{"line_number":37,"context_line":"            cfg.CONF.bgp_drscheduler_driver)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def get_plugin_name(self):"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_bd6b0af1","line":36,"range":{"start_line":36,"start_character":13,"end_line":36,"end_character":28},"in_reply_to":"5a5ae5dd_38a97e24","updated":"2016-02-09 03:10:55.000000000","message":"Followed L3 router plugin code.\nhttps://github.com/openstack/neutron/blob/master/neutron/services/l3_router/l3_router_plugin.py#L64-L65\n\nWe can anyways do it in the mixin as well.","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"}],"neutron/services/bgp/scheduler/bgp_dragent_scheduler.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"130b028e9b0e68b7c5afadea33963d2782a50956","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                                       dragent_bindings))"},{"line_number":101,"context_line":"        n_agents \u003d dragents_per_bgp_speaker - num_dragents_hosting_bgp_speaker"},{"line_number":102,"context_line":"        if n_agents \u003c\u003d 0:"},{"line_number":103,"context_line":"            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        active_dragents \u003d self._get_active_dragents(plugin, context)"},{"line_number":106,"context_line":"        if not active_dragents:"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a1a9d01_474b7f2a","line":103,"updated":"2015-09-29 13:42:57.000000000","message":"Correct me if I am wrong: if the number of dragents_per_bgp_speaker is 1 and you are getting the number of agents with an already existent binding in the var num_agents_hosting_bgp_speaker, even if you have 1000 agents running and a single one that hosts a bgp_speaker, you will always return this value (1-1 \u003d  0 ), right?\n\nShouldn\u0027t be this statement:\n\n  n_agents \u003d active_dragents - num_dragents_hosting_bgp_speaker\n        if n_agents \u003c\u003d 0:\n            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}\n\nAnd move:\n\n  active_dragents \u003d self._get_active_dragents(plugin, context)\n        if not active_dragents:\n            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}\n\nbefore?","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"130b028e9b0e68b7c5afadea33963d2782a50956","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                LOG.debug(\u0027Nothing to auto-schedule on host %s\u0027, host)"},{"line_number":154,"context_line":"                return False"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"            self.bind(context, [bgp_dragent], unscheduled_speakers[0])"},{"line_number":157,"context_line":"        return True"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _is_bgp_speaker_hosted(self, context, agent_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a1a9d01_ec9dd866","line":156,"updated":"2015-09-29 13:42:57.000000000","message":"Why only the first unscheduled speaker?","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"78045422c5665cd8aa245e66d2872c58f948eb7a","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                LOG.debug(\u0027Nothing to auto-schedule on host %s\u0027, host)"},{"line_number":154,"context_line":"                return False"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"            self.bind(context, [bgp_dragent], unscheduled_speakers[0])"},{"line_number":157,"context_line":"        return True"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _is_bgp_speaker_hosted(self, context, agent_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a1a9d01_a3804ec0","line":156,"in_reply_to":"9a1a9d01_ec9dd866","updated":"2015-09-29 14:10:15.000000000","message":"We will change it. It\u0027s being recorded as an \u0027Outstanding Item\u0027 in the commit msg.","commit_id":"0fd425490a5bb7d7ac1853fbbf4e5d2cdda8a872"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4341b4885343d96851a95a4d4d81b7febfce22f4","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def bind(self, context, agents, bgp_speaker_id):"},{"line_number":36,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":37,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":38,"context_line":"        for agent in agents:"},{"line_number":39,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":40,"context_line":"            # saving agent_id to use it after rollback to avoid"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a68dd71_bf330262","line":37,"updated":"2016-01-26 11:39:17.000000000","message":"Address PS37 comments.","commit_id":"57a10874fa1657ddf7bbedce460c1c3d634af6a6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"baa594bf5b37a84f7767a4fc10012ae23f2175e1","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                    \u0027agent_type\u0027: [constants.AGENT_TYPE_BGP_ROUTING],"},{"line_number":75,"context_line":"                    \u0027admin_state_up\u0027: [True]})"},{"line_number":76,"context_line":"            if not active_dragents:"},{"line_number":77,"context_line":"                LOG.warn(_LW(\u0027No more BgpDrAgents\u0027))"},{"line_number":78,"context_line":"                return []"},{"line_number":79,"context_line":"        return active_dragents"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"9a68dd71_754498b6","line":77,"updated":"2016-01-27 09:28:42.000000000","message":"warn is deprecated. Use warning instead.","commit_id":"57a10874fa1657ddf7bbedce460c1c3d634af6a6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a9b7838471e8798245e2a8c5395a3d129f871b4f","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def bind(self, context, agents, bgp_speaker_id):"},{"line_number":36,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":37,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":38,"context_line":"        for agent in agents:"},{"line_number":39,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":40,"context_line":"            # saving agent_id to use it after rollback to avoid"}],"source_content_type":"text/x-python","patch_set":44,"id":"7a5de9d1_f67925c9","line":37,"updated":"2016-01-29 14:55:54.000000000","message":"Address PS37 comments.","commit_id":"4b04e230c5318fbd18d89ec4ac3e9a1761bdece6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"96d0eb190d1f0e1fa7e790801da717e4f6688412","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def bind(self, context, agents, bgp_speaker_id):"},{"line_number":36,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":37,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":38,"context_line":"        for agent in agents:"},{"line_number":39,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":40,"context_line":"            # saving agent_id to use it after rollback to avoid"}],"source_content_type":"text/x-python","patch_set":45,"id":"7a5de9d1_d5705842","line":37,"updated":"2016-02-01 14:15:56.000000000","message":"Address PS37 comments.","commit_id":"745defad46d25bde5ab7bb1ce8a86896d4ebc7a9"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"96d0eb190d1f0e1fa7e790801da717e4f6688412","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                                                       dragent_bindings))"},{"line_number":102,"context_line":"        n_agents \u003d dragents_per_bgp_speaker - num_dragents_hosting_bgp_speaker"},{"line_number":103,"context_line":"        if n_agents \u003c\u003d 0:"},{"line_number":104,"context_line":"            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        active_dragents \u003d self._get_active_dragents(plugin, context)"},{"line_number":107,"context_line":"        if not active_dragents:"}],"source_content_type":"text/x-python","patch_set":45,"id":"7a5de9d1_f5a6b4ac","line":104,"updated":"2016-02-01 14:15:56.000000000","message":"add \u0027hosted_agents\u0027 which got introduced as part of https://github.com/openstack/neutron/commit/65aea5d57728a7dcf9ad9665693305f97fd1918d change.","commit_id":"745defad46d25bde5ab7bb1ce8a86896d4ebc7a9"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1a7c7726aa17ba210d5ed867461ecc608e836406","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                                                       dragent_bindings))"},{"line_number":102,"context_line":"        n_agents \u003d dragents_per_bgp_speaker - num_dragents_hosting_bgp_speaker"},{"line_number":103,"context_line":"        if n_agents \u003c\u003d 0:"},{"line_number":104,"context_line":"            return {\u0027n_agents\u0027: 0, \u0027hostable_agents\u0027: []}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        active_dragents \u003d self._get_active_dragents(plugin, context)"},{"line_number":107,"context_line":"        if not active_dragents:"}],"source_content_type":"text/x-python","patch_set":45,"id":"7a5de9d1_60672eeb","line":104,"in_reply_to":"7a5de9d1_f5a6b4ac","updated":"2016-02-02 10:45:02.000000000","message":"done","commit_id":"745defad46d25bde5ab7bb1ce8a86896d4ebc7a9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":37,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":38,"context_line":"        for agent in agents:"},{"line_number":39,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":40,"context_line":"            # saving agent_id to use it after rollback to avoid"},{"line_number":41,"context_line":"            # DetachedInstanceError"},{"line_number":42,"context_line":"            agent_id \u003d agent.id"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_4e8d90d1","line":39,"range":{"start_line":39,"start_character":12,"end_line":39,"end_character":55},"updated":"2016-02-08 21:07:58.000000000","message":"Still don\u0027t like the explicit begin/rollback/commit pattern:\n\n  try:\n      with context.session.begin(...):\n          context.session.add(binding)\n  except db_exc.DBDuplicateEntry:\n      bound_agents.remove(agent)\n\nActually, looking at this, I\u0027m not even sure why you need a transaction, or a rollback.  If we get a DBDuplicateEntry exception then there would be nothing to rollback, right?","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"864a88781c39d0ec51c3a1f69935ee6db87092e0","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \"\"\"Bind the BgpSpeaker to a BgpDrAgent.\"\"\""},{"line_number":37,"context_line":"        bound_agents \u003d agents[:]"},{"line_number":38,"context_line":"        for agent in agents:"},{"line_number":39,"context_line":"            context.session.begin(subtransactions\u003dTrue)"},{"line_number":40,"context_line":"            # saving agent_id to use it after rollback to avoid"},{"line_number":41,"context_line":"            # DetachedInstanceError"},{"line_number":42,"context_line":"            agent_id \u003d agent.id"}],"source_content_type":"text/x-python","patch_set":51,"id":"3a57f1b5_244b92b2","line":39,"range":{"start_line":39,"start_character":12,"end_line":39,"end_character":55},"in_reply_to":"5a5ae5dd_4e8d90d1","updated":"2016-02-09 17:32:40.000000000","message":"I think just adding a unique constraint to the model on agent_id makes all this unnecessary.  I agree we should just be able to raise DBDuplicateEntry (or maybe wrap it if there\u0027s a really good reason)","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        hostable_dragents \u003d ["},{"line_number":109,"context_line":"            agent for agent in set(active_dragents)"},{"line_number":110,"context_line":"            if agent.id not in agents_hosting and plugin.is_eligible_agent("},{"line_number":111,"context_line":"                True, agent)"},{"line_number":112,"context_line":"        ]"},{"line_number":113,"context_line":"        if not hostable_dragents:"},{"line_number":114,"context_line":"            return {\u0027n_agents\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_8eae282c","line":111,"range":{"start_line":111,"start_character":16,"end_line":111,"end_character":20},"updated":"2016-02-08 21:07:58.000000000","message":"See comment on PS37 [1]\n\n [1] https://review.openstack.org/#/c/207607/37/neutron/agent/bgp/bgp_dragent_scheduler.py@112","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"aada8526f5a92e97ffa8e769748e2650a6ce2d69","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                LOG.warn(_LW(\u0027BgpDrAgent %s is down\u0027), bgp_dragent.id)"},{"line_number":146,"context_line":"                return False"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"            if self._is_bgp_speaker_hosted(context, bgp_dragent[\u0027id\u0027]):"},{"line_number":149,"context_line":"                # One BgpDrAgent can only host one BGP speaker"},{"line_number":150,"context_line":"                LOG.debug(\u0027BgpDrAgent already hosting a speaker on host %s. \u0027"},{"line_number":151,"context_line":"                          \u0027Cannot schedule an another one\u0027, host)"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_4e7b50be","line":148,"range":{"start_line":148,"start_character":20,"end_line":148,"end_character":42},"updated":"2016-02-08 21:07:58.000000000","message":"See comment on PS37 [1]\n\n [1] https://review.openstack.org/#/c/207607/37/neutron/agent/bgp/bgp_dragent_scheduler.py@145","commit_id":"72d1fe10d1187a218bdbbdf42aeb98c1fbee1560"}],"neutron/services/bgp_speaker/plugin.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class BgpSpeakerPlugin(bgp_speaker_db.BgpSpeakerDbMixin,"},{"line_number":26,"context_line":"                       bgp_dras_db.BgpDynamicRoutingAgentSchedulerDbMixin):"},{"line_number":27,"context_line":"    \"\"\"Base service plugin implementation for BGP speaker plugin.\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    supported_extension_aliases \u003d [\"bgp_speaker\","}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_b94add53","line":26,"updated":"2015-08-01 05:24:36.000000000","message":"Since we have used DRAgent at most of the places so it will be better if we can rename \"BgpDynamicRoutingAgentSchedulerDbMixin\" to \"BGPDRAgentSchedulerDbMixin\" for consistency.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class BgpSpeakerPlugin(bgp_speaker_db.BgpSpeakerDbMixin,"},{"line_number":26,"context_line":"                       bgp_dras_db.BgpDynamicRoutingAgentSchedulerDbMixin):"},{"line_number":27,"context_line":"    \"\"\"Base service plugin implementation for BGP speaker plugin.\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    supported_extension_aliases \u003d [\"bgp_speaker\","}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_e948cece","line":26,"in_reply_to":"3a50d1a3_b94add53","updated":"2015-08-10 12:34:57.000000000","message":"Done.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"62a4039acb26d3e93d793f1a06f7c850759ea167","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        self.bgp_dr_scheduler \u003d importutils.import_object("},{"line_number":35,"context_line":"            cfg.CONF.bgp_dr_scheduler_driver)"},{"line_number":36,"context_line":"        super(BgpSpeakerPlugin, self).__init__()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get_plugin_name(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_396d6dcc","line":35,"updated":"2015-08-01 05:24:36.000000000","message":"How about renaming it as \"bgp_speaker_scheduler_driver\" instead?","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        self.bgp_dr_scheduler \u003d importutils.import_object("},{"line_number":35,"context_line":"            cfg.CONF.bgp_dr_scheduler_driver)"},{"line_number":36,"context_line":"        super(BgpSpeakerPlugin, self).__init__()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get_plugin_name(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_89102aaa","line":35,"in_reply_to":"3a50d1a3_396d6dcc","updated":"2015-08-10 12:34:57.000000000","message":"rename to \"bgp_drscheduler_driver\"","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9f3252093312e35980de06277fb7bf18284935cf","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            cfg.CONF.bgp_drscheduler_driver)"},{"line_number":46,"context_line":"        super(BgpSpeakerPlugin, self).__init__()"},{"line_number":47,"context_line":"        self._register_callbacks()"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_plugin_name(self):"},{"line_number":50,"context_line":"        return constants.BGP_SPEAKER"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_4dc8c474","line":48,"updated":"2015-08-24 20:31:39.000000000","message":"The following 2 methods belong in the parent review, not this patch.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"43cee3afd0c427e3b5f34f715b3ab42581dfba59","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            cfg.CONF.bgp_drscheduler_driver)"},{"line_number":46,"context_line":"        super(BgpSpeakerPlugin, self).__init__()"},{"line_number":47,"context_line":"        self._register_callbacks()"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_plugin_name(self):"},{"line_number":50,"context_line":"        return constants.BGP_SPEAKER"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_3997c491","line":48,"in_reply_to":"fa1b9901_4dc8c474","updated":"2015-08-25 06:56:27.000000000","message":"Ok. Please take care of this Ryan!","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"}],"neutron/tests/common/helpers.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        context.get_admin_context(), agent[\u0027agent_type\u0027], agent[\u0027host\u0027])"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def _get_bgp_dragent_dict(host, bgp_speakers\u003d0):"},{"line_number":111,"context_line":"    agent \u003d {"},{"line_number":112,"context_line":"        \u0027binary\u0027: \u0027neutron-bgp-dragent\u0027,"},{"line_number":113,"context_line":"        \u0027host\u0027: host,"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_abf11fcf","line":110,"range":{"start_line":110,"start_character":44,"end_line":110,"end_character":46},"updated":"2016-01-08 19:18:55.000000000","message":"I don\u0027t think there should be a default value here.  I prefer not to have them.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        context.get_admin_context(), agent[\u0027agent_type\u0027], agent[\u0027host\u0027])"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def _get_bgp_dragent_dict(host, bgp_speakers\u003d0):"},{"line_number":111,"context_line":"    agent \u003d {"},{"line_number":112,"context_line":"        \u0027binary\u0027: \u0027neutron-bgp-dragent\u0027,"},{"line_number":113,"context_line":"        \u0027host\u0027: host,"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_3bc40f5e","line":110,"range":{"start_line":110,"start_character":44,"end_line":110,"end_character":46},"in_reply_to":"fa69d971_abf11fcf","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    return agent"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"def register_bgp_dragent(host\u003dHOST, bgp_speakers\u003d0, admin_state_up\u003dTrue,"},{"line_number":121,"context_line":"                        alive\u003dTrue):"},{"line_number":122,"context_line":"    agent \u003d _register_agent("},{"line_number":123,"context_line":"        _get_bgp_dragent_dict(host, bgp_speakers))"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_6b880723","line":120,"range":{"start_line":120,"start_character":36,"end_line":120,"end_character":50},"updated":"2016-01-08 19:18:55.000000000","message":"I couldn\u0027t find anyone who passes bgp_speakers at all.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"66d3d46b234552abac4ed8da298d7c80a5517d85","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    return agent"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"def register_bgp_dragent(host\u003dHOST, bgp_speakers\u003d0, admin_state_up\u003dTrue,"},{"line_number":121,"context_line":"                        alive\u003dTrue):"},{"line_number":122,"context_line":"    agent \u003d _register_agent("},{"line_number":123,"context_line":"        _get_bgp_dragent_dict(host, bgp_speakers))"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_2babef8a","line":120,"range":{"start_line":120,"start_character":29,"end_line":120,"end_character":34},"updated":"2016-01-08 19:18:55.000000000","message":"Why is host defaulted?  As far as I can tell, all of the callers pass the host explicitly.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    return agent"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"def register_bgp_dragent(host\u003dHOST, bgp_speakers\u003d0, admin_state_up\u003dTrue,"},{"line_number":121,"context_line":"                        alive\u003dTrue):"},{"line_number":122,"context_line":"    agent \u003d _register_agent("},{"line_number":123,"context_line":"        _get_bgp_dragent_dict(host, bgp_speakers))"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_1bc7cb65","line":120,"range":{"start_line":120,"start_character":29,"end_line":120,"end_character":34},"in_reply_to":"fa69d971_2babef8a","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"}],"neutron/tests/etc/policy.json":[{"author":{"_account_id":16788,"name":"Ramanjaneya Reddy Palleti","email":"ramanjaneya.palleti@huawei.com","username":"Ramanjaneya"},"change_message_id":"cb58f18e8d43dd23ba90c0872b6d00f6f054c19b","unresolved":false,"context_lines":[{"line_number":193,"context_line":"    \"stop_network_advertisement\": \"rule:admin_only\","},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\""},{"line_number":196,"context_line":"    "},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","}],"source_content_type":"application/json","patch_set":1,"id":"1a4dcd0f_6c9d7958","line":196,"updated":"2015-08-05 09:13:36.000000000","message":"run pep8?","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"38e276e05ad2778c806d3b03cb35be0254587226","unresolved":false,"context_lines":[{"line_number":193,"context_line":"    \"stop_network_advertisement\": \"rule:admin_only\","},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\""},{"line_number":196,"context_line":"    "},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","}],"source_content_type":"application/json","patch_set":1,"id":"1a4dcd0f_fd14d144","line":196,"in_reply_to":"1a4dcd0f_6c9d7958","updated":"2015-08-05 09:55:30.000000000","message":"I ran :-). Thanks for catching it.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"27b495b408104ab342696670572b36845f75dcfa","unresolved":false,"context_lines":[{"line_number":193,"context_line":"    \"stop_network_advertisement\": \"rule:admin_only\","},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\""},{"line_number":196,"context_line":"    "},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","}],"source_content_type":"application/json","patch_set":1,"id":"1a4dcd0f_8987cad6","line":196,"in_reply_to":"1a4dcd0f_fd14d144","updated":"2015-08-10 12:34:57.000000000","message":"Done.","commit_id":"83f1bcb2dce814dfcd8fa5286c77a67d96f0d53e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cdff2937567037cdcdfaa504a7952c66664ba75f","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\","},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","},{"line_number":200,"context_line":"    \"list_dragent_hosting_bgp_speaker\": \"rule:admin\""}],"source_content_type":"application/json","patch_set":4,"id":"1a4dcd0f_c51d2974","line":197,"updated":"2015-08-12 20:51:47.000000000","message":"be sure this matches etc/policy.json","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a8e11aa0f1628d94bd2ff12b2ecd551e1c7d44eb","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\","},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","},{"line_number":200,"context_line":"    \"list_dragent_hosting_bgp_speaker\": \"rule:admin\""}],"source_content_type":"application/json","patch_set":4,"id":"fa1b9901_bde939e8","line":197,"in_reply_to":"1a4dcd0f_47526a14","updated":"2015-08-20 12:14:44.000000000","message":"Done.","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ac73a25509aa74c775288f04c4dc5e701fbfb792","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    \"get_advertised_routes\":\"rule:admin_only\","},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    \"add_bgp_speaker_to_dragent\": \"rule:admin\","},{"line_number":198,"context_line":"    \"remove_bgp_speaker_from_dragent\": \"rule:admin\","},{"line_number":199,"context_line":"    \"list_bgp_speaker_on_dragent\": \"rule:admin\","},{"line_number":200,"context_line":"    \"list_dragent_hosting_bgp_speaker\": \"rule:admin\""}],"source_content_type":"application/json","patch_set":4,"id":"1a4dcd0f_47526a14","line":197,"in_reply_to":"1a4dcd0f_c51d2974","updated":"2015-08-13 04:39:45.000000000","message":"+1","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"}],"neutron/tests/functional/bgp/scheduler/test_bgp_dragent_scheduler.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c853e01615e8a988ee01c758a1d9e3dcc81b677","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_7bced6b5","line":1,"updated":"2016-01-08 03:49:27.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_9b809bf9","line":1,"in_reply_to":"fa69d971_7bced6b5","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_671c3214","line":1,"updated":"2016-01-26 05:51:47.000000000","message":"2016","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"}],"neutron/tests/functional/scheduler/test_bgp_dragent_scheduler.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3da9b34570a82c3437e20380beaedc7b3b0242f5","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            i \u003d i + 1"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _test_auto_schedule(self, host_index):"},{"line_number":163,"context_line":"        scheduler \u003d bgp_dragent_scheduler.BGPDRScheduler()"},{"line_number":164,"context_line":"        self.ctx \u003d context.get_admin_context()"},{"line_number":165,"context_line":"        msg \u003d \u0027host_index \u003d %s\u0027 % host_index"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_377dc61c","line":163,"updated":"2015-08-27 12:43:53.000000000","message":"Replace BGPDRScheduler \u003d\u003d\u003e ChanceScheduler to correct functional test failures.","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"813601d86ac7b83ce9a34930f4f00a3ae6704f8d","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            i \u003d i + 1"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _test_auto_schedule(self, host_index):"},{"line_number":163,"context_line":"        scheduler \u003d bgp_dragent_scheduler.BGPDRScheduler()"},{"line_number":164,"context_line":"        self.ctx \u003d context.get_admin_context()"},{"line_number":165,"context_line":"        msg \u003d \u0027host_index \u003d %s\u0027 % host_index"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_81a403a6","line":163,"in_reply_to":"da20952f_377dc61c","updated":"2015-09-05 08:31:54.000000000","message":"Addressed.","commit_id":"e8a774e3ded1203e063ce3263c13af7c0fc5426f"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ef4869bd31a494d31dea3fb7253b2002982ad959","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    scenarios \u003d ["},{"line_number":66,"context_line":"        (\u0027No BgpDrAgent scheduled, if no DRAgent is present\u0027,"},{"line_number":67,"context_line":"         dict(host_count\u003d1,"},{"line_number":68,"context_line":"              agent_count\u003d0,"},{"line_number":69,"context_line":"              down_agent_count\u003d0,"}],"source_content_type":"text/x-python","patch_set":15,"id":"da20952f_e2794a83","line":66,"updated":"2015-08-31 07:18:42.000000000","message":"Please fix other occurrences as well.","commit_id":"3b44cd11df2acb4f97f2e23d361a9ae8825cb721"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"779f59fac343184683d5e4924e3058ab1d302fa4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    scenarios \u003d ["},{"line_number":66,"context_line":"        (\u0027No BgpDrAgent scheduled, if no DRAgent is present\u0027,"},{"line_number":67,"context_line":"         dict(host_count\u003d1,"},{"line_number":68,"context_line":"              agent_count\u003d0,"},{"line_number":69,"context_line":"              down_agent_count\u003d0,"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_e1acdfa0","line":66,"updated":"2015-09-05 08:32:17.000000000","message":"Address PS15 comment","commit_id":"9797b6b55c46a44601899da67fc70d5de5591d7b"}],"neutron/tests/functional/services/bgp/scheduler/test_bgp_dragent_scheduler.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"df8127e7465d6d07b5ac9b65245b0793b4ae94ad","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        # pre schedule the bgp_speakers to the agents defined in"},{"line_number":183,"context_line":"        # self.hosted_bgp_speakers before calling auto_schedule_bgp_speaker"},{"line_number":184,"context_line":"        for agent, bgp_speakers in six.iteritems(self.hosted_bgp_speakers):"},{"line_number":185,"context_line":"            agent_index \u003d self._extract_index(agent)"},{"line_number":186,"context_line":"            for bgp_speaker in bgp_speakers:"},{"line_number":187,"context_line":"                bs_index \u003d self._extract_index(bgp_speaker)"}],"source_content_type":"text/x-python","patch_set":56,"id":"3a57f1b5_6c45b3b1","line":184,"range":{"start_line":184,"start_character":35,"end_line":184,"end_character":38},"updated":"2016-02-10 17:46:15.000000000","message":"nit:  Don\u0027t import six just for iteritems.  Just do this:\n\n  for agent, bgp_speakers in self.hosted_bgp_speakers.items():","commit_id":"d37f63bc4ab99c6942d936d4f3e7b28080771270"}],"neutron/tests/unit/db/test_bgp_dragentscheduler_db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c853e01615e8a988ee01c758a1d9e3dcc81b677","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":37,"id":"fa69d971_dbbd8203","line":1,"updated":"2016-01-08 03:49:27.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","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":41,"id":"9a68dd71_0719b622","line":1,"updated":"2016-01-26 05:51:47.000000000","message":"2016","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"}],"neutron/tests/unit/extensions/test_agent.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cdff2937567037cdcdfaa504a7952c66664ba75f","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            host\u003dL3_HOSTB, agent_mode\u003dconstants.L3_AGENT_MODE_DVR)"},{"line_number":126,"context_line":"        return [dvr_snat_agent, dvr_agent]"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _register_l3_agent(self, host):"},{"line_number":129,"context_line":"        helpers.register_l3_agent(host)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _register_bgp_dragent(self, host):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_e004d315","line":128,"updated":"2015-08-12 20:51:47.000000000","message":"What is this?","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ac73a25509aa74c775288f04c4dc5e701fbfb792","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            host\u003dL3_HOSTB, agent_mode\u003dconstants.L3_AGENT_MODE_DVR)"},{"line_number":126,"context_line":"        return [dvr_snat_agent, dvr_agent]"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _register_l3_agent(self, host):"},{"line_number":129,"context_line":"        helpers.register_l3_agent(host)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _register_bgp_dragent(self, host):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_077d426c","line":128,"in_reply_to":"1a4dcd0f_e004d315","updated":"2015-08-13 04:39:45.000000000","message":"Needed by \"def test_schedule_bgp_speaker_on_invalid_agent(self):\"","commit_id":"a054929d52aebf8b5704038508eac06c55e207de"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bbd1f5a7ba975acd38ed800955e24d0c820e9c9a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            host\u003dL3_HOSTB, agent_mode\u003dconstants.L3_AGENT_MODE_DVR)"},{"line_number":123,"context_line":"        return [dvr_snat_agent, dvr_agent]"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _register_l3_agent(self, host):"},{"line_number":126,"context_line":"        helpers.register_l3_agent(host)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _register_bgp_dragent(self, host):"}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_22d5b742","line":125,"updated":"2016-02-03 06:33:42.000000000","message":"why?","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f0d5b5a2db92586dc0f3591497b26d45219b3e4c","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            host\u003dL3_HOSTB, agent_mode\u003dconstants.L3_AGENT_MODE_DVR)"},{"line_number":123,"context_line":"        return [dvr_snat_agent, dvr_agent]"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _register_l3_agent(self, host):"},{"line_number":126,"context_line":"        helpers.register_l3_agent(host)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _register_bgp_dragent(self, host):"}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_4f2565a9","line":125,"in_reply_to":"5a5ae5dd_22d5b742","updated":"2016-02-03 14:01:52.000000000","message":"Used in https://review.openstack.org/#/c/207607/47/neutron/tests/unit/db/test_bgp_dragentscheduler_db.py (L109)","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bbd1f5a7ba975acd38ed800955e24d0c820e9c9a","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    def _register_l3_agent(self, host):"},{"line_number":126,"context_line":"        helpers.register_l3_agent(host)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _register_bgp_dragent(self, host):"},{"line_number":129,"context_line":"        helpers.register_bgp_dragent(host)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_c2c943ae","line":128,"updated":"2016-02-03 06:33:42.000000000","message":"red flag: pollution!","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f0d5b5a2db92586dc0f3591497b26d45219b3e4c","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    def _register_l3_agent(self, host):"},{"line_number":126,"context_line":"        helpers.register_l3_agent(host)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _register_bgp_dragent(self, host):"},{"line_number":129,"context_line":"        helpers.register_bgp_dragent(host)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"5a5ae5dd_6f2621bc","line":128,"in_reply_to":"5a5ae5dd_c2c943ae","updated":"2016-02-03 14:01:52.000000000","message":"Used in https://review.openstack.org/#/c/207607/47/neutron/tests/unit/db/test_bgp_dragentscheduler_db.py (L72)","commit_id":"9015851b8e7151c4810ae9031833165fc43d132a"}],"neutron/tests/unit/extensions/test_bgp_dragentscheduler.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1c853e01615e8a988ee01c758a1d9e3dcc81b677","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_bb3bee9b","line":1,"updated":"2016-01-08 03:49:27.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f81d7d760135f425e7af8b38bfe96811fe0491a8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_5ba2239c","line":1,"in_reply_to":"fa69d971_bb3bee9b","updated":"2016-01-26 08:38:11.000000000","message":"Done","commit_id":"c947fe0c0efc6b10f07961e5eb6544bac6e0df10"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"177365c93dd72268838697d19cc86fa8ba77ad0a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Huawei Technologies India Pvt. Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":41,"id":"9a68dd71_27163af2","line":1,"updated":"2016-01-26 05:51:47.000000000","message":"2016","commit_id":"c42ae0feaf6e5a084c6791acec2c42cd070961d8"}],"neutron/tests/unit/services/bgp/scheduler/test_bgp_dragent_scheduler.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4cb520cc55766278abefa57486b56c76a956e465","unresolved":false,"context_lines":[{"line_number":28,"context_line":"load_tests \u003d testscenarios.load_tests_apply_scenarios"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestBgpDrAgentSchedulerBaseTestCase(testlib_api.SqlTestCase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"},{"line_number":34,"context_line":"        super(TestBgpDrAgentSchedulerBaseTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a68dd71_5ac4545e","line":31,"updated":"2016-01-26 11:48:50.000000000","message":"This test-case file is duplicated of neutron/tests/unit/extensions/test_bgp_dragentscheduler.py. Let\u0027s keep either of them.","commit_id":"57a10874fa1657ddf7bbedce460c1c3d634af6a6"}],"neutron/tests/unit/services/bgp/test_bgp_dragent_scheduler.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb77514ef9d65a516872e3d38648e6836619a34f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":12,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"# under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import testscenarios"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"ba15a1d1_d6088382","line":14,"updated":"2015-09-24 07:23:24.000000000","message":"Let\u0027s rename it as \u0027test_bgp_dragentscheduler.py\u0027 and make it consistent.","commit_id":"df0d32089960cf18849cffad39be8f89ad292c4f"}],"neutron/tests/unit/services/bgp_speaker/test_bgp_speaker.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9f3252093312e35980de06277fb7bf18284935cf","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                    set_context\u003dFalse):"},{"line_number":156,"context_line":"        fmt \u003d fmt or self.fmt"},{"line_number":157,"context_line":"        if not local_as:"},{"line_number":158,"context_line":"            local_as \u003d \u00271234\u0027"},{"line_number":159,"context_line":"        bgp_speaker \u003d self._create_bgp_speaker(ip_version, tenant_id,"},{"line_number":160,"context_line":"                                               local_as,"},{"line_number":161,"context_line":"                                               advertise_fip_host_routes,"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_9adb74ed","line":158,"updated":"2015-08-24 20:31:39.000000000","message":"Not the way we want to set a default. I strongly suggest leaving this as it is in the base patch set.  Looking at the usability of this method, I think I want to make local_as a required arg just like ip_version.  I will change this in the parent review since it\u0027s still open.  TLDR  remove this change.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"43cee3afd0c427e3b5f34f715b3ab42581dfba59","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                    set_context\u003dFalse):"},{"line_number":156,"context_line":"        fmt \u003d fmt or self.fmt"},{"line_number":157,"context_line":"        if not local_as:"},{"line_number":158,"context_line":"            local_as \u003d \u00271234\u0027"},{"line_number":159,"context_line":"        bgp_speaker \u003d self._create_bgp_speaker(ip_version, tenant_id,"},{"line_number":160,"context_line":"                                               local_as,"},{"line_number":161,"context_line":"                                               advertise_fip_host_routes,"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_f9be2cfe","line":158,"in_reply_to":"fa1b9901_9adb74ed","updated":"2015-08-25 06:56:27.000000000","message":"Ok. Will wait for the parent patch changes.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9f3252093312e35980de06277fb7bf18284935cf","unresolved":false,"context_lines":[{"line_number":1159,"context_line":""},{"line_number":1160,"context_line":"    def test_schedule_multi_bgp_speaker_on_one_dragent(self):"},{"line_number":1161,"context_line":"        \"\"\"Test only one BGP speaker can be associated to one dragent.\"\"\""},{"line_number":1162,"context_line":"        with self.bgp_speaker(4, local_as\u003d\u00271234\u0027) as ri1:"},{"line_number":1163,"context_line":"            with self.bgp_speaker(4, local_as\u003d\u00272345\u0027) as ri2:"},{"line_number":1164,"context_line":"                self._register_bgp_dragent(host\u003d\u0027host1\u0027)"},{"line_number":1165,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_5a063c21","line":1162,"updated":"2015-08-24 20:31:39.000000000","message":"nit: \nSave some indentation like this:\n\n\"with self.bgp_speaker(4, \u00271234\u0027) as ri1, self.bgp_speaker(4, \u00272345\u0027) as ri2:\"","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"43cee3afd0c427e3b5f34f715b3ab42581dfba59","unresolved":false,"context_lines":[{"line_number":1159,"context_line":""},{"line_number":1160,"context_line":"    def test_schedule_multi_bgp_speaker_on_one_dragent(self):"},{"line_number":1161,"context_line":"        \"\"\"Test only one BGP speaker can be associated to one dragent.\"\"\""},{"line_number":1162,"context_line":"        with self.bgp_speaker(4, local_as\u003d\u00271234\u0027) as ri1:"},{"line_number":1163,"context_line":"            with self.bgp_speaker(4, local_as\u003d\u00272345\u0027) as ri2:"},{"line_number":1164,"context_line":"                self._register_bgp_dragent(host\u003d\u0027host1\u0027)"},{"line_number":1165,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_99f610f8","line":1162,"in_reply_to":"fa1b9901_5a063c21","updated":"2015-08-25 06:56:27.000000000","message":"ok","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fa9dd1504b7fd50df648e2e95b904fa8b5aa657d","unresolved":false,"context_lines":[{"line_number":1159,"context_line":""},{"line_number":1160,"context_line":"    def test_schedule_multi_bgp_speaker_on_one_dragent(self):"},{"line_number":1161,"context_line":"        \"\"\"Test only one BGP speaker can be associated to one dragent.\"\"\""},{"line_number":1162,"context_line":"        with self.bgp_speaker(4, local_as\u003d\u00271234\u0027) as ri1:"},{"line_number":1163,"context_line":"            with self.bgp_speaker(4, local_as\u003d\u00272345\u0027) as ri2:"},{"line_number":1164,"context_line":"                self._register_bgp_dragent(host\u003d\u0027host1\u0027)"},{"line_number":1165,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_f49b4e15","line":1162,"in_reply_to":"fa1b9901_99f610f8","updated":"2015-08-26 09:53:03.000000000","message":"Addressed in PS11.","commit_id":"3bbf3ec45ea25d8e89e201cc22096e77fa2e77c1"}],"tools/check_unit_test_structure.sh":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"08a0318868f073e1393764791da7566c312728d5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"^plugins/ml2/drivers/openvswitch/agent/test_ovs_tunnel.py$\""},{"line_number":31,"context_line":"    \"^plugins/openvswitch/test_agent_scheduler.py$\""},{"line_number":32,"context_line":"    \"^services/bgp/test_bgp_service.py$\""},{"line_number":33,"context_line":"    \"^services/bgp/test_bgp_dragent_scheduler.py$\""},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"error_count\u003d0"}],"source_content_type":"text/x-sh","patch_set":23,"id":"9a1a9d01_3ed10858","line":33,"updated":"2015-09-26 08:52:06.000000000","message":"Change to \"^services/bgp/scheduler/test_bgp_dragent_scheduler.py$\"","commit_id":"f7f6465594ba1a13d34c9f8c1f595e805c4ef331"}]}
