)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":11,"context_line":"also implements Ryu as a reference BGP Speaker driver for proof of concept."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Outstanding Items:"},{"line_number":14,"context_line":" - Notification of BGP speaker \u0026 peer stats to BgpDrAgent."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Partially-Implements: blueprint bgp-dynamic-routing"},{"line_number":17,"context_line":"Co-Authored-By: Ryan Tidwell \u003cryan.tidwell@hp.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"ba15a1d1_ccb85d78","line":14,"updated":"2015-09-22 09:54:25.000000000","message":"stats \u003d\u003d\u003e statistics","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3a58dd8da96c979bb6a92d0d834f28d25b9ceb92","unresolved":false,"context_lines":[{"line_number":11,"context_line":"also implements Ryu as a reference BGP Speaker driver for proof of concept."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Outstanding Items:"},{"line_number":14,"context_line":" - Notification of BGP speaker \u0026 peer stats to BgpDrAgent."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Partially-Implements: blueprint bgp-dynamic-routing"},{"line_number":17,"context_line":"Co-Authored-By: Ryan Tidwell \u003cryan.tidwell@hp.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9a1a9d01_21cecdb4","line":14,"in_reply_to":"ba15a1d1_ccb85d78","updated":"2015-09-26 12:31:47.000000000","message":"Done.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"}],"devstack/lib/bgp":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"64b0e0e5dcf782f7011f3dd7f416326db1039fa8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"RYU_BGP_SPEAKER_DRIVER\u003d\"neutron.services.bgp.driver.ryu.driver.RyuBgpDriver\""},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"function configure_bgp_service_plugin {"},{"line_number":4,"context_line":"    _neutron_service_plugin_class_add \"bgp\""}],"source_content_type":"application/octet-stream","patch_set":54,"id":"bae84128_3e718ce1","line":1,"updated":"2016-02-25 05:48:02.000000000","message":"better to put this is the settings file.\n\nhttps://github.com/openstack/neutron/blob/master/devstack/settings\n\nAll the constants are defined over there.","commit_id":"b33c4dd2ce394a0bca53b96ed9aeeeffbefd2456"}],"etc/bgp_dragent.ini":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a7f565240ddd50ba2013d8f16ad98b4a4022df25","unresolved":false,"context_lines":[{"line_number":6,"context_line":"# matches your plugin. Ryu is being used as a reference implemenatation."},{"line_number":7,"context_line":"# driver \u003d \u0027neutron.agent.bgp.driver.ryu_driver.RyuBGPDriver\u0027"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"# The BGP identifier of the BGP open message. This identifier MUST be the IPv4"},{"line_number":10,"context_line":"# address of the node where the dynamic routing agent holds the BGP speaker"},{"line_number":11,"context_line":"# lives. This IP address should be configured manually and statically."},{"line_number":12,"context_line":"# Refer to RFC 4271 for more information. This must be specified to make BGP"}],"source_content_type":"text/x-properties","patch_set":2,"id":"1a4dcd0f_7bf38d73","line":9,"updated":"2015-08-12 21:26:22.000000000","message":"Can we not peer over IPv6?","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8a39833323a84d8950e8d66c1dc5a0dec52a9d21","unresolved":false,"context_lines":[{"line_number":6,"context_line":"# matches your plugin. Ryu is being used as a reference implemenatation."},{"line_number":7,"context_line":"# driver \u003d \u0027neutron.agent.bgp.driver.ryu_driver.RyuBGPDriver\u0027"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"# The BGP identifier of the BGP open message. This identifier MUST be the IPv4"},{"line_number":10,"context_line":"# address of the node where the dynamic routing agent holds the BGP speaker"},{"line_number":11,"context_line":"# lives. This IP address should be configured manually and statically."},{"line_number":12,"context_line":"# Refer to RFC 4271 for more information. This must be specified to make BGP"}],"source_content_type":"text/x-properties","patch_set":2,"id":"1a4dcd0f_7ce371a4","line":9,"in_reply_to":"1a4dcd0f_7bf38d73","updated":"2015-08-13 10:10:03.000000000","message":"router_id is a 32 bit number and hence cannot have IPv6 representation.","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8864077149aaafcfcea6a0d72a86322e258cf362","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# functionality work."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":"# http://www.ietf.org/rfc/rfc4271.txt"},{"line_number":16,"context_line":"# router_id \u003d 1.1.1.1"}],"source_content_type":"text/x-properties","patch_set":2,"id":"fa1b9901_7e7b177c","line":16,"updated":"2015-08-24 07:55:46.000000000","message":"Remove spaces","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7bc4db9ecf5e1234352d925f62a923c859949197","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"# Show debugging output in log (sets DEBUG log level output)."},{"line_number":3,"context_line":"# debug \u003d False"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-properties","patch_set":6,"id":"da20952f_d23498fc","line":1,"updated":"2015-09-09 10:27:30.000000000","message":"Take the [DEFAULT] section in the base patch.","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0be0e55878e9603c48a17e01de3e05f2334392d3","unresolved":false,"context_lines":[{"line_number":5,"context_line":"[BGP]"},{"line_number":6,"context_line":"# Class of BGP speaker to be instantiated. This class should implement the"},{"line_number":7,"context_line":"# interface defined in neutron.agent.bgp.driver. By default, it will be"},{"line_number":8,"context_line":"# initialisied to neutron.agent.bgp.driver.ryu_driver.RyuBgpDriver"},{"line_number":9,"context_line":"# bgp_speaker_driver \u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"# The BGP identifier of the BGP open message. This identifier MUST be the IPv4"}],"source_content_type":"text/x-properties","patch_set":12,"id":"ba15a1d1_cd365fe7","line":8,"updated":"2015-09-20 04:12:04.000000000","message":"Plz use the correct import path \u0027neutron.services.bgp_speaker.agent.driver.ryu_driver.RyuBgpDriver\u0027","commit_id":"644307d7de66b6733efd5c8be131bbe55e0eace7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0be0e55878e9603c48a17e01de3e05f2334392d3","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# lives. This IP address should be configured manually and statically."},{"line_number":14,"context_line":"# Refer to RFC 4271 for more information. This must be specified to make BGP"},{"line_number":15,"context_line":"# functionality work."},{"line_number":16,"context_line":"#"},{"line_number":17,"context_line":"# http://www.ietf.org/rfc/rfc4271.txt"},{"line_number":18,"context_line":"# bgp_router_id \u003d"}],"source_content_type":"text/x-properties","patch_set":12,"id":"ba15a1d1_ed07a316","line":16,"updated":"2015-09-20 04:12:04.000000000","message":"Remove this extra blank line.","commit_id":"644307d7de66b6733efd5c8be131bbe55e0eace7"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# lives. This IP address should be configured manually and statically."},{"line_number":15,"context_line":"# Refer to RFC 4271 (http://www.ietf.org/rfc/rfc4271.txt) for more information."},{"line_number":16,"context_line":"# This must be specified to make BGP functionality work."},{"line_number":17,"context_line":"# bgp_router_id \u003d"}],"source_content_type":"text/x-properties","patch_set":14,"id":"ba15a1d1_07d62e27","line":17,"updated":"2015-09-22 11:01:07.000000000","message":"According to the definition...\nShouldn\u0027t we call this parameter `bgp_router_ip` ?","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3456d089f6e5e11fd6dcb29f6874dd2f1b0c1191","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# lives. This IP address should be configured manually and statically."},{"line_number":15,"context_line":"# Refer to RFC 4271 (http://www.ietf.org/rfc/rfc4271.txt) for more information."},{"line_number":16,"context_line":"# This must be specified to make BGP functionality work."},{"line_number":17,"context_line":"# bgp_router_id \u003d"}],"source_content_type":"text/x-properties","patch_set":14,"id":"ba15a1d1_a8fdce3c","line":17,"in_reply_to":"ba15a1d1_07d62e27","updated":"2015-09-22 12:16:00.000000000","message":"BGP protocol calls this router_id. so, IMO, \u0027bgp_router_id\u0027 is better.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"}],"neutron/agent/bgp/agent.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6cc09d72c0f50ef1606537ab7211cf6e145fc810","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def __init__(self, host, conf\u003dNone):"},{"line_number":56,"context_line":"        super(BGPDRAgent, self).__init__()"},{"line_number":57,"context_line":"        self.needs_resync_reasons \u003d collections.defaultdict(list)"},{"line_number":58,"context_line":"        if conf:"},{"line_number":59,"context_line":"            self.conf \u003d conf"},{"line_number":60,"context_line":"        else:"},{"line_number":61,"context_line":"            self.conf \u003d cfg.CONF.BGP"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_5dedd0ed","line":58,"updated":"2015-08-28 05:26:32.000000000","message":"L58-L61 is being removed from the agent patch. Make sure to add this as a part of this patch.","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"}],"neutron/agent/bgp/bgp_dragent.py":[{"author":{"_account_id":17609,"name":"steve","email":"ruansx@cn.ibm.com","username":"steve.ruan"},"change_message_id":"f3d6d7e2e1242ce3436cfb516c4a8d99f0d033be","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                   \u0027nexthop\u0027: route[\u0027next_hop\u0027]})"},{"line_number":460,"context_line":"        try:"},{"line_number":461,"context_line":"            self.dr_driver_cls.advertise_route(bgp_speaker_as,"},{"line_number":462,"context_line":"                                               route[\u0027destination\u0027],"},{"line_number":463,"context_line":"                                               route[\u0027next_hop\u0027])"},{"line_number":464,"context_line":"        except Exception as e:"},{"line_number":465,"context_line":"            self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_294a7084","line":462,"range":{"start_line":462,"start_character":52,"end_line":462,"end_character":54},"updated":"2015-12-30 14:31:27.000000000","message":"It\u0027s better push all route info in a dict. For example, when VPN id is added, there is no need to change API definition.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0a085faa83d718506e555bb593af0c00be288d4b","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                   \u0027nexthop\u0027: route[\u0027next_hop\u0027]})"},{"line_number":460,"context_line":"        try:"},{"line_number":461,"context_line":"            self.dr_driver_cls.advertise_route(bgp_speaker_as,"},{"line_number":462,"context_line":"                                               route[\u0027destination\u0027],"},{"line_number":463,"context_line":"                                               route[\u0027next_hop\u0027])"},{"line_number":464,"context_line":"        except Exception as e:"},{"line_number":465,"context_line":"            self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_27835058","line":462,"range":{"start_line":462,"start_character":52,"end_line":462,"end_character":54},"in_reply_to":"fa69d971_294a7084","updated":"2016-01-01 14:51:45.000000000","message":"Let\u0027s keep it simple for time being. We can change later while adding VPN support.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":17609,"name":"steve","email":"ruansx@cn.ibm.com","username":"steve.ruan"},"change_message_id":"f3d6d7e2e1242ce3436cfb516c4a8d99f0d033be","unresolved":false,"context_lines":[{"line_number":475,"context_line":"                   \u0027nexthop\u0027: route[\u0027next_hop\u0027]})"},{"line_number":476,"context_line":"            try:"},{"line_number":477,"context_line":"                self.dr_driver_cls.withdraw_route(bgp_speaker_as,"},{"line_number":478,"context_line":"                                                  route[\u0027destination\u0027],"},{"line_number":479,"context_line":"                                                  route[\u0027next_hop\u0027])"},{"line_number":480,"context_line":"            except Exception as e:"},{"line_number":481,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_a97740d3","line":478,"range":{"start_line":478,"start_character":50,"end_line":478,"end_character":55},"updated":"2015-12-30 14:31:27.000000000","message":"It\u0027s better push all route info in a dict. For example, when VPN id is added, there is no need to change API definition.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0a085faa83d718506e555bb593af0c00be288d4b","unresolved":false,"context_lines":[{"line_number":475,"context_line":"                   \u0027nexthop\u0027: route[\u0027next_hop\u0027]})"},{"line_number":476,"context_line":"            try:"},{"line_number":477,"context_line":"                self.dr_driver_cls.withdraw_route(bgp_speaker_as,"},{"line_number":478,"context_line":"                                                  route[\u0027destination\u0027],"},{"line_number":479,"context_line":"                                                  route[\u0027next_hop\u0027])"},{"line_number":480,"context_line":"            except Exception as e:"},{"line_number":481,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_47868466","line":478,"range":{"start_line":478,"start_character":50,"end_line":478,"end_character":55},"in_reply_to":"fa69d971_a97740d3","updated":"2016-01-01 14:51:45.000000000","message":"ditto.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, host, conf\u003dNone):"},{"line_number":54,"context_line":"        super(BgpDrAgent, self).__init__()"},{"line_number":55,"context_line":"        self.initialise_driver(conf)"},{"line_number":56,"context_line":"        self.needs_resync_reasons \u003d collections.defaultdict(list)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.cache \u003d BgpSpeakerCache()"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_5f514f61","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":30},"updated":"2016-01-21 22:44:38.000000000","message":"we use US english in code so it should be: initialize_driver?","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, host, conf\u003dNone):"},{"line_number":54,"context_line":"        super(BgpDrAgent, self).__init__()"},{"line_number":55,"context_line":"        self.initialise_driver(conf)"},{"line_number":56,"context_line":"        self.needs_resync_reasons \u003d collections.defaultdict(list)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.cache \u003d BgpSpeakerCache()"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_c013820c","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":30},"in_reply_to":"9a68dd71_5f514f61","updated":"2016-01-27 11:30:54.000000000","message":"Done","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, host, conf\u003dNone):"},{"line_number":54,"context_line":"        super(BgpDrAgent, self).__init__()"},{"line_number":55,"context_line":"        self.initialise_driver(conf)"},{"line_number":56,"context_line":"        self.needs_resync_reasons \u003d collections.defaultdict(list)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.cache \u003d BgpSpeakerCache()"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_a01ce277","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":30},"in_reply_to":"9a68dd71_5f514f61","updated":"2016-01-22 06:12:17.000000000","message":"Ok. Will change.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    importutils.import_object(self.conf.bgp_speaker_driver,"},{"line_number":68,"context_line":"                                              self.conf))"},{"line_number":69,"context_line":"        except ImportError as e:"},{"line_number":70,"context_line":"            LOG.error(_LE(\"Error importing BGP speaker driver \""},{"line_number":71,"context_line":"                          \"interface\u003d%(driver)s, exception\u003d%(exception)s.\"),"},{"line_number":72,"context_line":"                      {\u0027driver\u0027: self.conf.bgp_speaker_driver,"},{"line_number":73,"context_line":"                       \u0027exception\u0027: e})"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_ff7843f4","line":70,"range":{"start_line":70,"start_character":22,"end_line":70,"end_character":25},"updated":"2016-01-21 22:44:38.000000000","message":"Using the following seems cleaner: less code, more logs\n\n LOG.exception(\"Error while importing BGP speaeker driver %s\", self.conf.bgp_speaker_driver)","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    importutils.import_object(self.conf.bgp_speaker_driver,"},{"line_number":68,"context_line":"                                              self.conf))"},{"line_number":69,"context_line":"        except ImportError as e:"},{"line_number":70,"context_line":"            LOG.error(_LE(\"Error importing BGP speaker driver \""},{"line_number":71,"context_line":"                          \"interface\u003d%(driver)s, exception\u003d%(exception)s.\"),"},{"line_number":72,"context_line":"                      {\u0027driver\u0027: self.conf.bgp_speaker_driver,"},{"line_number":73,"context_line":"                       \u0027exception\u0027: e})"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_60f96ec8","line":70,"range":{"start_line":70,"start_character":22,"end_line":70,"end_character":25},"in_reply_to":"9a68dd71_ff7843f4","updated":"2016-01-27 11:30:54.000000000","message":"Done","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    importutils.import_object(self.conf.bgp_speaker_driver,"},{"line_number":68,"context_line":"                                              self.conf))"},{"line_number":69,"context_line":"        except ImportError as e:"},{"line_number":70,"context_line":"            LOG.error(_LE(\"Error importing BGP speaker driver \""},{"line_number":71,"context_line":"                          \"interface\u003d%(driver)s, exception\u003d%(exception)s.\"),"},{"line_number":72,"context_line":"                      {\u0027driver\u0027: self.conf.bgp_speaker_driver,"},{"line_number":73,"context_line":"                       \u0027exception\u0027: e})"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_2009d231","line":70,"range":{"start_line":70,"start_character":22,"end_line":70,"end_character":25},"in_reply_to":"9a68dd71_ff7843f4","updated":"2016-01-22 06:12:17.000000000","message":"Ok. Will change.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"}],"neutron/agent/bgp/config.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRAGENT_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.agent.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":21,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":22,"context_line":"]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_5f5b8f54","line":20,"range":{"start_line":20,"start_character":37,"end_line":20,"end_character":38},"updated":"2016-01-21 22:44:38.000000000","message":"It would be great to use stevedore to load the driver","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRAGENT_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.agent.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":21,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":22,"context_line":"]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_a3038c0c","line":20,"range":{"start_line":20,"start_character":37,"end_line":20,"end_character":38},"in_reply_to":"9a68dd71_5f5b8f54","updated":"2016-01-22 06:12:17.000000000","message":"Will check on this.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRAGENT_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.agent.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":21,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":22,"context_line":"]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_55267617","line":20,"range":{"start_line":20,"start_character":37,"end_line":20,"end_character":38},"in_reply_to":"9a68dd71_a3038c0c","updated":"2016-01-27 11:30:54.000000000","message":"IMO we can take this up in the next phase.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"}],"neutron/agent/bgp/driver/base.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0a085faa83d718506e555bb593af0c00be288d4b","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        pass"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @abc.abstractmethod"},{"line_number":124,"context_line":"    def get_bgp_speaker_statistics(self, speaker_as):"},{"line_number":125,"context_line":"        \"\"\"Collect BGP Speaker statistics."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_4778c48f","line":124,"updated":"2016-01-01 14:51:45.000000000","message":"Already filed an RFE for this requirement (https://bugs.launchpad.net/neutron/+bug/1527993). Will be done as a part of that later.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":17609,"name":"steve","email":"ruansx@cn.ibm.com","username":"steve.ruan"},"change_message_id":"f3d6d7e2e1242ce3436cfb516c4a8d99f0d033be","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        pass"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @abc.abstractmethod"},{"line_number":136,"context_line":"    def get_bgp_peer_statistics(self, speaker_as, peer_ip, peer_as):"},{"line_number":137,"context_line":"        \"\"\"Collect BGP Peer statistics."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_4479c992","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":31},"updated":"2015-12-30 14:31:27.000000000","message":"It\u0027s better to have a API to show bgp peer status like Cisco Switch CLI \"show ip bgp summary\". It will be a good tool debug bgp status.\nNeighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down State/PfxRcd\n 10.100.1.1      4   200      26      22      199    0    0 00:14:23 23\n 10.200.1.1      4   300      21      51      199    0    0 00:13:40 0","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0a085faa83d718506e555bb593af0c00be288d4b","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        pass"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @abc.abstractmethod"},{"line_number":136,"context_line":"    def get_bgp_peer_statistics(self, speaker_as, peer_ip, peer_as):"},{"line_number":137,"context_line":"        \"\"\"Collect BGP Peer statistics."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_27759097","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":31},"in_reply_to":"fa69d971_4479c992","updated":"2016-01-01 14:51:45.000000000","message":"Already filed an RFE for this requirement (https://bugs.launchpad.net/neutron/+bug/1527993). Will be done as a part of that later.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a0a4ec06421ac472b2bd324c6a2001c46c6019ce","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\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":27,"id":"fa69d971_3bfffe35","line":1,"updated":"2016-01-08 03:59:26.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"2c393223ea631a839bcb2ca5586a0cfb3cf16dc3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        :raises: BgpSpeakerAlreadyScheduled, BgpSpeakerMaxScheduled,"},{"line_number":36,"context_line":"                 InvalidParamType, InvalidParamRange"},{"line_number":37,"context_line":"        \"\"\""},{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @abc.abstractmethod"},{"line_number":41,"context_line":"    def delete_bgp_speaker(self, speaker_as):"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_5f22afba","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":12},"updated":"2016-01-21 22:44:38.000000000","message":"remove useless pass, in general coverage consider them as dead code.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        :raises: BgpSpeakerAlreadyScheduled, BgpSpeakerMaxScheduled,"},{"line_number":36,"context_line":"                 InvalidParamType, InvalidParamRange"},{"line_number":37,"context_line":"        \"\"\""},{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @abc.abstractmethod"},{"line_number":41,"context_line":"    def delete_bgp_speaker(self, speaker_as):"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_a01f665a","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":12},"in_reply_to":"9a68dd71_5f22afba","updated":"2016-01-27 11:30:54.000000000","message":"Done","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"}],"neutron/agent/bgp/driver/exceptions.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7bc4db9ecf5e1234352d925f62a923c859949197","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BgpSpeakerMultipleSchedule(n_exc.NotSupported):"},{"line_number":25,"context_line":"    message \u003d _(\"Already running BGP Speaker. Cannot host one more. \""},{"line_number":26,"context_line":"                \"Scheduled AS %(current_as)d, New AS %(new_as)d\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_dd50290d","line":25,"updated":"2015-09-09 10:27:30.000000000","message":"\"Already running BGP Speaker. Cannot host one more\" \u003d\u003d\u003e \"Already running BGP Speaker, cannot host one more\"","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7bc4db9ecf5e1234352d925f62a923c859949197","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BgpSpeakerMultipleSchedule(n_exc.NotSupported):"},{"line_number":25,"context_line":"    message \u003d _(\"Already running BGP Speaker. Cannot host one more. \""},{"line_number":26,"context_line":"                \"Scheduled AS %(current_as)d, New AS %(new_as)d\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BgpSpeakerAlreadyScheduled(n_exc.Conflict):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_9d7151ab","line":26,"updated":"2015-09-09 10:27:30.000000000","message":"Scheduled AS \u003d\u003d\u003e Current local_as\n\nNew AS \u003d\u003d\u003e New local_as","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7bc4db9ecf5e1234352d925f62a923c859949197","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BgpSpeakerAlreadyScheduled(n_exc.Conflict):"},{"line_number":30,"context_line":"    message \u003d _(\"Already running BGP Speaker for AS %(current_as)d with \""},{"line_number":31,"context_line":"                \"RouterID %(rtid)s.\")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_fd1bad71","line":30,"updated":"2015-09-09 10:27:30.000000000","message":"AS \u003d\u003d\u003e local_as","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7bc4db9ecf5e1234352d925f62a923c859949197","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class InvalidParamRange(n_exc.NeutronException):"},{"line_number":39,"context_line":"    message \u003d _(\"%(param)s must be a in %(range)s range.\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_7d079d18","line":39,"updated":"2015-09-09 10:27:30.000000000","message":"remove \u0027a\u0027","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a0a4ec06421ac472b2bd324c6a2001c46c6019ce","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\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":27,"id":"fa69d971_dbfb4246","line":1,"updated":"2016-01-08 03:59:26.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"2c393223ea631a839bcb2ca5586a0cfb3cf16dc3"}],"neutron/agent/bgp/driver/ryu/driver.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"28499254455cd9892e7dce100f1f1c66fe372ab8","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Function for logging BGP peer and path changes."},{"line_number":30,"context_line":"# TODO(Vikram): peer up/down callbacks should cause some sort of user-visible"},{"line_number":31,"context_line":"#               data regarding peering status to be updated. Logging alone is"},{"line_number":32,"context_line":"#               not sufficient. Check how to implement this."},{"line_number":33,"context_line":"def bgp_peer_down_cb(remote_ip, remote_as):"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_3fd06a53","line":30,"updated":"2015-12-30 11:15:10.000000000","message":"Remove TODO as we have filed an RFE for this enhancement.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a0a4ec06421ac472b2bd324c6a2001c46c6019ce","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":27,"id":"fa69d971_fbf8864b","line":1,"updated":"2016-01-08 03:59:26.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"2c393223ea631a839bcb2ca5586a0cfb3cf16dc3"},{"author":{"_account_id":17455,"name":"Na Zhu","email":"juno.zhu@huawei.com","username":"Na"},"change_message_id":"551726fe53c2756ec5465e0e7f511651fc62d204","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as\u003dspeaker_as,"},{"line_number":162,"context_line":"                                                    rtid\u003dself.routerid)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def withdraw_route(self, speaker_as, cidr):"},{"line_number":165,"context_line":"        curr_speaker \u003d self.cache.get_bgp_speaker(speaker_as)"},{"line_number":166,"context_line":"        if curr_speaker:"},{"line_number":167,"context_line":"            # Validate cidr. It must be a string."}],"source_content_type":"text/x-python","patch_set":27,"id":"fa69d971_8d4edabf","line":164,"range":{"start_line":164,"start_character":45,"end_line":164,"end_character":47},"updated":"2016-01-08 08:29:39.000000000","message":"I think you miss parameter \"nexthop\u003dNone\" here","commit_id":"2c393223ea631a839bcb2ca5586a0cfb3cf16dc3"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"63c3282f312fa03e2689c2180b996e81f03962f3","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as\u003dspeaker_as,"},{"line_number":162,"context_line":"                                                    rtid\u003dself.routerid)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def withdraw_route(self, speaker_as, cidr):"},{"line_number":165,"context_line":"        curr_speaker \u003d self.cache.get_bgp_speaker(speaker_as)"},{"line_number":166,"context_line":"        if curr_speaker:"},{"line_number":167,"context_line":"            # Validate cidr. It must be a string."}],"source_content_type":"text/x-python","patch_set":27,"id":"fa69d971_344932b8","line":164,"range":{"start_line":164,"start_character":45,"end_line":164,"end_character":47},"in_reply_to":"fa69d971_8d4edabf","updated":"2016-01-08 10:20:25.000000000","message":"Ohhh.... my mistake. Thanks for pointing this out. Will correct.","commit_id":"2c393223ea631a839bcb2ca5586a0cfb3cf16dc3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from ryu.services.protocols.bgp import bgpspeaker"},{"line_number":19,"context_line":"from ryu.services.protocols.bgp.rtconf.neighbors import CONNECT_MODE_ACTIVE"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.agent.bgp.driver import base"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_9a5b552e","line":18,"range":{"start_line":18,"start_character":5,"end_line":18,"end_character":8},"updated":"2016-01-21 22:44:38.000000000","message":"ryu and oslo_log import s should be grouped: they are both external libs","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from ryu.services.protocols.bgp import bgpspeaker"},{"line_number":19,"context_line":"from ryu.services.protocols.bgp.rtconf.neighbors import CONNECT_MODE_ACTIVE"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.agent.bgp.driver import base"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_2034d6dc","line":18,"range":{"start_line":18,"start_character":5,"end_line":18,"end_character":8},"in_reply_to":"9a68dd71_9a5b552e","updated":"2016-01-27 11:30:54.000000000","message":"Done","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from ryu.services.protocols.bgp import bgpspeaker"},{"line_number":19,"context_line":"from ryu.services.protocols.bgp.rtconf.neighbors import CONNECT_MODE_ACTIVE"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.agent.bgp.driver import base"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_03437843","line":18,"range":{"start_line":18,"start_character":5,"end_line":18,"end_character":8},"in_reply_to":"9a68dd71_9a5b552e","updated":"2016-01-22 06:12:17.000000000","message":"Ok. Will change.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.cache \u003d utils.BgpMultiSpeakerCache()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _read_config(self, cfg):"},{"line_number":61,"context_line":"        if ((cfg is None) or (cfg.bgp_router_id is None)):"},{"line_number":62,"context_line":"            # If either cfg or router_id is not specified, raise voice"},{"line_number":63,"context_line":"            LOG.error(_LE(\u0027Error initializing Ryu interface driver. \u0027"},{"line_number":64,"context_line":"                          \u0027MUST specify bgp_router_id via configuration.\u0027))"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_ba75f998","line":61,"range":{"start_line":61,"start_character":28,"end_line":61,"end_character":29},"updated":"2016-01-21 22:44:38.000000000","message":"useless braces","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.cache \u003d utils.BgpMultiSpeakerCache()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _read_config(self, cfg):"},{"line_number":61,"context_line":"        if ((cfg is None) or (cfg.bgp_router_id is None)):"},{"line_number":62,"context_line":"            # If either cfg or router_id is not specified, raise voice"},{"line_number":63,"context_line":"            LOG.error(_LE(\u0027Error initializing Ryu interface driver. \u0027"},{"line_number":64,"context_line":"                          \u0027MUST specify bgp_router_id via configuration.\u0027))"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_c0b862e8","line":61,"range":{"start_line":61,"start_character":28,"end_line":61,"end_character":29},"in_reply_to":"9a68dd71_ba75f998","updated":"2016-01-27 11:30:54.000000000","message":"Done","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.cache \u003d utils.BgpMultiSpeakerCache()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _read_config(self, cfg):"},{"line_number":61,"context_line":"        if ((cfg is None) or (cfg.bgp_router_id is None)):"},{"line_number":62,"context_line":"            # If either cfg or router_id is not specified, raise voice"},{"line_number":63,"context_line":"            LOG.error(_LE(\u0027Error initializing Ryu interface driver. \u0027"},{"line_number":64,"context_line":"                          \u0027MUST specify bgp_router_id via configuration.\u0027))"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_e3474449","line":61,"range":{"start_line":61,"start_character":28,"end_line":61,"end_character":29},"in_reply_to":"9a68dd71_ba75f998","updated":"2016-01-22 06:12:17.000000000","message":"Ok. Will remove.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"}],"neutron/agent/bgp/driver/ryu_driver.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"5ce155ec3e5987603b6a0e57796ae441fc0939e2","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.speaker \u003d None"},{"line_number":35,"context_line":"        self.local_as \u003d None"},{"line_number":36,"context_line":"        if cfg:"},{"line_number":37,"context_line":"            self.routerid \u003d cfg.router_id"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def add_bgp_speaker(self, local_as):"},{"line_number":40,"context_line":"        if not self.speaker:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_792bf533","line":37,"updated":"2015-08-01 05:56:34.000000000","message":"How about reporting a failure if the router_id is not specified?","commit_id":"52a9804a58cf4989b575bcb21153280ea8209ed2"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6cc09d72c0f50ef1606537ab7211cf6e145fc810","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from ryu.services.protocols.bgp import bgpspeaker"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutron.agent.bgp import base"},{"line_number":21,"context_line":"from neutron.i18n import _LI"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_7d96944d","line":20,"updated":"2015-08-28 05:26:32.000000000","message":"Please add base.py as a part of this patch inside neutron.bgp.driver.","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a7f565240ddd50ba2013d8f16ad98b4a4022df25","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":54,"context_line":"            self._init_speaker_attr()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def add_bgp_peer(self, peer_ip, peer_as, password\u003dNone):"},{"line_number":57,"context_line":"        self.speaker.neighbor_add(peer_ip, peer_as, password\u003dpassword)"},{"line_number":58,"context_line":"        LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been added\u0027),"},{"line_number":59,"context_line":"                 {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_fb09dd31","line":56,"updated":"2015-08-12 21:26:22.000000000","message":"What kind of feedback do we get from this action?  Say for instance that the password was entered incorrectly, how can we communicate that back through the Neutron API?","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8a39833323a84d8950e8d66c1dc5a0dec52a9d21","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":54,"context_line":"            self._init_speaker_attr()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def add_bgp_peer(self, peer_ip, peer_as, password\u003dNone):"},{"line_number":57,"context_line":"        self.speaker.neighbor_add(peer_ip, peer_as, password\u003dpassword)"},{"line_number":58,"context_line":"        LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been added\u0027),"},{"line_number":59,"context_line":"                 {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_e96d8003","line":56,"in_reply_to":"1a4dcd0f_fb09dd31","updated":"2015-08-13 10:10:03.000000000","message":"BGP peering session won\u0027t be established. This is as per BGP RFC https://www.ietf.org/rfc/rfc4486.txt (section 4).\n\nNow from Ryu perspective, the BGP peering session will be teared down without any notification.\nhttps://github.com/osrg/ryu/blob/master/ryu/services/protocols/bgp/speaker.py#L475\n\nI think we can\u0027t handle such cases, as there won\u0027t be any notification from the driver. If we really want to know the peer state\u0027s then we can probably add one interface for querying BGP peer states from the driver and device a new Neutron GET API for displaying the same to the user.\n\nFor BGP Speaker State\u0027s : \"self.state\" contains the required information, which can depict any one of the following:\n\n# Various states of bgp state machine.\n\nBGP_FSM_IDLE \u003d \u0027Idle\u0027\n\nBGP_FSM_CONNECT \u003d \u0027Connect\u0027\n\nBGP_FSM_ACTIVE \u003d \u0027Active\u0027\n\nBGP_FSM_OPEN_SENT \u003d \u0027OpenSent\u0027\n\nBGP_FSM_OPEN_CONFIRM \u003d \u0027OpenConfirm\u0027\n\nBGP_FSM_ESTABLISHED \u003d \u0027Established\u0027\n\nSimilarly, Peer states could be found. I searched but couldn\u0027t find Ryu interface for getting the same. Need to investigate.","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":1026,"name":"FUJITA Tomonori","email":"fujita.tomonori@gmail.com","username":"fujita-tomonori"},"change_message_id":"263c20c273e58ea775076e64b6d677706f61f608","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":54,"context_line":"            self._init_speaker_attr()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def add_bgp_peer(self, peer_ip, peer_as, password\u003dNone):"},{"line_number":57,"context_line":"        self.speaker.neighbor_add(peer_ip, peer_as, password\u003dpassword)"},{"line_number":58,"context_line":"        LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been added\u0027),"},{"line_number":59,"context_line":"                 {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_d8a59bb5","line":56,"in_reply_to":"1a4dcd0f_fb09dd31","updated":"2015-08-24 07:06:22.000000000","message":"This API is async (does not wait for the establishment) so the callback APIs are provided to catch the peer up/down (becomes FSM_ESTABLISHED/becomes non FSM_ESTABLISHED state).\n\nWe\u0027ve just added the new API for querying for the bgp state of a peer (which Vikram asked for). We are happy to add what Neutron needs. \n\nNote that if the md5 password is not correct, linux kernel just discards the packet. So no way to know for user space if the password is correct or not.","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":1026,"name":"FUJITA Tomonori","email":"fujita.tomonori@gmail.com","username":"fujita-tomonori"},"change_message_id":"3d8433ed85a469f9292e5ff3aa8aded4741994c9","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":54,"context_line":"            self._init_speaker_attr()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def add_bgp_peer(self, peer_ip, peer_as, password\u003dNone):"},{"line_number":57,"context_line":"        self.speaker.neighbor_add(peer_ip, peer_as, password\u003dpassword)"},{"line_number":58,"context_line":"        LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been added\u0027),"},{"line_number":59,"context_line":"                 {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_c1f27f6f","line":56,"in_reply_to":"fa1b9901_1ee45b39","updated":"2015-08-24 09:55:00.000000000","message":"You can see at:\nhttp://ryu.readthedocs.org/en/latest/library_bgp_speaker_ref.html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.neighbor_state_get\n\nAbout the callback APIs, please have look at:\nhttps://github.com/osrg/ryu/blob/master/ryu/services/protocols/bgp/bgpspeaker.py#L141\n\nThey are converted into nice doc on readthedocs.org but not somehow. Also there is sample code to use the callback APIs:\nhttp://ryu.readthedocs.org/en/latest/library_bgp_speaker.html","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9e9c08ec313c036ef692f1abef488213fe931155","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":54,"context_line":"            self._init_speaker_attr()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def add_bgp_peer(self, peer_ip, peer_as, password\u003dNone):"},{"line_number":57,"context_line":"        self.speaker.neighbor_add(peer_ip, peer_as, password\u003dpassword)"},{"line_number":58,"context_line":"        LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been added\u0027),"},{"line_number":59,"context_line":"                 {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_04e2c59f","line":56,"in_reply_to":"fa1b9901_c1f27f6f","updated":"2015-08-24 10:17:22.000000000","message":"Thanks! It\u0027s really easy :)","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8864077149aaafcfcea6a0d72a86322e258cf362","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":54,"context_line":"            self._init_speaker_attr()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def add_bgp_peer(self, peer_ip, peer_as, password\u003dNone):"},{"line_number":57,"context_line":"        self.speaker.neighbor_add(peer_ip, peer_as, password\u003dpassword)"},{"line_number":58,"context_line":"        LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been added\u0027),"},{"line_number":59,"context_line":"                 {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_1ee45b39","line":56,"in_reply_to":"fa1b9901_d8a59bb5","updated":"2015-08-24 07:55:46.000000000","message":"@Fujita: Did we document the usage of the new API somewhere?","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a7f565240ddd50ba2013d8f16ad98b4a4022df25","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        LOG.info(_LI(\"BGP Peer %s has been removed.\"), peer_ip)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def advertise_route(self, cidr, nexthop):"},{"line_number":66,"context_line":"        self.speaker.prefix_add(cidr, nexthop)"},{"line_number":67,"context_line":"        LOG.info(_LI(\u0027Route cidr\u003d%(prefix)s, nexthop\u003d%(nexthop)s is being \u0027"},{"line_number":68,"context_line":"                     \u0027advertised via BGP.\u0027),"},{"line_number":69,"context_line":"                 {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_3b45056e","line":66,"updated":"2015-08-12 21:26:22.000000000","message":"What happens if we pass a prefix that we\u0027ve already added?  Does the nexthop get updated if it\u0027s different?  If unchanged, is this  a no-op?  If the nexthop is different, do we end up advertising 2 nexthops for the given prefix?","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8a39833323a84d8950e8d66c1dc5a0dec52a9d21","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        LOG.info(_LI(\"BGP Peer %s has been removed.\"), peer_ip)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def advertise_route(self, cidr, nexthop):"},{"line_number":66,"context_line":"        self.speaker.prefix_add(cidr, nexthop)"},{"line_number":67,"context_line":"        LOG.info(_LI(\u0027Route cidr\u003d%(prefix)s, nexthop\u003d%(nexthop)s is being \u0027"},{"line_number":68,"context_line":"                     \u0027advertised via BGP.\u0027),"},{"line_number":69,"context_line":"                 {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_c6a8b38e","line":66,"in_reply_to":"1a4dcd0f_3b45056e","updated":"2015-08-13 10:10:03.000000000","message":"1. Advertising same route again:\n\nIt will be re-advertised.\nhttps://github.com/osrg/ryu/blob/master/ryu/services/protocols/bgp/info_base/base.py#L103\n\n\n2. prefix with different next-hop:\n\nNew next-hop will be advertised.\n\n\n3. Same prefix with different next-hops:\n\nPrefix is the key. So, routes with different next-hops will be treated as different prefixes.\nhttps://github.com/osrg/ryu/blob/master/ryu/services/protocols/bgp/info_base/ipv4.py#L62","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":1026,"name":"FUJITA Tomonori","email":"fujita.tomonori@gmail.com","username":"fujita-tomonori"},"change_message_id":"263c20c273e58ea775076e64b6d677706f61f608","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        LOG.info(_LI(\"BGP Peer %s has been removed.\"), peer_ip)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def advertise_route(self, cidr, nexthop):"},{"line_number":66,"context_line":"        self.speaker.prefix_add(cidr, nexthop)"},{"line_number":67,"context_line":"        LOG.info(_LI(\u0027Route cidr\u003d%(prefix)s, nexthop\u003d%(nexthop)s is being \u0027"},{"line_number":68,"context_line":"                     \u0027advertised via BGP.\u0027),"},{"line_number":69,"context_line":"                 {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_ed1c5f79","line":66,"in_reply_to":"1a4dcd0f_c6a8b38e","updated":"2015-08-24 07:06:22.000000000","message":"About #3, if we advertise the prefix that it previously advertised with a different next hop, the peer is supposed to replace the old with the new one.","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8864077149aaafcfcea6a0d72a86322e258cf362","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        LOG.info(_LI(\"BGP Peer %s has been removed.\"), peer_ip)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def advertise_route(self, cidr, nexthop):"},{"line_number":66,"context_line":"        self.speaker.prefix_add(cidr, nexthop)"},{"line_number":67,"context_line":"        LOG.info(_LI(\u0027Route cidr\u003d%(prefix)s, nexthop\u003d%(nexthop)s is being \u0027"},{"line_number":68,"context_line":"                     \u0027advertised via BGP.\u0027),"},{"line_number":69,"context_line":"                 {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_becf6fb2","line":66,"in_reply_to":"fa1b9901_ed1c5f79","updated":"2015-08-24 07:55:46.000000000","message":"@Fujita: Ok","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a7f565240ddd50ba2013d8f16ad98b4a4022df25","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                 {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def withdraw_route(self, cidr):"},{"line_number":72,"context_line":"        self.speaker.prefix_del(cidr)"},{"line_number":73,"context_line":"        LOG.info(_LI(\"Route cidr\u003d%s is being withdrawn using BGP.\"), cidr)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_5b333114","line":72,"updated":"2015-08-12 21:26:22.000000000","message":"What happens if we pass a prefix that isn\u0027t being advertised?  Exception, no-op?","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":1026,"name":"FUJITA Tomonori","email":"fujita.tomonori@gmail.com","username":"fujita-tomonori"},"change_message_id":"263c20c273e58ea775076e64b6d677706f61f608","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                 {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def withdraw_route(self, cidr):"},{"line_number":72,"context_line":"        self.speaker.prefix_del(cidr)"},{"line_number":73,"context_line":"        LOG.info(_LI(\"Route cidr\u003d%s is being withdrawn using BGP.\"), cidr)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_6dffef34","line":72,"in_reply_to":"1a4dcd0f_134c9b9c","updated":"2015-08-24 07:06:22.000000000","message":"I think that the API returns \u0027None\u0027 if you pass a prefix that wasn\u0027t passed via prefix_add() and doesn\u0027t send any messages to the peer.","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8a39833323a84d8950e8d66c1dc5a0dec52a9d21","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                 {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def withdraw_route(self, cidr):"},{"line_number":72,"context_line":"        self.speaker.prefix_del(cidr)"},{"line_number":73,"context_line":"        LOG.info(_LI(\"Route cidr\u003d%s is being withdrawn using BGP.\"), cidr)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_134c9b9c","line":72,"in_reply_to":"1a4dcd0f_5b333114","updated":"2015-08-13 10:10:03.000000000","message":"From the code I can find it will be withdrawn without any noise.\n\nhttps://github.com/osrg/ryu/blob/master/ryu/services/protocols/bgp/info_base/base.py#L113","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8864077149aaafcfcea6a0d72a86322e258cf362","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                 {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def withdraw_route(self, cidr):"},{"line_number":72,"context_line":"        self.speaker.prefix_del(cidr)"},{"line_number":73,"context_line":"        LOG.info(_LI(\"Route cidr\u003d%s is being withdrawn using BGP.\"), cidr)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_7ef23708","line":72,"in_reply_to":"fa1b9901_6dffef34","updated":"2015-08-24 07:55:46.000000000","message":"Thanks for the clarification Fujita.","commit_id":"506ce92d037c9568b7ab625515f279e4141d4920"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb49026b22ea3ecaa637dbf614cb8d6f0ed10c08","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                         \u0027RouterID %(rtid)s.\u0027),"},{"line_number":93,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":94,"context_line":"        else:"},{"line_number":95,"context_line":"            LOG.error(_LE(\u0027Already running BGP Speaker for AS %(as)d with \u0027"},{"line_number":96,"context_line":"                          \u0027RouterID %(rtid)s. Cannot host one more for AS \u0027"},{"line_number":97,"context_line":"                          \u0027%(new_as)d.\u0027),"},{"line_number":98,"context_line":"                      {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_20619e05","line":95,"updated":"2015-08-29 03:13:58.000000000","message":"How about returning an error from here so that agent can take proper action, if required.","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb49026b22ea3ecaa637dbf614cb8d6f0ed10c08","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been \u0027"},{"line_number":117,"context_line":"                         \u0027added.\u0027), {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"},{"line_number":118,"context_line":"        else:"},{"line_number":119,"context_line":"            LOG.error(_LE(\u0027BGP Speaker for AS %(as)d having RouterID %(rtid)s \u0027"},{"line_number":120,"context_line":"                         \u0027is not added yet. Please check!\u0027),"},{"line_number":121,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_00549a1e","line":119,"updated":"2015-08-29 03:13:58.000000000","message":"This could be a reason for re-sync. Please notify agent for taking corrective measures.","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb49026b22ea3ecaa637dbf614cb8d6f0ed10c08","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            self.speaker.neighbor_del(address\u003dpeer_ip)"},{"line_number":126,"context_line":"            LOG.info(_LI(\u0027BGP Peer %s has been removed.\u0027), peer_ip)"},{"line_number":127,"context_line":"        else:"},{"line_number":128,"context_line":"            LOG.error(_LE(\u0027BGP Speaker for AS %(as)d having RouterID %(rtid)s \u0027"},{"line_number":129,"context_line":"                         \u0027is not added yet. Please check!\u0027),"},{"line_number":130,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_c038e2f1","line":128,"updated":"2015-08-29 03:13:58.000000000","message":"This could be a reason for re-sync. Please notify agent for taking corrective measures.","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb49026b22ea3ecaa637dbf614cb8d6f0ed10c08","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                         \u0027advertised via BGP.\u0027),"},{"line_number":137,"context_line":"                     {\u0027prefix\u0027: cidr, \u0027nexthop\u0027: nexthop})"},{"line_number":138,"context_line":"        else:"},{"line_number":139,"context_line":"            LOG.error(_LE(\u0027BGP Speaker for AS %(as)d having RouterID %(rtid)s \u0027"},{"line_number":140,"context_line":"                         \u0027is not added yet. Please check!\u0027),"},{"line_number":141,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_6039d6f1","line":139,"updated":"2015-08-29 03:13:58.000000000","message":"This could be a reason for re-sync. Please notify agent for taking corrective measures.","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb49026b22ea3ecaa637dbf614cb8d6f0ed10c08","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            LOG.info(_LI(\u0027Route cidr\u003d%s is being withdrawn using BGP.\u0027),"},{"line_number":147,"context_line":"                     cidr)"},{"line_number":148,"context_line":"        else:"},{"line_number":149,"context_line":"            LOG.error(_LE(\u0027BGP Speaker for AS %(as)d having RouterID %(rtid)s \u0027"},{"line_number":150,"context_line":"                         \u0027is not added yet. Please check!\u0027),"},{"line_number":151,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_803e6ad8","line":149,"updated":"2015-08-29 03:13:58.000000000","message":"This could be a reason for re-sync. Please notify agent for taking corrective measures.","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b358e45a47fea6b30a785a437c0a25970398f145","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                                  router_id\u003dself.routerid,"},{"line_number":108,"context_line":"                                  best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":109,"context_line":"                                  peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":110,"context_line":"                                  peer_up_handler\u003dbgp_peer_up_cb)"},{"line_number":111,"context_line":"            LOG.info(_LI(\u0027BGP Speaker for AS %(as)d with RouterID %(rtid)s \u0027"},{"line_number":112,"context_line":"                         \u0027has been added.\u0027),"},{"line_number":113,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_028ec72d","line":110,"updated":"2015-09-04 17:18:37.000000000","message":"I\u0027m seeing the following message logged when starting the agent:\n\n2015-09-03 22:58:53.826 32204 ERROR ryu.lib.hub [-] hub: uncaught exception: Traceback (most recent call last):\n  File \"/usr/local/lib/python2.7/dist-packages/ryu/lib/hub.py\", line 52, in _launch\n    func(*args, **kwargs)\n  File \"/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/base.py\", line 243, in start\n    self._run(*args, **kwargs)\n  File \"/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/core.py\", line 235, in _run\n    server_thread.wait()\nAttributeError: \u0027NoneType\u0027 object has no attribute \u0027wait\u0027\n\nThis is a ryu error, perhaps something we can ignore?  We should either find a way to suppress this logging or change how the driver invoke the ryu library so this isn\u0027t logged.  A quick glance at the ryu code makes it look like ryu is failing to open a socket for listening for BGP connections.  People don\u0027t like seeing \"ERROR\" in their log files, even if it is benign.","commit_id":"069a16101ea8cfc70f0074aadbe432a65e39cbbb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4579faf46838a91fab62faca0f332fe4f30381f2","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                                  router_id\u003dself.routerid,"},{"line_number":108,"context_line":"                                  best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":109,"context_line":"                                  peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":110,"context_line":"                                  peer_up_handler\u003dbgp_peer_up_cb)"},{"line_number":111,"context_line":"            LOG.info(_LI(\u0027BGP Speaker for AS %(as)d with RouterID %(rtid)s \u0027"},{"line_number":112,"context_line":"                         \u0027has been added.\u0027),"},{"line_number":113,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_55030d10","line":110,"in_reply_to":"da20952f_028ec72d","updated":"2015-09-05 02:56:21.000000000","message":"Ryu need sudo privilege for socket creation. Can you try restarting the agent with a sudo privilege. BTW, I will check it with Ryu developers again.","commit_id":"069a16101ea8cfc70f0074aadbe432a65e39cbbb"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b358e45a47fea6b30a785a437c0a25970398f145","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            self.speaker.neighbor_add(address\u003dpeer_ip,"},{"line_number":140,"context_line":"                                      remote_as\u003dpeer_as,"},{"line_number":141,"context_line":"                                      password\u003dpassword)"},{"line_number":142,"context_line":"            LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been \u0027"},{"line_number":143,"context_line":"                         \u0027added.\u0027), {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"},{"line_number":144,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_828737b4","line":141,"updated":"2015-09-04 17:18:37.000000000","message":"Should we pass connect_mode\u003dCONNECT_MODE_ACTIVE since we don\u0027t really need to listen?","commit_id":"069a16101ea8cfc70f0074aadbe432a65e39cbbb"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9fb912d5d144646711580b35520d9e56b686c98f","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                                  router_id\u003dself.routerid,"},{"line_number":108,"context_line":"                                  best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":109,"context_line":"                                  peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":110,"context_line":"                                  peer_up_handler\u003dbgp_peer_up_cb)"},{"line_number":111,"context_line":"            LOG.info(_LI(\u0027BGP Speaker for AS %(as)d with RouterID %(rtid)s \u0027"},{"line_number":112,"context_line":"                         \u0027has been added.\u0027),"},{"line_number":113,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_a649c1b9","line":110,"updated":"2015-09-08 18:38:07.000000000","message":"See PS5 comments.  The requirement of sudo privileges here bothers me just a little.  You have to launch the dr_agent with sudo privileges just to accomodate a specific driver? That seems a little unfriendly.  Suppose we have a quagga driver in the future that can simply issue CLI commands, we could issue those through rootwrap rather than launching the agent with sudo privileges.  I guess as long as it\u0027s clearly documented that using the ryu BGP backend requires special sudo privileges (and what they are) it\u0027s fine, we may be limited by ryu anyway.","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7bc4db9ecf5e1234352d925f62a923c859949197","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                                  router_id\u003dself.routerid,"},{"line_number":108,"context_line":"                                  best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":109,"context_line":"                                  peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":110,"context_line":"                                  peer_up_handler\u003dbgp_peer_up_cb)"},{"line_number":111,"context_line":"            LOG.info(_LI(\u0027BGP Speaker for AS %(as)d with RouterID %(rtid)s \u0027"},{"line_number":112,"context_line":"                         \u0027has been added.\u0027),"},{"line_number":113,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_726b4cf2","line":110,"in_reply_to":"da20952f_6fa851dc","updated":"2015-09-09 10:27:30.000000000","message":"@Fujita: You mean we must either \"setcap \u0027cap_net_bind_service\u003d+ep\u0027 /path/to/program\" or grant sudo privilege  to avoid sock_bind error?\n\nSince we don\u0027t want to listen on port 179 so will specify \"CONNECT_MODE_ACTIVE\" while opening BGP peering session.","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":1026,"name":"FUJITA Tomonori","email":"fujita.tomonori@gmail.com","username":"fujita-tomonori"},"change_message_id":"3d1e28903f05113888e5eb0c21394210a988b45b","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                                  router_id\u003dself.routerid,"},{"line_number":108,"context_line":"                                  best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":109,"context_line":"                                  peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":110,"context_line":"                                  peer_up_handler\u003dbgp_peer_up_cb)"},{"line_number":111,"context_line":"            LOG.info(_LI(\u0027BGP Speaker for AS %(as)d with RouterID %(rtid)s \u0027"},{"line_number":112,"context_line":"                         \u0027has been added.\u0027),"},{"line_number":113,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_d58a0b1a","line":110,"in_reply_to":"da20952f_726b4cf2","updated":"2015-09-10 13:40:23.000000000","message":"You don\u0027t want to listen on port 179 and disable it, right? Then I\u0027ll add a new feature to disable completely listening on 179.","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":1026,"name":"FUJITA Tomonori","email":"fujita.tomonori@gmail.com","username":"fujita-tomonori"},"change_message_id":"21f83c969a6b0d89fc1bbc3b177ff06183fd88df","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                                  router_id\u003dself.routerid,"},{"line_number":108,"context_line":"                                  best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":109,"context_line":"                                  peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":110,"context_line":"                                  peer_up_handler\u003dbgp_peer_up_cb)"},{"line_number":111,"context_line":"            LOG.info(_LI(\u0027BGP Speaker for AS %(as)d with RouterID %(rtid)s \u0027"},{"line_number":112,"context_line":"                         \u0027has been added.\u0027),"},{"line_number":113,"context_line":"                     {\u0027as\u0027: self.local_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_6fa851dc","line":110,"in_reply_to":"da20952f_a649c1b9","updated":"2015-09-09 00:41:59.000000000","message":"You can give cap_net_bind_service capability with setcap instead of giving root privileges. Of as you commented below, if you don\u0027t need to listen on port 179, please use CONNECT_MODE_ACTIVE (Ryu only tries to connect to peers). Then you don\u0027t need root privileges, cap_net_bind_service or anything special.","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9fb912d5d144646711580b35520d9e56b686c98f","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            self.speaker.neighbor_add(address\u003dpeer_ip,"},{"line_number":140,"context_line":"                                      remote_as\u003dpeer_as,"},{"line_number":141,"context_line":"                                      password\u003dpassword)"},{"line_number":142,"context_line":"            LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been \u0027"},{"line_number":143,"context_line":"                         \u0027added.\u0027), {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"},{"line_number":144,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_c6d955f6","line":141,"updated":"2015-09-08 18:38:07.000000000","message":"See PS5. Any thoughts on CONNECT_MODE_ACTIVE here?","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":1026,"name":"FUJITA Tomonori","email":"fujita.tomonori@gmail.com","username":"fujita-tomonori"},"change_message_id":"3d1e28903f05113888e5eb0c21394210a988b45b","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            self.speaker.neighbor_add(address\u003dpeer_ip,"},{"line_number":140,"context_line":"                                      remote_as\u003dpeer_as,"},{"line_number":141,"context_line":"                                      password\u003dpassword)"},{"line_number":142,"context_line":"            LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been \u0027"},{"line_number":143,"context_line":"                         \u0027added.\u0027), {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"},{"line_number":144,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_95b253e4","line":141,"in_reply_to":"da20952f_52cde85b","updated":"2015-09-10 13:40:23.000000000","message":"Even with CONNECT_MODE_ACTIVE, you still can learn routes from peers.  CONNECT_MODE is about how to establish a tcp connection with a peer. Once a BGP session is established, there is no difference among CONNECT_MODE.","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7bc4db9ecf5e1234352d925f62a923c859949197","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            self.speaker.neighbor_add(address\u003dpeer_ip,"},{"line_number":140,"context_line":"                                      remote_as\u003dpeer_as,"},{"line_number":141,"context_line":"                                      password\u003dpassword)"},{"line_number":142,"context_line":"            LOG.info(_LI(\u0027BGP Peer %(peer)s for remote-as %(as)d has been \u0027"},{"line_number":143,"context_line":"                         \u0027added.\u0027), {\u0027peer\u0027: peer_ip, \u0027as\u0027: peer_as})"},{"line_number":144,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_52cde85b","line":141,"in_reply_to":"da20952f_c6d955f6","updated":"2015-09-09 10:27:30.000000000","message":"We can open peering session with \"CONNECT_MODE_ACTIVE\". It will be okay as we are only interested in advertising and not learning anything :)","commit_id":"7663910f2d9455cdfae36c11acca135e329d6459"}],"neutron/agent/bgp/driver/utils.py":[{"author":{"_account_id":17609,"name":"steve","email":"ruansx@cn.ibm.com","username":"steve.ruan"},"change_message_id":"f3d6d7e2e1242ce3436cfb516c4a8d99f0d033be","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron.agent.bgp.driver import exceptions as bgp_driver_exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"AS_NUM_MIN \u003d 1"},{"line_number":21,"context_line":"AS_NUM_MAX \u003d 65535"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# List of supported authentication types."},{"line_number":24,"context_line":"BGP_SUPPORTED_AUTH_TYPE \u003d [\u0027none\u0027, \u0027md5\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_e440fd09","line":21,"range":{"start_line":21,"start_character":13,"end_line":21,"end_character":18},"updated":"2015-12-30 14:31:27.000000000","message":"Suggest to put all bgp constant number in a single file.\nAnd suggest change AS_NUM_MAX to 0xFFFFFFFF because most bgp implementation support 4B ASN","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0a085faa83d718506e555bb593af0c00be288d4b","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron.agent.bgp.driver import exceptions as bgp_driver_exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"AS_NUM_MIN \u003d 1"},{"line_number":21,"context_line":"AS_NUM_MAX \u003d 65535"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# List of supported authentication types."},{"line_number":24,"context_line":"BGP_SUPPORTED_AUTH_TYPE \u003d [\u0027none\u0027, \u0027md5\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_87b55c32","line":21,"range":{"start_line":21,"start_character":13,"end_line":21,"end_character":18},"in_reply_to":"fa69d971_e440fd09","updated":"2016-01-01 14:51:45.000000000","message":"Hmmm... Will check on this.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":17609,"name":"steve","email":"ruansx@cn.ibm.com","username":"steve.ruan"},"change_message_id":"f3d6d7e2e1242ce3436cfb516c4a8d99f0d033be","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        1.0 - Initial version for caching multiple BGP speaker information."},{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    def __init__(self):"},{"line_number":64,"context_line":"        self.cache \u003d {}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def get_hosted_bgp_speakers_count(self):"},{"line_number":67,"context_line":"        return len(self.cache.keys())"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_042bd131","line":64,"range":{"start_line":64,"start_character":13,"end_line":64,"end_character":18},"updated":"2015-12-30 14:31:27.000000000","message":"BGP Speaker need to listen on TCP port 179. How to make multiple BGP speakers listen on same TCP port.\nIt\u0027s a linux socket issue.","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0a085faa83d718506e555bb593af0c00be288d4b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        1.0 - Initial version for caching multiple BGP speaker information."},{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    def __init__(self):"},{"line_number":64,"context_line":"        self.cache \u003d {}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def get_hosted_bgp_speakers_count(self):"},{"line_number":67,"context_line":"        return len(self.cache.keys())"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa69d971_a7b0a044","line":64,"range":{"start_line":64,"start_character":13,"end_line":64,"end_character":18},"in_reply_to":"fa69d971_042bd131","updated":"2016-01-01 14:51:45.000000000","message":"This framework was designed keeping all the routing protocols in mind. Anyways this doesn\u0027t harm us :)","commit_id":"7573f5fd9c03ddd29d93c24500809c0727777478"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a0a4ec06421ac472b2bd324c6a2001c46c6019ce","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\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":27,"id":"fa69d971_bb99ae21","line":1,"updated":"2016-01-08 03:59:26.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"2c393223ea631a839bcb2ca5586a0cfb3cf16dc3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        raise bgp_driver_exc.InvalidParamType(param\u003dparam,"},{"line_number":31,"context_line":"                                              param_type\u003d\u0027integer\u0027)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    if (as_num \u003c AS_NUM_MIN or as_num \u003e AS_NUM_MAX):"},{"line_number":34,"context_line":"        # Must be in [AS_NUM_MIN, AS_NUM_MAX] range."},{"line_number":35,"context_line":"        allowed_range \u003d (\u0027[\u0027 + str(AS_NUM_MIN) + \u0027-\u0027 +"},{"line_number":36,"context_line":"                         str(AS_NUM_MAX) + \u0027]\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_baead90d","line":33,"range":{"start_line":33,"start_character":17,"end_line":33,"end_character":27},"updated":"2016-01-21 22:44:38.000000000","message":"prefer:\n\n if not AS_NUM_MIN \u003d\u003c as_num \u003d\u003c AS_NU_MAX:","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        raise bgp_driver_exc.InvalidParamType(param\u003dparam,"},{"line_number":31,"context_line":"                                              param_type\u003d\u0027integer\u0027)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    if (as_num \u003c AS_NUM_MIN or as_num \u003e AS_NUM_MAX):"},{"line_number":34,"context_line":"        # Must be in [AS_NUM_MIN, AS_NUM_MAX] range."},{"line_number":35,"context_line":"        allowed_range \u003d (\u0027[\u0027 + str(AS_NUM_MIN) + \u0027-\u0027 +"},{"line_number":36,"context_line":"                         str(AS_NUM_MAX) + \u0027]\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_c36320db","line":33,"range":{"start_line":33,"start_character":17,"end_line":33,"end_character":27},"in_reply_to":"9a68dd71_baead90d","updated":"2016-01-22 06:12:17.000000000","message":"Ok. Will change.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def validate_auth(auth_type, password):"},{"line_number":42,"context_line":"    validate_string(password)"},{"line_number":43,"context_line":"    if (auth_type in BGP_SUPPORTED_AUTH_TYPE):"},{"line_number":44,"context_line":"        if ((auth_type is not \u0027none\u0027) and (password is None)):"},{"line_number":45,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":46,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_3adfc96a","line":43,"range":{"start_line":43,"start_character":20,"end_line":43,"end_character":21},"updated":"2016-01-21 22:44:38.000000000","message":"useless braces","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def validate_auth(auth_type, password):"},{"line_number":42,"context_line":"    validate_string(password)"},{"line_number":43,"context_line":"    if (auth_type in BGP_SUPPORTED_AUTH_TYPE):"},{"line_number":44,"context_line":"        if ((auth_type is not \u0027none\u0027) and (password is None)):"},{"line_number":45,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":46,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_60ce4e85","line":43,"range":{"start_line":43,"start_character":20,"end_line":43,"end_character":21},"in_reply_to":"9a68dd71_3adfc96a","updated":"2016-01-27 11:30:54.000000000","message":"Done","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def validate_auth(auth_type, password):"},{"line_number":42,"context_line":"    validate_string(password)"},{"line_number":43,"context_line":"    if (auth_type in BGP_SUPPORTED_AUTH_TYPE):"},{"line_number":44,"context_line":"        if ((auth_type is not \u0027none\u0027) and (password is None)):"},{"line_number":45,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":46,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_839c48c1","line":43,"range":{"start_line":43,"start_character":20,"end_line":43,"end_character":21},"in_reply_to":"9a68dd71_3adfc96a","updated":"2016-01-22 06:12:17.000000000","message":"Ok. Will remove.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    def put_bgp_speaker(self, local_as, speaker):"},{"line_number":70,"context_line":"        self.cache[local_as] \u003d speaker"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def get_bgp_speaker(self, local_as):"},{"line_number":73,"context_line":"        if local_as in self.cache:"},{"line_number":74,"context_line":"            return self.cache[local_as]"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_5ac15d7f","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":23},"updated":"2016-01-21 22:44:38.000000000","message":"prefer:\n\n def get_...:\n  return self.cache.get(local_as)","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    def put_bgp_speaker(self, local_as, speaker):"},{"line_number":70,"context_line":"        self.cache[local_as] \u003d speaker"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def get_bgp_speaker(self, local_as):"},{"line_number":73,"context_line":"        if local_as in self.cache:"},{"line_number":74,"context_line":"            return self.cache[local_as]"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_6095ee3e","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":23},"in_reply_to":"9a68dd71_5ac15d7f","updated":"2016-01-27 11:30:54.000000000","message":"Done","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    def put_bgp_speaker(self, local_as, speaker):"},{"line_number":70,"context_line":"        self.cache[local_as] \u003d speaker"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def get_bgp_speaker(self, local_as):"},{"line_number":73,"context_line":"        if local_as in self.cache:"},{"line_number":74,"context_line":"            return self.cache[local_as]"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_03b13847","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":23},"in_reply_to":"9a68dd71_5ac15d7f","updated":"2016-01-22 06:12:17.000000000","message":"Ok. Will change.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        if local_as in self.cache:"},{"line_number":74,"context_line":"            return self.cache[local_as]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def remove_bgp_speaker(self, local_as):"},{"line_number":77,"context_line":"        del self.cache[local_as]"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_9a13550d","line":76,"range":{"start_line":76,"start_character":8,"end_line":76,"end_character":26},"updated":"2016-01-21 22:44:38.000000000","message":"is it fine to crash if local_as not in self.cache?","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8f1cdcab82c14b08df2faa0745d7850953d24876","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        if local_as in self.cache:"},{"line_number":74,"context_line":"            return self.cache[local_as]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def remove_bgp_speaker(self, local_as):"},{"line_number":77,"context_line":"        del self.cache[local_as]"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a68dd71_c3ba4023","line":76,"range":{"start_line":76,"start_character":8,"end_line":76,"end_character":26},"in_reply_to":"9a68dd71_9a13550d","updated":"2016-01-22 06:12:17.000000000","message":"Ideally caller must ensure but let\u0027s add a check for safety.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        if local_as in self.cache:"},{"line_number":74,"context_line":"            return self.cache[local_as]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def remove_bgp_speaker(self, local_as):"},{"line_number":77,"context_line":"        del self.cache[local_as]"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a5de9d1_e0879e10","line":76,"range":{"start_line":76,"start_character":8,"end_line":76,"end_character":26},"in_reply_to":"9a68dd71_c3ba4023","updated":"2016-01-27 11:30:54.000000000","message":"Done","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"}],"neutron/db/bgp_db.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d82ff7d0539daddfb7163593c0fff73ae62c9a4f","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":208,"context_line":"        ri \u003d bgp_peer[bgp_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":209,"context_line":"        auth_type \u003d ri.get(\u0027auth_type\u0027, None)"},{"line_number":210,"context_line":"        password \u003d ri.get(\u0027password\u0027, None)"},{"line_number":211,"context_line":"        if auth_type \u003d\u003d \u0027md5\u0027 and not password:"},{"line_number":212,"context_line":"            raise bgp_ext.InvalidBgpPeerMd5Authentication()"}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_563322ab","line":209,"updated":"2016-02-23 05:53:51.000000000","message":"you do not need None here by default get returns None","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d281cd026a7208b08ad737d68b5e1381ccb49311","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":208,"context_line":"        ri \u003d bgp_peer[bgp_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":209,"context_line":"        auth_type \u003d ri.get(\u0027auth_type\u0027, None)"},{"line_number":210,"context_line":"        password \u003d ri.get(\u0027password\u0027, None)"},{"line_number":211,"context_line":"        if auth_type \u003d\u003d \u0027md5\u0027 and not password:"},{"line_number":212,"context_line":"            raise bgp_ext.InvalidBgpPeerMd5Authentication()"}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_5b8846c5","line":209,"in_reply_to":"bae84128_16451ab2","updated":"2016-02-23 18:35:16.000000000","message":"Done","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6db89aea700b22497629fdfc2abf2a098a308149","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":208,"context_line":"        ri \u003d bgp_peer[bgp_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":209,"context_line":"        auth_type \u003d ri.get(\u0027auth_type\u0027, None)"},{"line_number":210,"context_line":"        password \u003d ri.get(\u0027password\u0027, None)"},{"line_number":211,"context_line":"        if auth_type \u003d\u003d \u0027md5\u0027 and not password:"},{"line_number":212,"context_line":"            raise bgp_ext.InvalidBgpPeerMd5Authentication()"}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_16451ab2","line":209,"in_reply_to":"bae84128_563322ab","updated":"2016-02-23 06:06:44.000000000","message":"Ok","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d82ff7d0539daddfb7163593c0fff73ae62c9a4f","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":208,"context_line":"        ri \u003d bgp_peer[bgp_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":209,"context_line":"        auth_type \u003d ri.get(\u0027auth_type\u0027, None)"},{"line_number":210,"context_line":"        password \u003d ri.get(\u0027password\u0027, None)"},{"line_number":211,"context_line":"        if auth_type \u003d\u003d \u0027md5\u0027 and not password:"},{"line_number":212,"context_line":"            raise bgp_ext.InvalidBgpPeerMd5Authentication()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_b6242e60","line":210,"updated":"2016-02-23 05:53:51.000000000","message":"ditto","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d281cd026a7208b08ad737d68b5e1381ccb49311","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":208,"context_line":"        ri \u003d bgp_peer[bgp_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":209,"context_line":"        auth_type \u003d ri.get(\u0027auth_type\u0027, None)"},{"line_number":210,"context_line":"        password \u003d ri.get(\u0027password\u0027, None)"},{"line_number":211,"context_line":"        if auth_type \u003d\u003d \u0027md5\u0027 and not password:"},{"line_number":212,"context_line":"            raise bgp_ext.InvalidBgpPeerMd5Authentication()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_bb9192f3","line":210,"in_reply_to":"bae84128_7614669f","updated":"2016-02-23 18:35:16.000000000","message":"Done","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6db89aea700b22497629fdfc2abf2a098a308149","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def create_bgp_peer(self, context, bgp_peer):"},{"line_number":208,"context_line":"        ri \u003d bgp_peer[bgp_ext.BGP_PEER_BODY_KEY_NAME]"},{"line_number":209,"context_line":"        auth_type \u003d ri.get(\u0027auth_type\u0027, None)"},{"line_number":210,"context_line":"        password \u003d ri.get(\u0027password\u0027, None)"},{"line_number":211,"context_line":"        if auth_type \u003d\u003d \u0027md5\u0027 and not password:"},{"line_number":212,"context_line":"            raise bgp_ext.InvalidBgpPeerMd5Authentication()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_7614669f","line":210,"in_reply_to":"bae84128_b6242e60","updated":"2016-02-23 06:06:44.000000000","message":"Ok","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"}],"neutron/extensions/bgp.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9e750137d7433cc10f5710880336d8df25bb8121","unresolved":false,"context_lines":[{"line_number":25,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":26,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":31,"context_line":"    BGP_SPEAKER_RESOURCE_NAME + \u0027s\u0027: {"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_7f197821","side":"PARENT","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":42},"updated":"2016-02-18 20:46:33.000000000","message":"Why\u0027d we add these here in the first place?  We *just* merged this.  :P","commit_id":"fbe754b04b34a2deade873cde0b593983633fc6c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6ad8df37fa03bbe8f5564a11ccd9ab341ab28aab","unresolved":false,"context_lines":[{"line_number":25,"context_line":"BGP_SPEAKER_BODY_KEY_NAME \u003d \u0027bgp_speaker\u0027"},{"line_number":26,"context_line":"BGP_PEER_BODY_KEY_NAME \u003d \u0027bgp_peer\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"bgp_supported_auth_types \u003d [\u0027none\u0027, \u0027md5\u0027]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":31,"context_line":"    BGP_SPEAKER_RESOURCE_NAME + \u0027s\u0027: {"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_6aa2469c","side":"PARENT","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":42},"in_reply_to":"dae33548_7f197821","updated":"2016-02-19 03:58:47.000000000","message":"We didn\u0027t realized these might be required by the driver\u0027s as well ;)","commit_id":"fbe754b04b34a2deade873cde0b593983633fc6c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9e750137d7433cc10f5710880336d8df25bb8121","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":48,"id":"dae33548_3fd1b023","updated":"2016-02-18 20:46:33.000000000","message":"This file just looks like a lot of cleanup from previous patch sets that I\u0027ve just reviewed.  But, this is new code and there is no need to worry about backports, merge conflicts or any of the other reasons I would reject this kind of stuff from a patch.  So, I\u0027m actually okay with it.","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"}],"neutron/services/bgp/agent/bgp_dragent.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"928426f5d8b729beb264f6dc6ff43adc639238bd","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            raise SystemExit(1)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def handle_driver_failure(self, bgp_speaker_id, method, driver_exec):"},{"line_number":77,"context_line":"        if (getattr(driver_exec, \u0027exc_type\u0027, \u0027\u0027)"},{"line_number":78,"context_line":"            !\u003d \u0027BgpSpeakerAlreadyScheduled\u0027):"},{"line_number":79,"context_line":"            # Don\u0027t re-sync if the BgpSpeaker is already hosted."},{"line_number":80,"context_line":"            # This could be a valid case in the following scenario"}],"source_content_type":"text/x-python","patch_set":46,"id":"dae33548_b678c7c5","line":77,"range":{"start_line":77,"start_character":45,"end_line":77,"end_character":48},"updated":"2016-02-17 00:53:13.000000000","message":"I would suggest catching BgpSpeakerAlreadyScheduled explicitly, then invoking this method for all other exception types. This logic could then be eliminated and it might make this code a little more readable.\n\nFor example:\n\n....\ntry:\n    self.dr_driver_cls.add_bgp_speaker(bgp_speaker[\u0027local_as\u0027])\nexcept BgpSpeakerAlreadyScheduled:\n    return\nexcept Exception as e:\n    self.handle_driver_failure(bgp_speaker[\u0027id\u0027],\n                               \u0027add_bgp_speaker\u0027, e)\n...","commit_id":"ecaa50eaa6a9424278edcf39e36eeb9d8be34ea6"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0c46720f7cc38085e4a8650cec23825db648268c","unresolved":false,"context_lines":[{"line_number":404,"context_line":"                                            bgp_peer[\u0027remote_as\u0027],"},{"line_number":405,"context_line":"                                            bgp_peer[\u0027auth_type\u0027],"},{"line_number":406,"context_line":"                                            bgp_peer[\u0027password\u0027])"},{"line_number":407,"context_line":"        except driver_exc.BgpSpeakerAlreadyScheduled:"},{"line_number":408,"context_line":"            return"},{"line_number":409,"context_line":"        except Exception as e:"},{"line_number":410,"context_line":"            self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_8ac4ea5f","line":407,"updated":"2016-02-19 03:50:49.000000000","message":"dr_driver_cls.add_bgp_peer can raise below exceptions:\n\n\"BgpSpeakerNotAdded, InvalidParamType, InvalidParamRange, InvaildAuthType, PasswordNotSpecified\"\n\nI think we don\u0027t need this change.","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"32cff20d9bc915360bea34d63dc3bb6f9ce1746e","unresolved":false,"context_lines":[{"line_number":404,"context_line":"                                            bgp_peer[\u0027remote_as\u0027],"},{"line_number":405,"context_line":"                                            bgp_peer[\u0027auth_type\u0027],"},{"line_number":406,"context_line":"                                            bgp_peer[\u0027password\u0027])"},{"line_number":407,"context_line":"        except driver_exc.BgpSpeakerAlreadyScheduled:"},{"line_number":408,"context_line":"            return"},{"line_number":409,"context_line":"        except Exception as e:"},{"line_number":410,"context_line":"            self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_423112a2","line":407,"in_reply_to":"dae33548_8ac4ea5f","updated":"2016-02-19 19:01:11.000000000","message":"Done","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f6a0e55d5b1a3cd8ed587603b00243b1460fc6ad","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                          self.conf.bgp_speaker_driver)"},{"line_number":75,"context_line":"            raise SystemExit(1)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def handle_driver_failure(self, bgp_speaker_id, method, driver_exec):"},{"line_number":78,"context_line":"        self.schedule_resync(reason\u003ddriver_exec,"},{"line_number":79,"context_line":"                             speaker_id\u003dbgp_speaker_id)"},{"line_number":80,"context_line":"        LOG.exception(_LE(\u0027Call to driver for BGP Speaker %(bgp_speaker)s \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_6021754d","line":77,"updated":"2016-02-22 06:41:50.000000000","message":"this is an internal method so should be prefixed with _","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                          self.conf.bgp_speaker_driver)"},{"line_number":75,"context_line":"            raise SystemExit(1)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def handle_driver_failure(self, bgp_speaker_id, method, driver_exec):"},{"line_number":78,"context_line":"        self.schedule_resync(reason\u003ddriver_exec,"},{"line_number":79,"context_line":"                             speaker_id\u003dbgp_speaker_id)"},{"line_number":80,"context_line":"        LOG.exception(_LE(\u0027Call to driver for BGP Speaker %(bgp_speaker)s \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_a338a0a1","line":77,"in_reply_to":"bae84128_6021754d","updated":"2016-02-22 10:34:22.000000000","message":"Ok, Will correct!","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                          self.conf.bgp_speaker_driver)"},{"line_number":75,"context_line":"            raise SystemExit(1)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def handle_driver_failure(self, bgp_speaker_id, method, driver_exec):"},{"line_number":78,"context_line":"        self.schedule_resync(reason\u003ddriver_exec,"},{"line_number":79,"context_line":"                             speaker_id\u003dbgp_speaker_id)"},{"line_number":80,"context_line":"        LOG.exception(_LE(\u0027Call to driver for BGP Speaker %(bgp_speaker)s \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_b12103a2","line":77,"in_reply_to":"bae84128_a338a0a1","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f6a0e55d5b1a3cd8ed587603b00243b1460fc6ad","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def handle_driver_failure(self, bgp_speaker_id, method, driver_exec):"},{"line_number":78,"context_line":"        self.schedule_resync(reason\u003ddriver_exec,"},{"line_number":79,"context_line":"                             speaker_id\u003dbgp_speaker_id)"},{"line_number":80,"context_line":"        LOG.exception(_LE(\u0027Call to driver for BGP Speaker %(bgp_speaker)s \u0027"},{"line_number":81,"context_line":"                          \u0027%(method)s has failed with exception \u0027"},{"line_number":82,"context_line":"                          \u0027%(driver_exec)s.\u0027),"},{"line_number":83,"context_line":"                      {\u0027bgp_speaker\u0027: bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_20276d65","line":80,"updated":"2016-02-22 06:41:50.000000000","message":"why do we need a log exception here? why not the error?\nwill the stack trace be useful for us?","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def handle_driver_failure(self, bgp_speaker_id, method, driver_exec):"},{"line_number":78,"context_line":"        self.schedule_resync(reason\u003ddriver_exec,"},{"line_number":79,"context_line":"                             speaker_id\u003dbgp_speaker_id)"},{"line_number":80,"context_line":"        LOG.exception(_LE(\u0027Call to driver for BGP Speaker %(bgp_speaker)s \u0027"},{"line_number":81,"context_line":"                          \u0027%(method)s has failed with exception \u0027"},{"line_number":82,"context_line":"                          \u0027%(driver_exec)s.\u0027),"},{"line_number":83,"context_line":"                      {\u0027bgp_speaker\u0027: bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_115f0f0f","line":80,"in_reply_to":"bae84128_03798c2f","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def handle_driver_failure(self, bgp_speaker_id, method, driver_exec):"},{"line_number":78,"context_line":"        self.schedule_resync(reason\u003ddriver_exec,"},{"line_number":79,"context_line":"                             speaker_id\u003dbgp_speaker_id)"},{"line_number":80,"context_line":"        LOG.exception(_LE(\u0027Call to driver for BGP Speaker %(bgp_speaker)s \u0027"},{"line_number":81,"context_line":"                          \u0027%(method)s has failed with exception \u0027"},{"line_number":82,"context_line":"                          \u0027%(driver_exec)s.\u0027),"},{"line_number":83,"context_line":"                      {\u0027bgp_speaker\u0027: bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_03798c2f","line":80,"in_reply_to":"bae84128_20276d65","updated":"2016-02-22 10:34:22.000000000","message":"We can live with error as \u0027method\u0027 will help us to identify the flow.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":430,"context_line":"                                                   bgp_peer_ip)"},{"line_number":431,"context_line":"            except Exception as e:"},{"line_number":432,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"},{"line_number":433,"context_line":"                                           \u0027delete_bgp_peer\u0027, e)"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Peer should have been found, Some problem, Let\u0027s re-sync"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_23fbf0c2","line":433,"updated":"2016-02-22 10:34:22.000000000","message":"rename to \u0027remove_bgp_peer\u0027","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":430,"context_line":"                                                   bgp_peer_ip)"},{"line_number":431,"context_line":"            except Exception as e:"},{"line_number":432,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"},{"line_number":433,"context_line":"                                           \u0027delete_bgp_peer\u0027, e)"},{"line_number":434,"context_line":"            return"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Peer should have been found, Some problem, Let\u0027s re-sync"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_519fd7b3","line":433,"in_reply_to":"bae84128_23fbf0c2","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f6a0e55d5b1a3cd8ed587603b00243b1460fc6ad","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"},{"line_number":481,"context_line":"                                           \u0027withdraw_route\u0027, e)"},{"line_number":482,"context_line":"            return"},{"line_number":483,"context_line":"        # Something went wrong. Let\u0027s re-sync"},{"line_number":484,"context_line":"        self.schedule_resync(speaker_id\u003dbgp_speaker_id,"},{"line_number":485,"context_line":"                             reason\u003d\"Advertised routes Out-of-sync\")"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_20b5aded","line":483,"updated":"2016-02-22 06:41:50.000000000","message":"this comment is odd here. why not resync if there is an exception?","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"},{"line_number":481,"context_line":"                                           \u0027withdraw_route\u0027, e)"},{"line_number":482,"context_line":"            return"},{"line_number":483,"context_line":"        # Something went wrong. Let\u0027s re-sync"},{"line_number":484,"context_line":"        self.schedule_resync(speaker_id\u003dbgp_speaker_id,"},{"line_number":485,"context_line":"                             reason\u003d\"Advertised routes Out-of-sync\")"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_63afb881","line":483,"in_reply_to":"bae84128_20b5aded","updated":"2016-02-22 10:34:22.000000000","message":"Will rephrase!","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"},{"line_number":481,"context_line":"                                           \u0027withdraw_route\u0027, e)"},{"line_number":482,"context_line":"            return"},{"line_number":483,"context_line":"        # Something went wrong. Let\u0027s re-sync"},{"line_number":484,"context_line":"        self.schedule_resync(speaker_id\u003dbgp_speaker_id,"},{"line_number":485,"context_line":"                             reason\u003d\"Advertised routes Out-of-sync\")"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_51e197cf","line":483,"in_reply_to":"bae84128_63afb881","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0d3e3fae6b29adccd964c52e950ce44bf1e588fc","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def add_bgp_peer_helper(self, bgp_speaker_id, bgp_peer_id):"},{"line_number":250,"context_line":"        \"\"\"Add BGP peer.\"\"\""},{"line_number":251,"context_line":"        # Ideally BGP Speaker is must be added by now, If not then"},{"line_number":252,"context_line":"        # re-sync."},{"line_number":253,"context_line":"        if not self.cache.is_bgp_speaker_added(bgp_speaker_id):"},{"line_number":254,"context_line":"            self.schedule_resync(speaker_id\u003dbgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":50,"id":"bae84128_d4cab56d","line":251,"updated":"2016-02-22 12:29:44.000000000","message":"remove \u0027is\u0027","commit_id":"e1df2ca4c63cf55d90bdb8e7907b1b4743427f68"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0d3e3fae6b29adccd964c52e950ce44bf1e588fc","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def add_routes_helper(self, bgp_speaker_id, routes):"},{"line_number":268,"context_line":"        \"\"\"Advertise routes to BGP speaker.\"\"\""},{"line_number":269,"context_line":"        # Ideally BGP Speaker is must be added by now, If not then"},{"line_number":270,"context_line":"        # re-sync."},{"line_number":271,"context_line":"        if not self.cache.is_bgp_speaker_added(bgp_speaker_id):"},{"line_number":272,"context_line":"            self.schedule_resync(speaker_id\u003dbgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":50,"id":"bae84128_14c53d5a","line":269,"updated":"2016-02-22 12:29:44.000000000","message":"ditto","commit_id":"e1df2ca4c63cf55d90bdb8e7907b1b4743427f68"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0d3e3fae6b29adccd964c52e950ce44bf1e588fc","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def withdraw_routes_helper(self, bgp_speaker_id, routes):"},{"line_number":285,"context_line":"        \"\"\"Withdraw routes advertised by BGP speaker.\"\"\""},{"line_number":286,"context_line":"        # Ideally BGP Speaker is must be added by now, If not then"},{"line_number":287,"context_line":"        # re-sync."},{"line_number":288,"context_line":"        if not self.cache.is_bgp_speaker_added(bgp_speaker_id):"},{"line_number":289,"context_line":"            self.schedule_resync(speaker_id\u003dbgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":50,"id":"bae84128_74a2c9af","line":286,"updated":"2016-02-22 12:29:44.000000000","message":"ditto","commit_id":"e1df2ca4c63cf55d90bdb8e7907b1b4743427f68"}],"neutron/services/bgp/agent/config.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"e2656b25f3ca7d8d1b105c2b189ad166938f1c56","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRAGENT_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.services.bgp_speaker.driver.\u0027"},{"line_number":21,"context_line":"                   \u0027ryu.driver.RyuBgpDriver\u0027,"},{"line_number":22,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":23,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a1a9d01_91037973","line":20,"updated":"2015-09-25 17:48:16.000000000","message":"\u0027neutron.services.bgp.agent.driver.ryu.driver.RyuBgpDriver","commit_id":"f30f3d724999fb563343b80b3ed8670a579e9087"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f8dd8cda9b79140f2b7766f3ee5a5c989ffd3dfe","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRAGENT_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.services.bgp_speaker.driver.\u0027"},{"line_number":21,"context_line":"                   \u0027ryu.driver.RyuBgpDriver\u0027,"},{"line_number":22,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":23,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a1a9d01_811eb961","line":20,"in_reply_to":"9a1a9d01_91037973","updated":"2015-09-26 11:25:12.000000000","message":"Good Catch. Done.","commit_id":"f30f3d724999fb563343b80b3ed8670a579e9087"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9e750137d7433cc10f5710880336d8df25bb8121","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"BGP_PROTO_CONFIG_OPTS \u003d ["},{"line_number":25,"context_line":"    cfg.StrOpt(\u0027bgp_router_id\u0027,"},{"line_number":26,"context_line":"               help\u003d_(\"BGP speaker identifier, which MUST be the IPv4 address \""},{"line_number":27,"context_line":"                      \"of the node where the BGP DrAgent hosts the speaker.\"))"},{"line_number":28,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_524f4b33","line":26,"range":{"start_line":26,"start_character":61,"end_line":26,"end_character":77},"updated":"2016-02-18 20:46:33.000000000","message":"which IPv4 address?  What if it has multiple?  If they are different, should it be the one that the speaker uses to make connections to the routers (I assume)?","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6ad8df37fa03bbe8f5564a11ccd9ab341ab28aab","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"BGP_PROTO_CONFIG_OPTS \u003d ["},{"line_number":25,"context_line":"    cfg.StrOpt(\u0027bgp_router_id\u0027,"},{"line_number":26,"context_line":"               help\u003d_(\"BGP speaker identifier, which MUST be the IPv4 address \""},{"line_number":27,"context_line":"                      \"of the node where the BGP DrAgent hosts the speaker.\"))"},{"line_number":28,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_eadbf61f","line":26,"range":{"start_line":26,"start_character":61,"end_line":26,"end_character":77},"in_reply_to":"dae33548_524f4b33","updated":"2016-02-19 03:58:47.000000000","message":"Normally this is loopback\u0027s IP-address.\n\nhttp://www.cisco.com/c/en/us/td/docs/ios/iproute_bgp/command/reference/irg_book/irg_bgp1.html#wp111580\n\nCommand Default\n\nThe following behavior determines local router ID selection when this command is not enabled:\n\n•If a loopback interface is configured, the router ID is set to the IP address of the loopback interface. If multiple loopback interfaces are configured, the router ID is set to the IP address of the loopback interface with the highest IP address.\n\n•If no loopback interface is configured, the router ID is set to the highest IP address on a physical interface.","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"32cff20d9bc915360bea34d63dc3bb6f9ce1746e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"BGP_PROTO_CONFIG_OPTS \u003d ["},{"line_number":25,"context_line":"    cfg.StrOpt(\u0027bgp_router_id\u0027,"},{"line_number":26,"context_line":"               help\u003d_(\"BGP speaker identifier, which MUST be the IPv4 address \""},{"line_number":27,"context_line":"                      \"of the node where the BGP DrAgent hosts the speaker.\"))"},{"line_number":28,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_c2c7e243","line":26,"range":{"start_line":26,"start_character":61,"end_line":26,"end_character":77},"in_reply_to":"dae33548_eadbf61f","updated":"2016-02-19 19:01:11.000000000","message":"Will re-word the help string and make a note to address this in the networking guide.  See \"BGP Identifier\" under section 1.1 https://tools.ietf.org/html/rfc4271","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f6a0e55d5b1a3cd8ed587603b00243b1460fc6ad","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.services.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":21,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":22,"context_line":"]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_e0a105ab","line":20,"updated":"2016-02-22 06:41:50.000000000","message":"alignment here is dodgy\n\nso the ryu driver will be the default one?\nwhat if i am not using ryu?","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.services.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":21,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":22,"context_line":"]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_712c9b02","line":20,"in_reply_to":"bae84128_a305407b","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.services.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":21,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":22,"context_line":"]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_a305407b","line":20,"in_reply_to":"bae84128_e0a105ab","updated":"2016-02-22 10:34:22.000000000","message":"garyk: alignment here is dodgy:\nvikram: Will correct the alignment.\n\ngaryk: so the ryu driver will be the default one?\nvikram: Yes\n\ngaryk: what if i am not using ryu?\nvikram: Got to provide the driver details via cfg.\nhttps://github.com/openstack/neutron/blob/master/devstack/settings#L5","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d82ff7d0539daddfb7163593c0fff73ae62c9a4f","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027neutron.services.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_f6e996e7","line":22,"updated":"2016-02-23 05:53:51.000000000","message":"I do not think that the RYU plugin should be the default. \nPlease set this as None and when you run devstack or whatever you can set it as the RYU one.","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d281cd026a7208b08ad737d68b5e1381ccb49311","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027neutron.services.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_bbfa3241","line":22,"in_reply_to":"bae84128_161cfabf","updated":"2016-02-23 18:35:16.000000000","message":"This is a simple change to make, although I\u0027m curious what the rationale behind not setting a default here is.  I\u0027m not seeing the issue, so a little more explanation would be appreciated, it feels like picking nits to me.  This is the reference driver, and it is the only Neutron BGP driver that has been written. Is it just a matter of Neutron not wanting to be seen as playing favorites with different technologies?","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"265816d1f4bb5cd20ca151856e7da6a335e2052d","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027neutron.services.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_4234cedc","line":22,"in_reply_to":"bae84128_bbfa3241","updated":"2016-02-23 23:02:55.000000000","message":"It is the reference driver and uses open source python software.  I\u0027m not sure why it shouldn\u0027t be the default.  But, I don\u0027t feel strongly about it.  I think we should at least have the devstack plugin.sh configure the ryu plugin if this is going to be set to None.","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6db89aea700b22497629fdfc2abf2a098a308149","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027neutron.services.bgp.driver.ryu.driver.RyuBgpDriver\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_161cfabf","line":22,"in_reply_to":"bae84128_f6e996e7","updated":"2016-02-23 06:06:44.000000000","message":"Make sense. Let\u0027s have some more opinion on this.","commit_id":"5c2a7522ca2b3899e505dd8ab6b8c882d02b9927"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"f46efb3bccdb3a169a6a8c255061dd3eb1150581","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":22,"context_line":"               default\u003dNone,"},{"line_number":23,"context_line":"               help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"bae84128_62a112f8","line":22,"range":{"start_line":22,"start_character":23,"end_line":22,"end_character":27},"updated":"2016-02-23 23:03:10.000000000","message":"Now that None is default here should we set up the devstack plugin to load Ryu by default?","commit_id":"83c750b6950c4d4c6a7a582a7cd57a46f4bdd325"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"0327032d16d3e6930d26fb54328b8c7e4e649c76","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":22,"context_line":"               default\u003dNone,"},{"line_number":23,"context_line":"               help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"bae84128_9d5c777e","line":22,"range":{"start_line":22,"start_character":23,"end_line":22,"end_character":27},"in_reply_to":"bae84128_62a112f8","updated":"2016-02-23 23:09:36.000000000","message":"Will make the change to load Ryu driver by default in the devstack plugin","commit_id":"83c750b6950c4d4c6a7a582a7cd57a46f4bdd325"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9fffddb00408e1dde7a35a87a20a867865cf2674","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"BGP_DRIVER_OPTS \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":22,"context_line":"               default\u003dNone,"},{"line_number":23,"context_line":"               help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_9fd2fdd0","line":22,"updated":"2016-02-28 09:27:28.000000000","message":"Thanks!","commit_id":"b33c4dd2ce394a0bca53b96ed9aeeeffbefd2456"}],"neutron/services/bgp/agent/driver/base.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"e2656b25f3ca7d8d1b105c2b189ad166938f1c56","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @abc.abstractmethod"},{"line_number":32,"context_line":"    def get_maximum_speaker_support(self):"},{"line_number":33,"context_line":"        \"\"\"Query interface for knowing maximum speaker support."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        Get the maximum number of BgpSpeakers driver can schedule."}],"source_content_type":"text/x-python","patch_set":16,"id":"9a1a9d01_d19a5114","line":32,"updated":"2015-09-25 17:48:16.000000000","message":"It\u0027s really about asking whether a driver supports multi-instance/views or not, so what we\u0027re interested in isn\u0027t really a number, it\u0027s whether the driver supports multi-process BGP.  Perhaps is_bgp_multi_instance() and returning a boolean would be more appropriate.","commit_id":"f30f3d724999fb563343b80b3ed8670a579e9087"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f8dd8cda9b79140f2b7766f3ee5a5c989ffd3dfe","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @abc.abstractmethod"},{"line_number":32,"context_line":"    def get_maximum_speaker_support(self):"},{"line_number":33,"context_line":"        \"\"\"Query interface for knowing maximum speaker support."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        Get the maximum number of BgpSpeakers driver can schedule."}],"source_content_type":"text/x-python","patch_set":16,"id":"9a1a9d01_412741b6","line":32,"in_reply_to":"9a1a9d01_d19a5114","updated":"2015-09-26 11:25:12.000000000","message":"Ok. Will change.","commit_id":"f30f3d724999fb563343b80b3ed8670a579e9087"}],"neutron/services/bgp/agent/driver/ryu/driver.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"e2656b25f3ca7d8d1b105c2b189ad166938f1c56","unresolved":false,"context_lines":[{"line_number":37,"context_line":"def bgp_peer_up_cb(remote_ip, remote_as):"},{"line_number":38,"context_line":"    LOG.info(_LI(\u0027BGP Peer %(peer_ip)s for remote_as\u003d%(peer_as)d is UP.\u0027),"},{"line_number":39,"context_line":"             {\u0027peer_ip\u0027: remote_ip, \u0027peer_as\u0027: remote_as})"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def best_path_change_cb(self, event):"},{"line_number":43,"context_line":"    LOG.info(_LI(\"Best path change observed. cidr\u003d%(prefix)s, \""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a1a9d01_64570503","line":40,"updated":"2015-09-25 17:48:16.000000000","message":"peer up/down callbacks should cause some sort of user-visible data regarding peering status to be updated.  Logging alone is not sufficient in my opinion.","commit_id":"f30f3d724999fb563343b80b3ed8670a579e9087"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f8dd8cda9b79140f2b7766f3ee5a5c989ffd3dfe","unresolved":false,"context_lines":[{"line_number":37,"context_line":"def bgp_peer_up_cb(remote_ip, remote_as):"},{"line_number":38,"context_line":"    LOG.info(_LI(\u0027BGP Peer %(peer_ip)s for remote_as\u003d%(peer_as)d is UP.\u0027),"},{"line_number":39,"context_line":"             {\u0027peer_ip\u0027: remote_ip, \u0027peer_as\u0027: remote_as})"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def best_path_change_cb(self, event):"},{"line_number":43,"context_line":"    LOG.info(_LI(\"Best path change observed. cidr\u003d%(prefix)s, \""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a1a9d01_612a8580","line":40,"in_reply_to":"9a1a9d01_64570503","updated":"2015-09-26 11:25:12.000000000","message":"Ok. Let\u0027s then discuss more about the usage of this interface.","commit_id":"f30f3d724999fb563343b80b3ed8670a579e9087"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"f1f746577e8b798df1fcba2a05678a5054a453ec","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.cache \u003d utils.BgpMultiSpeakerCache()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _read_config(self, cfg):"},{"line_number":64,"context_line":"        if ((cfg is None) or (cfg.bgp_router_id is None)):"},{"line_number":65,"context_line":"            # If either cfg or router_id is not specified, raise voice"},{"line_number":66,"context_line":"            LOG.error(_LE(\u0027Error initializing Ryu interface driver. \u0027"},{"line_number":67,"context_line":"                          \u0027MUST specify bgp_router_id via configuration.\u0027))"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a1a9d01_daa8d479","line":64,"updated":"2015-09-29 06:59:55.000000000","message":"Drop the outermost parens for coding style consistency.","commit_id":"cb030db817a3c788b1dab041d431f818f315a082"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"433cf8d5e7d24ef90819561a55c2effb9e74f229","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.cache \u003d utils.BgpMultiSpeakerCache()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _read_config(self, cfg):"},{"line_number":64,"context_line":"        if ((cfg is None) or (cfg.bgp_router_id is None)):"},{"line_number":65,"context_line":"            # If either cfg or router_id is not specified, raise voice"},{"line_number":66,"context_line":"            LOG.error(_LE(\u0027Error initializing Ryu interface driver. \u0027"},{"line_number":67,"context_line":"                          \u0027MUST specify bgp_router_id via configuration.\u0027))"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a1a9d01_ddb677f8","line":64,"in_reply_to":"9a1a9d01_daa8d479","updated":"2015-09-29 15:46:06.000000000","message":"Ok. Will do that.","commit_id":"cb030db817a3c788b1dab041d431f818f315a082"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"f1f746577e8b798df1fcba2a05678a5054a453ec","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        curr_speaker \u003d self.cache.get_bgp_speaker(speaker_as)"},{"line_number":79,"context_line":"        if curr_speaker is None:"},{"line_number":80,"context_line":"            # Ryu can only support One speaker"},{"line_number":81,"context_line":"            if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":82,"context_line":"                raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"},{"line_number":83,"context_line":"            else:"},{"line_number":84,"context_line":"                # Validate input parameters."}],"source_content_type":"text/x-python","patch_set":19,"id":"9a1a9d01_fad35802","line":81,"updated":"2015-09-29 06:59:55.000000000","message":"ditto","commit_id":"cb030db817a3c788b1dab041d431f818f315a082"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"433cf8d5e7d24ef90819561a55c2effb9e74f229","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        curr_speaker \u003d self.cache.get_bgp_speaker(speaker_as)"},{"line_number":79,"context_line":"        if curr_speaker is None:"},{"line_number":80,"context_line":"            # Ryu can only support One speaker"},{"line_number":81,"context_line":"            if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":82,"context_line":"                raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"},{"line_number":83,"context_line":"            else:"},{"line_number":84,"context_line":"                # Validate input parameters."}],"source_content_type":"text/x-python","patch_set":19,"id":"9a1a9d01_7dd08b1f","line":81,"in_reply_to":"9a1a9d01_fad35802","updated":"2015-09-29 15:46:06.000000000","message":"Ok. Will do that.","commit_id":"cb030db817a3c788b1dab041d431f818f315a082"}],"neutron/services/bgp/common/constants.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"928426f5d8b729beb264f6dc6ff43adc639238bd","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# Supported AS number range"},{"line_number":26,"context_line":"MIN_ASNUM \u003d 1"},{"line_number":27,"context_line":"MAX_ASNUM \u003d 65535"}],"source_content_type":"text/x-python","patch_set":46,"id":"dae33548_b1145144","line":27,"range":{"start_line":27,"start_character":12,"end_line":27,"end_character":17},"updated":"2016-02-17 00:53:13.000000000","message":"Should these constants be defined in a patch lower down the review chain?","commit_id":"ecaa50eaa6a9424278edcf39e36eeb9d8be34ea6"}],"neutron/services/bgp/driver/exceptions.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f6a0e55d5b1a3cd8ed587603b00243b1460fc6ad","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# BGP Driver Exceptions"},{"line_number":20,"context_line":"class BgpSpeakerNotAdded(n_exc.BadRequest):"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_4091d151","line":17,"updated":"2016-02-22 06:41:50.000000000","message":"missing from neutron._i18n import _","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# BGP Driver Exceptions"},{"line_number":20,"context_line":"class BgpSpeakerNotAdded(n_exc.BadRequest):"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_a37a60ef","line":17,"in_reply_to":"bae84128_4091d151","updated":"2016-02-22 10:34:22.000000000","message":"Opps! Thanks for pointing out!","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# BGP Driver Exceptions"},{"line_number":20,"context_line":"class BgpSpeakerNotAdded(n_exc.BadRequest):"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_5116b7a7","line":17,"in_reply_to":"bae84128_a37a60ef","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"}],"neutron/services/bgp/driver/ryu/driver.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"15eeb490ac4f4bf0b7ba68dd24462b1c43b2c9bc","unresolved":false,"context_lines":[{"line_number":36,"context_line":"             {\u0027peer_ip\u0027: remote_ip, \u0027peer_as\u0027: remote_as})"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def best_path_change_cb(self, event):"},{"line_number":40,"context_line":"    LOG.info(_LI(\"Best path change observed. cidr\u003d%(prefix)s, \""},{"line_number":41,"context_line":"                 \"nexthop\u003d%(nexthop)s, remote_as\u003d%(remote_as)d, \""},{"line_number":42,"context_line":"                 \"is_withdraw\u003d%(is_withdraw)s\"),"}],"source_content_type":"text/x-python","patch_set":36,"id":"7a5de9d1_6a6288af","line":39,"range":{"start_line":39,"start_character":24,"end_line":39,"end_character":28},"updated":"2016-02-02 22:20:19.000000000","message":"Remove self, this callback should only take a single param","commit_id":"b447defd717cdf15083c957b91d1a26c5481db73"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"15eeb490ac4f4bf0b7ba68dd24462b1c43b2c9bc","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            # Notify Ryu about BGP Peer addition"},{"line_number":119,"context_line":"            curr_speaker.neighbor_add(address\u003dpeer_ip,"},{"line_number":120,"context_line":"                                      remote_as\u003dpeer_as,"},{"line_number":121,"context_line":"                                      password\u003dpassword,"},{"line_number":122,"context_line":"                                      connect_mode\u003dCONNECT_MODE_ACTIVE)"},{"line_number":123,"context_line":"            LOG.info(_LI(\u0027Added BGP Peer %(peer)s for remote_as\u003d%(as)d to \u0027"},{"line_number":124,"context_line":"                         \u0027BGP Speaker running for local_as\u003d%(local_as)d.\u0027),"}],"source_content_type":"text/x-python","patch_set":36,"id":"7a5de9d1_0a0e74e5","line":121,"range":{"start_line":121,"start_character":55,"end_line":121,"end_character":56},"updated":"2016-02-02 22:20:19.000000000","message":"When the peer is created with no password, password is being passed into this method as the string \u0027none\u0027 causing a failure to open the session.  Could be a server-side problem, I\u0027ll investigate.","commit_id":"b447defd717cdf15083c957b91d1a26c5481db73"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"3e7a038b9cb34640130541c19c872a382c0b239a","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            # Notify Ryu about BGP Peer addition"},{"line_number":119,"context_line":"            curr_speaker.neighbor_add(address\u003dpeer_ip,"},{"line_number":120,"context_line":"                                      remote_as\u003dpeer_as,"},{"line_number":121,"context_line":"                                      password\u003dpassword,"},{"line_number":122,"context_line":"                                      connect_mode\u003dCONNECT_MODE_ACTIVE)"},{"line_number":123,"context_line":"            LOG.info(_LI(\u0027Added BGP Peer %(peer)s for remote_as\u003d%(as)d to \u0027"},{"line_number":124,"context_line":"                         \u0027BGP Speaker running for local_as\u003d%(local_as)d.\u0027),"}],"source_content_type":"text/x-python","patch_set":36,"id":"5a5ae5dd_4df3119f","line":121,"range":{"start_line":121,"start_character":55,"end_line":121,"end_character":56},"in_reply_to":"7a5de9d1_0a0e74e5","updated":"2016-02-04 00:53:28.000000000","message":"Forget this comment, the fix is indeed server-side and is being pushed.","commit_id":"b447defd717cdf15083c957b91d1a26c5481db73"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9e750137d7433cc10f5710880336d8df25bb8121","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def add_bgp_speaker(self, speaker_as):"},{"line_number":70,"context_line":"        curr_speaker \u003d self.cache.get_bgp_speaker(speaker_as)"},{"line_number":71,"context_line":"        if curr_speaker is None:"},{"line_number":72,"context_line":"            # Ryu can only support One speaker"},{"line_number":73,"context_line":"            if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":74,"context_line":"                raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_52a74ba6","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":31},"updated":"2016-02-18 20:46:33.000000000","message":"femto nit:  Just a style thing that might just be my preference.  I\u0027d reverse the sense of these check like this:\n\n  if curr_speaker is not None:\n      raise (from L92)\n\n  # Ryu can only support one speaker\n  ...\n\nDitto for the rest of the methods in here.  Just consider it.","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6ad8df37fa03bbe8f5564a11ccd9ab341ab28aab","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def add_bgp_speaker(self, speaker_as):"},{"line_number":70,"context_line":"        curr_speaker \u003d self.cache.get_bgp_speaker(speaker_as)"},{"line_number":71,"context_line":"        if curr_speaker is None:"},{"line_number":72,"context_line":"            # Ryu can only support One speaker"},{"line_number":73,"context_line":"            if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":74,"context_line":"                raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_8ad7caec","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":31},"in_reply_to":"dae33548_52a74ba6","updated":"2016-02-19 03:58:47.000000000","message":"Will change.","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"32cff20d9bc915360bea34d63dc3bb6f9ce1746e","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def add_bgp_speaker(self, speaker_as):"},{"line_number":70,"context_line":"        curr_speaker \u003d self.cache.get_bgp_speaker(speaker_as)"},{"line_number":71,"context_line":"        if curr_speaker is None:"},{"line_number":72,"context_line":"            # Ryu can only support One speaker"},{"line_number":73,"context_line":"            if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":74,"context_line":"                raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_e54b102a","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":31},"in_reply_to":"dae33548_52a74ba6","updated":"2016-02-19 19:01:11.000000000","message":"Will make this adjustment since I\u0027m spinning a new patch set anyway.","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f6a0e55d5b1a3cd8ed587603b00243b1460fc6ad","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                                                    rtid\u003dself.routerid)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Ryu can only support One speaker"},{"line_number":77,"context_line":"        if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":78,"context_line":"            raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            # Validate input parameters."}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_607df51b","line":77,"updated":"2016-02-22 06:41:50.000000000","message":"you do not need the extra brackets","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                                                    rtid\u003dself.routerid)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Ryu can only support One speaker"},{"line_number":77,"context_line":"        if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":78,"context_line":"            raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            # Validate input parameters."}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_a361c03b","line":77,"in_reply_to":"bae84128_607df51b","updated":"2016-02-22 10:34:22.000000000","message":"Will remove.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                                                    rtid\u003dself.routerid)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Ryu can only support One speaker"},{"line_number":77,"context_line":"        if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":78,"context_line":"            raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            # Validate input parameters."}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_717adbf2","line":77,"in_reply_to":"bae84128_a361c03b","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"96b22f55e58bf2294afed110e8096150789b6d1f","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        # Ryu can only support One speaker"},{"line_number":77,"context_line":"        if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":78,"context_line":"            raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            # Validate input parameters."},{"line_number":81,"context_line":"            # speaker_as must be an integer in the allowed range."},{"line_number":82,"context_line":"            utils.validate_as_num(\u0027local_as\u0027, speaker_as)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_d0f5e883","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":12},"updated":"2016-02-19 19:03:48.000000000","message":"Another femto nit:  Reduce indentation even more by eliminating this \"else:\"","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        # Ryu can only support One speaker"},{"line_number":77,"context_line":"        if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":78,"context_line":"            raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            # Validate input parameters."},{"line_number":81,"context_line":"            # speaker_as must be an integer in the allowed range."},{"line_number":82,"context_line":"            utils.validate_as_num(\u0027local_as\u0027, speaker_as)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_71613b39","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":12},"in_reply_to":"bae84128_2356505c","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        # Ryu can only support One speaker"},{"line_number":77,"context_line":"        if (self.cache.get_hosted_bgp_speakers_count() \u003d\u003d 1):"},{"line_number":78,"context_line":"            raise bgp_driver_exc.BgpSpeakerMaxScheduled(count\u003d1)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            # Validate input parameters."},{"line_number":81,"context_line":"            # speaker_as must be an integer in the allowed range."},{"line_number":82,"context_line":"            utils.validate_as_num(\u0027local_as\u0027, speaker_as)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_2356505c","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":12},"in_reply_to":"bae84128_d0f5e883","updated":"2016-02-22 10:34:22.000000000","message":"Will correct!","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ae7bdbe601849a3c52fd73dec2ab8794888fab44","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            # Notify Ryu about BGP Speaker addition"},{"line_number":85,"context_line":"            curr_speaker \u003d bgpspeaker.BGPSpeaker(as_number\u003dspeaker_as,"},{"line_number":86,"context_line":"                                 router_id\u003dself.routerid, bgp_server_port\u003d0,"},{"line_number":87,"context_line":"                                 best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":88,"context_line":"                                 peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":89,"context_line":"                                 peer_up_handler\u003dbgp_peer_up_cb)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_47f56bc9","line":86,"range":{"start_line":86,"start_character":58,"end_line":86,"end_character":75},"updated":"2016-02-22 04:32:14.000000000","message":"i guess it warrants a comment why bgp_server_port\u003d0.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            # Notify Ryu about BGP Speaker addition"},{"line_number":85,"context_line":"            curr_speaker \u003d bgpspeaker.BGPSpeaker(as_number\u003dspeaker_as,"},{"line_number":86,"context_line":"                                 router_id\u003dself.routerid, bgp_server_port\u003d0,"},{"line_number":87,"context_line":"                                 best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":88,"context_line":"                                 peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":89,"context_line":"                                 peer_up_handler\u003dbgp_peer_up_cb)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_c3d5e4b9","line":86,"range":{"start_line":86,"start_character":58,"end_line":86,"end_character":75},"in_reply_to":"bae84128_47f56bc9","updated":"2016-02-22 10:34:22.000000000","message":"Will document our intention.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            # Notify Ryu about BGP Speaker addition"},{"line_number":85,"context_line":"            curr_speaker \u003d bgpspeaker.BGPSpeaker(as_number\u003dspeaker_as,"},{"line_number":86,"context_line":"                                 router_id\u003dself.routerid, bgp_server_port\u003d0,"},{"line_number":87,"context_line":"                                 best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":88,"context_line":"                                 peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":89,"context_line":"                                 peer_up_handler\u003dbgp_peer_up_cb)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_b1b74385","line":86,"range":{"start_line":86,"start_character":58,"end_line":86,"end_character":75},"in_reply_to":"bae84128_c3d5e4b9","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"86429866802648092977f30f1e60adcce8c901ab","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        # Notify Ryu about BGP Speaker addition."},{"line_number":85,"context_line":"        # Please note: Since, only the route-advertisement support is"},{"line_number":86,"context_line":"        # implemented we are explicitly setting the bgp_server_port"},{"line_number":87,"context_line":"        # attribute to 0 which disables listening on port 179."},{"line_number":88,"context_line":"        curr_speaker \u003d bgpspeaker.BGPSpeaker(as_number\u003dspeaker_as,"},{"line_number":89,"context_line":"                             router_id\u003dself.routerid, bgp_server_port\u003d0,"},{"line_number":90,"context_line":"                             best_path_change_handler\u003dbest_path_change_cb,"}],"source_content_type":"text/x-python","patch_set":51,"id":"bae84128_8f5f7ae4","line":87,"updated":"2016-02-22 12:58:27.000000000","message":"i thought usually the connection direction is independent from advertisement direction.\nis there any motivation to avoid listening?","commit_id":"ef999bc7b025181ce0073d39e0a14717a19ad910"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f1ca14e4a0c7e12926fe973a100e9a18102b17ea","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        # Notify Ryu about BGP Speaker addition."},{"line_number":85,"context_line":"        # Please note: Since, only the route-advertisement support is"},{"line_number":86,"context_line":"        # implemented we are explicitly setting the bgp_server_port"},{"line_number":87,"context_line":"        # attribute to 0 which disables listening on port 179."},{"line_number":88,"context_line":"        curr_speaker \u003d bgpspeaker.BGPSpeaker(as_number\u003dspeaker_as,"},{"line_number":89,"context_line":"                             router_id\u003dself.routerid, bgp_server_port\u003d0,"},{"line_number":90,"context_line":"                             best_path_change_handler\u003dbest_path_change_cb,"}],"source_content_type":"text/x-python","patch_set":51,"id":"bae84128_e0272c10","line":87,"in_reply_to":"bae84128_8f5f7ae4","updated":"2016-02-22 16:15:41.000000000","message":"You are correct that connection is independent from the announcements.  However, we didn\u0027t want to allow just anybody to begin peering with Neutron.  We also encountered the problem where sudo privileges are required to be able to begin listening on port 179. For these 2 reasons, we\u0027ve decided to not worry about listening right now. I will make a note to document this and the impact it has on peer configuration.  If you configure your peers in passive mode, Ryu will initiate the session and everything works without a hitch.","commit_id":"ef999bc7b025181ce0073d39e0a14717a19ad910"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"86429866802648092977f30f1e60adcce8c901ab","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                             router_id\u003dself.routerid, bgp_server_port\u003d0,"},{"line_number":90,"context_line":"                             best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":91,"context_line":"                             peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":92,"context_line":"                             peer_up_handler\u003dbgp_peer_up_cb)"},{"line_number":93,"context_line":"        LOG.info(_LI(\u0027Added BGP Speaker for local_as\u003d%(as)d with \u0027"},{"line_number":94,"context_line":"                     \u0027router_id\u003d %(rtid)s.\u0027),"},{"line_number":95,"context_line":"                 {\u0027as\u0027: speaker_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":51,"id":"bae84128_6fbaf6c1","line":92,"updated":"2016-02-22 12:58:27.000000000","message":"i think you need an extra validation because\nryu bgp does not seem to support an empty password.\n\nhttps://github.com/osrg/ryu/blob/6b3c4dfd4350b621f00ebe2593d92a16f2e542ca/ryu/services/protocols/bgp/base.py#L410","commit_id":"ef999bc7b025181ce0073d39e0a14717a19ad910"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f1ca14e4a0c7e12926fe973a100e9a18102b17ea","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                             router_id\u003dself.routerid, bgp_server_port\u003d0,"},{"line_number":90,"context_line":"                             best_path_change_handler\u003dbest_path_change_cb,"},{"line_number":91,"context_line":"                             peer_down_handler\u003dbgp_peer_down_cb,"},{"line_number":92,"context_line":"                             peer_up_handler\u003dbgp_peer_up_cb)"},{"line_number":93,"context_line":"        LOG.info(_LI(\u0027Added BGP Speaker for local_as\u003d%(as)d with \u0027"},{"line_number":94,"context_line":"                     \u0027router_id\u003d %(rtid)s.\u0027),"},{"line_number":95,"context_line":"                 {\u0027as\u0027: speaker_as, \u0027rtid\u0027: self.routerid})"}],"source_content_type":"text/x-python","patch_set":51,"id":"bae84128_605f9ce5","line":92,"in_reply_to":"bae84128_6fbaf6c1","updated":"2016-02-22 16:15:41.000000000","message":"I believe that this can be handled at the API layer by making sure that if the auth_type is \"md5\" \"password\" must not be empty.","commit_id":"ef999bc7b025181ce0073d39e0a14717a19ad910"}],"neutron/services/bgp/driver/utils.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b58453a95e967c94c41e2f67f1609f348ad32683","unresolved":false,"context_lines":[{"line_number":41,"context_line":"def validate_auth(auth_type, password):"},{"line_number":42,"context_line":"    validate_string(password)"},{"line_number":43,"context_line":"    if auth_type in BGP_SUPPORTED_AUTH_TYPE:"},{"line_number":44,"context_line":"        if ((auth_type is not \u0027none\u0027) and (password is None)):"},{"line_number":45,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":46,"context_line":"    else:"},{"line_number":47,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"}],"source_content_type":"text/x-python","patch_set":36,"id":"5a5ae5dd_4b6819bb","line":44,"range":{"start_line":44,"start_character":22,"end_line":44,"end_character":23},"updated":"2016-02-03 00:17:02.000000000","message":"Use !\u003d here instead of \"is not\". This breaks peering where you don\u0027t secure the session with a password.  An exception is raised here when it should not because this doesn\u0027t do a deep compare of the strings.  Consider adding a test to assert proper behavior here.","commit_id":"b447defd717cdf15083c957b91d1a26c5481db73"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"3e7a038b9cb34640130541c19c872a382c0b239a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"def validate_auth(auth_type, password):"},{"line_number":42,"context_line":"    validate_string(password)"},{"line_number":43,"context_line":"    if auth_type in BGP_SUPPORTED_AUTH_TYPE:"},{"line_number":44,"context_line":"        if ((auth_type is not \u0027none\u0027) and (password is None)):"},{"line_number":45,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":46,"context_line":"    else:"},{"line_number":47,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"}],"source_content_type":"text/x-python","patch_set":36,"id":"5a5ae5dd_9097e28f","line":44,"range":{"start_line":44,"start_character":22,"end_line":44,"end_character":23},"in_reply_to":"5a5ae5dd_4b6819bb","updated":"2016-02-04 00:53:28.000000000","message":"Done","commit_id":"b447defd717cdf15083c957b91d1a26c5481db73"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9e750137d7433cc10f5710880336d8df25bb8121","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        raise bgp_driver_exc.InvalidParamType(param\u003dparam,"},{"line_number":26,"context_line":"                                              param_type\u003d\u0027integer\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    if (as_num \u003c bgp_consts.MIN_ASNUM or as_num \u003e bgp_consts.MAX_ASNUM):"},{"line_number":29,"context_line":"        # Must be in [AS_NUM_MIN, AS_NUM_MAX] range."},{"line_number":30,"context_line":"        allowed_range \u003d (\u0027[\u0027 +"},{"line_number":31,"context_line":"                         str(bgp_consts.MIN_ASNUM) + \u0027-\u0027 +"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_b2069783","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":70},"updated":"2016-02-18 20:46:33.000000000","message":"nit:  There\u0027s a neat way to do this which is nice and readable since it clearly shows as_num nestled right between the min and the max:\n\n  if not (bgp_consts.MIN_ASNUM \u003c\u003d as_num \u003c\u003d bgp_consts.MAX_ASNUM):","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6ad8df37fa03bbe8f5564a11ccd9ab341ab28aab","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        raise bgp_driver_exc.InvalidParamType(param\u003dparam,"},{"line_number":26,"context_line":"                                              param_type\u003d\u0027integer\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    if (as_num \u003c bgp_consts.MIN_ASNUM or as_num \u003e bgp_consts.MAX_ASNUM):"},{"line_number":29,"context_line":"        # Must be in [AS_NUM_MIN, AS_NUM_MAX] range."},{"line_number":30,"context_line":"        allowed_range \u003d (\u0027[\u0027 +"},{"line_number":31,"context_line":"                         str(bgp_consts.MIN_ASNUM) + \u0027-\u0027 +"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_2afdde6e","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":70},"in_reply_to":"dae33548_b2069783","updated":"2016-02-19 03:58:47.000000000","message":"Ok","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9e750137d7433cc10f5710880336d8df25bb8121","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.cache \u003d {}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def get_hosted_bgp_speakers_count(self):"},{"line_number":64,"context_line":"        return len(self.cache.keys())"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def put_bgp_speaker(self, local_as, speaker):"},{"line_number":67,"context_line":"        self.cache[local_as] \u003d speaker"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_f20adf77","line":64,"range":{"start_line":64,"start_character":29,"end_line":64,"end_character":36},"updated":"2016-02-18 20:46:33.000000000","message":"nit:  .keys() is redundant.  Just len(self.cache) is good enough and doesn\u0027t require the generation of a list.","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6ad8df37fa03bbe8f5564a11ccd9ab341ab28aab","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.cache \u003d {}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def get_hosted_bgp_speakers_count(self):"},{"line_number":64,"context_line":"        return len(self.cache.keys())"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def put_bgp_speaker(self, local_as, speaker):"},{"line_number":67,"context_line":"        self.cache[local_as] \u003d speaker"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_0a029a6f","line":64,"range":{"start_line":64,"start_character":29,"end_line":64,"end_character":36},"in_reply_to":"dae33548_f20adf77","updated":"2016-02-19 03:58:47.000000000","message":"Ok","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9e750137d7433cc10f5710880336d8df25bb8121","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        return self.cache.get(local_as)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def remove_bgp_speaker(self, local_as):"},{"line_number":73,"context_line":"        if local_as in self.cache:"},{"line_number":74,"context_line":"            del self.cache[local_as]"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_b27b37f4","line":74,"range":{"start_line":73,"start_character":8,"end_line":74,"end_character":36},"updated":"2016-02-18 20:46:33.000000000","message":"nit:  Just a suggestion:\n\n  self.cache.pop(local_as, None)","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6ad8df37fa03bbe8f5564a11ccd9ab341ab28aab","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        return self.cache.get(local_as)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def remove_bgp_speaker(self, local_as):"},{"line_number":73,"context_line":"        if local_as in self.cache:"},{"line_number":74,"context_line":"            del self.cache[local_as]"}],"source_content_type":"text/x-python","patch_set":48,"id":"dae33548_aaf1ee97","line":74,"range":{"start_line":73,"start_character":8,"end_line":74,"end_character":36},"in_reply_to":"dae33548_b27b37f4","updated":"2016-02-19 03:58:47.000000000","message":"Ok","commit_id":"9cf132acbc32fde2ec69aed97253c487378c2858"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ae7bdbe601849a3c52fd73dec2ab8794888fab44","unresolved":false,"context_lines":[{"line_number":38,"context_line":"def validate_auth(auth_type, password):"},{"line_number":39,"context_line":"    validate_string(password)"},{"line_number":40,"context_line":"    if auth_type in bgp_consts.SUPPORTED_AUTH_TYPES:"},{"line_number":41,"context_line":"        if ((auth_type !\u003d \u0027none\u0027) and (password is None)):"},{"line_number":42,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_a7dc3713","line":41,"updated":"2016-02-22 04:32:14.000000000","message":"is it intentional to allow an empty password?\n\niirc ryu disables tcp-md5 when an empty password is given.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"def validate_auth(auth_type, password):"},{"line_number":39,"context_line":"    validate_string(password)"},{"line_number":40,"context_line":"    if auth_type in bgp_consts.SUPPORTED_AUTH_TYPES:"},{"line_number":41,"context_line":"        if ((auth_type !\u003d \u0027none\u0027) and (password is None)):"},{"line_number":42,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_83c0fce1","line":41,"in_reply_to":"bae84128_60a4d5a5","updated":"2016-02-22 10:34:22.000000000","message":"Ok. Will remove.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"745ef2427fc83f4e766ca64614c5c34c753ae9fe","unresolved":false,"context_lines":[{"line_number":38,"context_line":"def validate_auth(auth_type, password):"},{"line_number":39,"context_line":"    validate_string(password)"},{"line_number":40,"context_line":"    if auth_type in bgp_consts.SUPPORTED_AUTH_TYPES:"},{"line_number":41,"context_line":"        if ((auth_type !\u003d \u0027none\u0027) and (password is None)):"},{"line_number":42,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_b2de0f6b","line":41,"in_reply_to":"bae84128_a396e0ed","updated":"2016-02-22 18:56:35.000000000","message":"See PS52, I have made password mandatory when using auth_type\u003dmd5.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"def validate_auth(auth_type, password):"},{"line_number":39,"context_line":"    validate_string(password)"},{"line_number":40,"context_line":"    if auth_type in bgp_consts.SUPPORTED_AUTH_TYPES:"},{"line_number":41,"context_line":"        if ((auth_type !\u003d \u0027none\u0027) and (password is None)):"},{"line_number":42,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_a396e0ed","line":41,"in_reply_to":"bae84128_a7dc3713","updated":"2016-02-22 10:34:22.000000000","message":"Yes password is optional.\nhttps://github.com/openstack/neutron/blob/master/neutron/extensions/bgp.py#L99-L103","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f6a0e55d5b1a3cd8ed587603b00243b1460fc6ad","unresolved":false,"context_lines":[{"line_number":38,"context_line":"def validate_auth(auth_type, password):"},{"line_number":39,"context_line":"    validate_string(password)"},{"line_number":40,"context_line":"    if auth_type in bgp_consts.SUPPORTED_AUTH_TYPES:"},{"line_number":41,"context_line":"        if ((auth_type !\u003d \u0027none\u0027) and (password is None)):"},{"line_number":42,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_60a4d5a5","line":41,"in_reply_to":"bae84128_a7dc3713","updated":"2016-02-22 06:41:50.000000000","message":"you do not need the extra brackets","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ae7bdbe601849a3c52fd73dec2ab8794888fab44","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    validate_string(password)"},{"line_number":40,"context_line":"    if auth_type in bgp_consts.SUPPORTED_AUTH_TYPES:"},{"line_number":41,"context_line":"        if ((auth_type !\u003d \u0027none\u0027) and (password is None)):"},{"line_number":42,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_0702436f","line":42,"updated":"2016-02-22 04:32:14.000000000","message":"it\u0027s better to ensure that password is None for \u0027none\u0027 auth type, given that ryu driver seems to ignore auth_type.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"7fdad44bd727e0735c57f69223a91833a1f0860e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    validate_string(password)"},{"line_number":40,"context_line":"    if auth_type in bgp_consts.SUPPORTED_AUTH_TYPES:"},{"line_number":41,"context_line":"        if ((auth_type !\u003d \u0027none\u0027) and (password is None)):"},{"line_number":42,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_ae3887a1","line":42,"in_reply_to":"bae84128_0702436f","updated":"2016-02-22 10:34:22.000000000","message":"This must be guaranteed by the neutron-server. Anyways will add this check.","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"05cef63f078eb8527be6f150a1a8f4fd0588e07e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    validate_string(password)"},{"line_number":40,"context_line":"    if auth_type in bgp_consts.SUPPORTED_AUTH_TYPES:"},{"line_number":41,"context_line":"        if ((auth_type !\u003d \u0027none\u0027) and (password is None)):"},{"line_number":42,"context_line":"            raise bgp_driver_exc.PasswordNotSpecified(auth_type\u003dauth_type)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        raise bgp_driver_exc.InvaildAuthType(auth_type\u003dauth_type)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bae84128_f126ebcc","line":42,"in_reply_to":"bae84128_ae3887a1","updated":"2016-02-22 12:16:40.000000000","message":"Done","commit_id":"d1e08f31c4ab3790092256cee08514b8fe2e6f48"}],"neutron/services/bgp_speaker/agent/config.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0be0e55878e9603c48a17e01de3e05f2334392d3","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"BGP_DRAGENT_OPTS \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027bgp_speaker_driver\u0027,"},{"line_number":20,"context_line":"           default\u003d\u0027neutron.agent.bgp.driver.ryu_driver.RyuBgpDriver\u0027,"},{"line_number":21,"context_line":"           help\u003d_(\"BGP speaker driver class to be instantiated.\"))"},{"line_number":22,"context_line":"]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba15a1d1_0d2457ad","line":20,"updated":"2015-09-20 04:12:04.000000000","message":"Plz use the correct import path \u0027neutron.services.bgp_speaker.agent.driver.ryu_driver.RyuBgpDriver\u0027","commit_id":"644307d7de66b6733efd5c8be131bbe55e0eace7"}],"neutron/services/bgp_speaker/agent/dr_agent.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        try:"},{"line_number":410,"context_line":"            self.dr_driver_cls.add_bgp_peer(bgp_speaker_as,"},{"line_number":411,"context_line":"                                            bgp_peer[\u0027peer_ip\u0027],"},{"line_number":412,"context_line":"                                            bgp_peer[\u0027remote_as\u0027],"},{"line_number":413,"context_line":"                                            bgp_peer[\u0027password\u0027])"},{"line_number":414,"context_line":"        except Exception as e:"},{"line_number":415,"context_line":"            self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_c73d96de","line":412,"updated":"2015-09-22 11:01:07.000000000","message":"No `bgp_peer[\u0027auth_type\u0027] here? I wonder why we need the auth type if not for configure the peer session... Just to record in DB?","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3a58dd8da96c979bb6a92d0d834f28d25b9ceb92","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        try:"},{"line_number":410,"context_line":"            self.dr_driver_cls.add_bgp_peer(bgp_speaker_as,"},{"line_number":411,"context_line":"                                            bgp_peer[\u0027peer_ip\u0027],"},{"line_number":412,"context_line":"                                            bgp_peer[\u0027remote_as\u0027],"},{"line_number":413,"context_line":"                                            bgp_peer[\u0027password\u0027])"},{"line_number":414,"context_line":"        except Exception as e:"},{"line_number":415,"context_line":"            self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a1a9d01_c1c5918e","line":412,"in_reply_to":"ba15a1d1_8826ca14","updated":"2015-09-26 12:31:47.000000000","message":"Done.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3456d089f6e5e11fd6dcb29f6874dd2f1b0c1191","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        try:"},{"line_number":410,"context_line":"            self.dr_driver_cls.add_bgp_peer(bgp_speaker_as,"},{"line_number":411,"context_line":"                                            bgp_peer[\u0027peer_ip\u0027],"},{"line_number":412,"context_line":"                                            bgp_peer[\u0027remote_as\u0027],"},{"line_number":413,"context_line":"                                            bgp_peer[\u0027password\u0027])"},{"line_number":414,"context_line":"        except Exception as e:"},{"line_number":415,"context_line":"            self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_8826ca14","line":412,"in_reply_to":"ba15a1d1_c73d96de","updated":"2015-09-22 12:16:00.000000000","message":"Good Catch! We can pass it to the driver and let it use accordingly. For now, I believe most of the driver only support MD5.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                   \u0027nexthop\u0027: route[\u0027next_hop\u0027]})"},{"line_number":482,"context_line":"            try:"},{"line_number":483,"context_line":"                self.dr_driver_cls.withdraw_route(bgp_speaker_as,"},{"line_number":484,"context_line":"                                                  route[\u0027destination\u0027])"},{"line_number":485,"context_line":"            except Exception as e:"},{"line_number":486,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"},{"line_number":487,"context_line":"                                           \u0027withdraw_route\u0027, e)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_59340add","line":484,"updated":"2015-09-22 11:01:07.000000000","message":"Can it be the case where we will handle with same destination, different next-hops and different weights? Maybe the first approach will not need this... but since we will encourage the driver development by third-party vendors, I would pass the \u0027next-hop\u0027 to the driver here","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3456d089f6e5e11fd6dcb29f6874dd2f1b0c1191","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                   \u0027nexthop\u0027: route[\u0027next_hop\u0027]})"},{"line_number":482,"context_line":"            try:"},{"line_number":483,"context_line":"                self.dr_driver_cls.withdraw_route(bgp_speaker_as,"},{"line_number":484,"context_line":"                                                  route[\u0027destination\u0027])"},{"line_number":485,"context_line":"            except Exception as e:"},{"line_number":486,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"},{"line_number":487,"context_line":"                                           \u0027withdraw_route\u0027, e)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_c8592290","line":484,"in_reply_to":"ba15a1d1_59340add","updated":"2015-09-22 12:16:00.000000000","message":"Ok. We can pass.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3a58dd8da96c979bb6a92d0d834f28d25b9ceb92","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                   \u0027nexthop\u0027: route[\u0027next_hop\u0027]})"},{"line_number":482,"context_line":"            try:"},{"line_number":483,"context_line":"                self.dr_driver_cls.withdraw_route(bgp_speaker_as,"},{"line_number":484,"context_line":"                                                  route[\u0027destination\u0027])"},{"line_number":485,"context_line":"            except Exception as e:"},{"line_number":486,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"},{"line_number":487,"context_line":"                                           \u0027withdraw_route\u0027, e)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a1a9d01_c1cb5152","line":484,"in_reply_to":"ba15a1d1_c8592290","updated":"2015-09-26 12:31:47.000000000","message":"Done.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":697,"context_line":""},{"line_number":698,"context_line":"    def after_start(self):"},{"line_number":699,"context_line":"        LOG.info(_LI(\"BGP dynamic routing agent started\"))"},{"line_number":700,"context_line":"        # TODO(Vikram): Notify DRScheduler about maximum speaker support"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_2c2f99a2","line":700,"updated":"2015-09-22 09:54:25.000000000","message":"DRScheduler \u003d\u003d\u003e BgpDrScheduler","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"761e8091a167ccbee94b3abc05fdc5790318b1f0","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        try:"},{"line_number":410,"context_line":"            self.dr_driver_cls.add_bgp_peer(bgp_speaker_as,"},{"line_number":411,"context_line":"                                            bgp_peer[\u0027peer_ip\u0027],"},{"line_number":412,"context_line":"                                            bgp_peer[\u0027remote_as\u0027],"},{"line_number":413,"context_line":"                                            bgp_peer[\u0027password\u0027])"},{"line_number":414,"context_line":"        except Exception as e:"},{"line_number":415,"context_line":"            self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_a3aacfd0","line":412,"updated":"2015-09-22 12:18:53.000000000","message":"Address PS14 comment.","commit_id":"d11e15d4b85a52708c89bc25fc92cd436bc69101"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"761e8091a167ccbee94b3abc05fdc5790318b1f0","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                  {\u0027cidr\u0027: route[\u0027destination\u0027],"},{"line_number":481,"context_line":"                   \u0027nexthop\u0027: route[\u0027next_hop\u0027]})"},{"line_number":482,"context_line":"            try:"},{"line_number":483,"context_line":"                self.dr_driver_cls.withdraw_route(bgp_speaker_as,"},{"line_number":484,"context_line":"                                                  route[\u0027destination\u0027])"},{"line_number":485,"context_line":"            except Exception as e:"},{"line_number":486,"context_line":"                self.handle_driver_failure(bgp_speaker_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba15a1d1_63b4b734","line":483,"updated":"2015-09-22 12:18:53.000000000","message":"Address PS14 comment.","commit_id":"d11e15d4b85a52708c89bc25fc92cd436bc69101"}],"neutron/services/bgp_speaker/driver/base.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"AS_NUM_MIN \u003d 1"},{"line_number":20,"context_line":"AS_NUM_MAX \u003d 65535"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_9c5e1044","line":20,"updated":"2015-09-22 11:01:07.000000000","message":"I\u0027m afraid that AS_NUM_MAX is quite bigger nowadays: \n\nhttps://tools.ietf.org/html/rfc6793\n\nhttps://en.wikipedia.org/wiki/Autonomous_system_%28Internet%29","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3456d089f6e5e11fd6dcb29f6874dd2f1b0c1191","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"AS_NUM_MIN \u003d 1"},{"line_number":20,"context_line":"AS_NUM_MAX \u003d 65535"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_08639a1b","line":20,"in_reply_to":"ba15a1d1_9c5e1044","updated":"2015-09-22 12:16:00.000000000","message":"We can keep this to be 65535 for now.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def get_maximum_speaker_support(self):"},{"line_number":33,"context_line":"        \"\"\"Query interface for knowing maximum speaker support."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        Get the maximum number of BgpSpeakers Ryu driver can schedule."},{"line_number":36,"context_line":"        This information needs to passed to the DrAgent and scheduler"},{"line_number":37,"context_line":"        for effective scheduling."},{"line_number":38,"context_line":"        :returns: number of speakers which driver can support: integer"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_866ca809","line":35,"updated":"2015-09-22 09:54:25.000000000","message":"Remove \u0027Ryu\u0027","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \"\"\"Query interface for knowing maximum speaker support."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        Get the maximum number of BgpSpeakers Ryu driver can schedule."},{"line_number":36,"context_line":"        This information needs to passed to the DrAgent and scheduler"},{"line_number":37,"context_line":"        for effective scheduling."},{"line_number":38,"context_line":"        :returns: number of speakers which driver can support: integer"},{"line_number":39,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_8c682523","line":36,"updated":"2015-09-22 09:54:25.000000000","message":"DrAgent \u003d\u003d\u003e BgpDrAgent","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \"\"\"Add a BGP speaker."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":47,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":48,"context_line":"        :type speaker_as: integer"},{"line_number":49,"context_line":"        :raises: BgpSpeakerAlreadyScheduled"},{"line_number":50,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_4c49adb6","line":47,"updated":"2015-09-22 09:54:25.000000000","message":"Use \tAS_NUM_MIN \u0026 AS_NUM_MAX","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\"Deletes BGP speaker."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":58,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":59,"context_line":"        :type speaker_as: integer"},{"line_number":60,"context_line":"        :raises: BgpSpeakerNotAdded"},{"line_number":61,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_0ccad51a","line":58,"updated":"2015-09-22 09:54:25.000000000","message":"Use \tAS_NUM_MIN \u0026 AS_NUM_MAX","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\"Deletes BGP speaker."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":58,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":59,"context_line":"        :type speaker_as: integer"},{"line_number":60,"context_line":"        :raises: BgpSpeakerNotAdded"},{"line_number":61,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_99af02e3","line":58,"in_reply_to":"ba15a1d1_0ccad51a","updated":"2015-09-22 11:01:07.000000000","message":"I don\u0027t agree on using constants on comments. It does not improve readibility. I would leave it as it is.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3456d089f6e5e11fd6dcb29f6874dd2f1b0c1191","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\"Deletes BGP speaker."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":58,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":59,"context_line":"        :type speaker_as: integer"},{"line_number":60,"context_line":"        :raises: BgpSpeakerNotAdded"},{"line_number":61,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_688ed6d1","line":58,"in_reply_to":"ba15a1d1_99af02e3","updated":"2015-09-22 12:16:00.000000000","message":"Ok. Will change.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        :param peer_ip: Specifies the IP address of the peer."},{"line_number":72,"context_line":"        :type peer_ip: string"},{"line_number":73,"context_line":"        :param peer_as: Specifies Autonomous Number of the peer."},{"line_number":74,"context_line":"                        Must be an integer between 1 and 65535."},{"line_number":75,"context_line":"        :type peer_as: integer"},{"line_number":76,"context_line":"        :param password: Is used for the MD5 authentication if it\u0027s"},{"line_number":77,"context_line":"                        specified. By default, the MD5 authentication"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_ccd37dd4","line":74,"updated":"2015-09-22 09:54:25.000000000","message":"Use \tAS_NUM_MIN \u0026 AS_NUM_MAX","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \"\"\"Delete a BGP peer associated with the given peer IP"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":89,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":90,"context_line":"        :type speaker_as: integer"},{"line_number":91,"context_line":"        :param peer_ip: Specifies the IP address of the peer. Must be the"},{"line_number":92,"context_line":"                        string representation of an IP address."}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_2ce559a7","line":89,"updated":"2015-09-22 09:54:25.000000000","message":"Use \tAS_NUM_MIN \u0026 AS_NUM_MAX","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        \"\"\"Add a new prefix to advertise."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":103,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":104,"context_line":"        :type speaker_as: integer"},{"line_number":105,"context_line":"        :param cidr: CIDR of the network to advertise. Must be the string"},{"line_number":106,"context_line":"                     representation of an IP network (e.g., 10.1.1.0/24)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_4ce0cd96","line":103,"updated":"2015-09-22 09:54:25.000000000","message":"Use \tAS_NUM_MIN \u0026 AS_NUM_MAX","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        \"\"\"Withdraw an advertised prefix."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":120,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":121,"context_line":"        :type speaker_as: integer"},{"line_number":122,"context_line":"        :param cidr: CIDR of the network to withdraw. Must be the string"},{"line_number":123,"context_line":"                     representation of an IP network (e.g., 10.1.1.0/24)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_8cfd853d","line":120,"updated":"2015-09-22 09:54:25.000000000","message":"Use \tAS_NUM_MIN \u0026 AS_NUM_MAX","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        \"\"\"Collect BGP Speaker statistics."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":134,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":135,"context_line":"        :type speaker_as: integer"},{"line_number":136,"context_line":"        :raises: BgpSpeakerNotAdded"},{"line_number":137,"context_line":"        :returns: bgp_speaker_stats: string"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_ccea9d74","line":134,"updated":"2015-09-22 09:54:25.000000000","message":"Use \tAS_NUM_MIN \u0026 AS_NUM_MAX","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @abc.abstractmethod"},{"line_number":142,"context_line":"    def get_bgp_peer_stats(self, speaker_as, peer_ip, peer_as):"},{"line_number":143,"context_line":"        \"\"\"Collect BGP Peer stats."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":146,"context_line":"                           Must be an integer between 1 and 65535."}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_cca13d48","line":143,"updated":"2015-09-22 09:54:25.000000000","message":"stats \u003d\u003d\u003e statistics","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        \"\"\"Collect BGP Peer stats."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        :param speaker_as: Specifies BGP Speaker autonomous system number."},{"line_number":146,"context_line":"                           Must be an integer between 1 and 65535."},{"line_number":147,"context_line":"        :type speaker_as: integer"},{"line_number":148,"context_line":"        :param peer_ip: Specifies the IP address of the peer."},{"line_number":149,"context_line":"        :type peer_ip: string"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_2cfc793d","line":146,"updated":"2015-09-22 09:54:25.000000000","message":"Use \tAS_NUM_MIN \u0026 AS_NUM_MAX","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"}],"neutron/services/bgp_speaker/driver/exceptions.py":[{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# BGP Driver Exceptions"},{"line_number":20,"context_line":"class BgpSpeakerNotAdded(n_exc.BadRequest):"},{"line_number":21,"context_line":"    message \u003d _(\"BGP Speaker for local_as\u003d%(local_as)s with router_id\u003d%(rtid)s\""},{"line_number":22,"context_line":"                \" not added yet.\")"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_390836d9","line":21,"updated":"2015-09-22 11:01:07.000000000","message":"being nitty: router_id is not so long :)","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"}],"neutron/services/bgp_speaker/driver/ryu/driver.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# TODO(Vikram): Send this information to the DRAgent"},{"line_number":32,"context_line":"def bgp_peer_down_cb(remote_ip, remote_as):"},{"line_number":33,"context_line":"    LOG.info(_LI(\u0027BGP Peer %(peer_ip)s for remote_as\u003d%(peer_as)d went DOWN.\u0027),"},{"line_number":34,"context_line":"             {\u0027peer_ip\u0027: remote_ip, \u0027peer_as\u0027: remote_as})"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_0702ae09","line":31,"updated":"2015-09-22 09:54:25.000000000","message":"DRAgent \u003d\u003d\u003e BgpDrAgent","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":39,"context_line":"             {\u0027peer_ip\u0027: remote_ip, \u0027peer_as\u0027: remote_as})"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def best_path_change_cb(self, event):"},{"line_number":43,"context_line":"    LOG.info(_LI(\"Best path change observed. cidr\u003d%(prefix)s, \""},{"line_number":44,"context_line":"                 \"nexthop\u003d%(nexthop)s, remote_as\u003d%(remote_as)d, \""},{"line_number":45,"context_line":"                 \"is_withdraw\u003d%(is_withdraw)s\"),"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_d9981a6d","line":42,"updated":"2015-09-22 11:01:07.000000000","message":"Sorry if it is a normal way to do things on Neutron... but does it actually make sense to have functions only to log?","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3456d089f6e5e11fd6dcb29f6874dd2f1b0c1191","unresolved":false,"context_lines":[{"line_number":39,"context_line":"             {\u0027peer_ip\u0027: remote_ip, \u0027peer_as\u0027: remote_as})"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def best_path_change_cb(self, event):"},{"line_number":43,"context_line":"    LOG.info(_LI(\"Best path change observed. cidr\u003d%(prefix)s, \""},{"line_number":44,"context_line":"                 \"nexthop\u003d%(nexthop)s, remote_as\u003d%(remote_as)d, \""},{"line_number":45,"context_line":"                 \"is_withdraw\u003d%(is_withdraw)s\"),"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_c308232b","line":42,"in_reply_to":"ba15a1d1_d9981a6d","updated":"2015-09-22 12:16:00.000000000","message":"I have just added for better debugging.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                 \"is_withdraw\u003d%(is_withdraw)s\"),"},{"line_number":46,"context_line":"             {\u0027prefix\u0027: event.prefix, \u0027nexthop\u0027: event.nexthop,"},{"line_number":47,"context_line":"              \u0027remote_as\u0027: event.remote_as,"},{"line_number":48,"context_line":"              \u0027is_withdraw\u0027: event.is_withdraw})"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class RyuBgpDriver(base.BgpDriverBase):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_19b692dc","line":48,"updated":"2015-09-22 11:01:07.000000000","message":"nitty again: Isn\u0027t more correct to say \u0027is_withdrawn\u0027?","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3456d089f6e5e11fd6dcb29f6874dd2f1b0c1191","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                 \"is_withdraw\u003d%(is_withdraw)s\"),"},{"line_number":46,"context_line":"             {\u0027prefix\u0027: event.prefix, \u0027nexthop\u0027: event.nexthop,"},{"line_number":47,"context_line":"              \u0027remote_as\u0027: event.remote_as,"},{"line_number":48,"context_line":"              \u0027is_withdraw\u0027: event.is_withdraw})"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class RyuBgpDriver(base.BgpDriverBase):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_482f52a1","line":48,"in_reply_to":"ba15a1d1_19b692dc","updated":"2015-09-22 12:16:00.000000000","message":"hahaha.. can\u0027t change! Ryu stuff :)","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"58c506fd1b75fee8b31fc5a8cc74be32a9b6c7da","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            LOG.error(_LE(\u0027Error initializing Ryu interface driver. \u0027"},{"line_number":63,"context_line":"                          \u0027MUST specify bgp_router_id via configuration.\u0027))"},{"line_number":64,"context_line":"            raise SystemExit(1)"},{"line_number":65,"context_line":"        self.routerid \u003d cfg.bgp_router_id"},{"line_number":66,"context_line":"        LOG.info(_LI(\u0027Initialized Ryu BGP Speaker driver interface with \u0027"},{"line_number":67,"context_line":"                     \u0027bgp_router_id\u003d%s\u0027), self.routerid)"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_1904527c","line":65,"updated":"2015-09-22 11:01:07.000000000","message":"underscore on the attribute: router_id. Although, as I said before, I prefer router_ip","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"3456d089f6e5e11fd6dcb29f6874dd2f1b0c1191","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            LOG.error(_LE(\u0027Error initializing Ryu interface driver. \u0027"},{"line_number":63,"context_line":"                          \u0027MUST specify bgp_router_id via configuration.\u0027))"},{"line_number":64,"context_line":"            raise SystemExit(1)"},{"line_number":65,"context_line":"        self.routerid \u003d cfg.bgp_router_id"},{"line_number":66,"context_line":"        LOG.info(_LI(\u0027Initialized Ryu BGP Speaker driver interface with \u0027"},{"line_number":67,"context_line":"                     \u0027bgp_router_id\u003d%s\u0027), self.routerid)"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_a8594e5d","line":65,"in_reply_to":"ba15a1d1_1904527c","updated":"2015-09-22 12:16:00.000000000","message":"I feel \u0027router_id\u0027 is more standard term.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c761cb895c83c8828b636c22f7aac97d85e4dacf","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        LOG.info(_LI(\u0027Initialized Ryu BGP Speaker driver interface with \u0027"},{"line_number":67,"context_line":"                     \u0027bgp_router_id\u003d%s\u0027), self.routerid)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        # TODO(Vikram): Check Ryu interface which can provide"},{"line_number":70,"context_line":"        #               us with this information. By default, it will be 1."},{"line_number":71,"context_line":"        self.max_speaker_support \u003d 1"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba15a1d1_e7253aae","line":69,"updated":"2015-09-22 09:54:25.000000000","message":"Ryu can only support 1 BGP Speaker. Let\u0027s hard code this for now.","commit_id":"acb08d880fed82d091c3248a86a3aedac95f55fc"}],"neutron/tests/unit/agent/bgp/driver/ryu/test_ryu_driver.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a0a4ec06421ac472b2bd324c6a2001c46c6019ce","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\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":27,"id":"fa69d971_db9262f6","line":1,"updated":"2016-01-08 03:59:26.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"2c393223ea631a839bcb2ca5586a0cfb3cf16dc3"}],"neutron/tests/unit/agent/bgp/driver/test_ryu_driver.py":[{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"03fe62f04ec0fdadc862afb8ea82d28c5012b578","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.ryu_bgp_driver.add_bgp_speaker(FAKE_LOCAL_AS1)"},{"line_number":88,"context_line":"        self.assertEqual(FAKE_LOCAL_AS1, self.ryu_bgp_driver.local_as)"},{"line_number":89,"context_line":"        self.ryu_bgp_driver.add_bgp_peer(FAKE_PEER_IP, FAKE_PEER_AS)"},{"line_number":90,"context_line":"        self.ryu_bgp_driver.speaker.neighbor_add(address\u003dFAKE_PEER_IP,"},{"line_number":91,"context_line":"                                                 remote_as\u003dFAKE_PEER_AS,"},{"line_number":92,"context_line":"                                                 password\u003dNone)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_6a2d4c45","line":90,"updated":"2015-08-28 15:01:41.000000000","message":"Do you intend to do the below ?\nself.ryu_bgp_driver.speaker.neighbor_add.assert_called_once_with(....)","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb49026b22ea3ecaa637dbf614cb8d6f0ed10c08","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.ryu_bgp_driver.add_bgp_speaker(FAKE_LOCAL_AS1)"},{"line_number":88,"context_line":"        self.assertEqual(FAKE_LOCAL_AS1, self.ryu_bgp_driver.local_as)"},{"line_number":89,"context_line":"        self.ryu_bgp_driver.add_bgp_peer(FAKE_PEER_IP, FAKE_PEER_AS)"},{"line_number":90,"context_line":"        self.ryu_bgp_driver.speaker.neighbor_add(address\u003dFAKE_PEER_IP,"},{"line_number":91,"context_line":"                                                 remote_as\u003dFAKE_PEER_AS,"},{"line_number":92,"context_line":"                                                 password\u003dNone)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_00a6da52","line":90,"in_reply_to":"da20952f_6a2d4c45","updated":"2015-08-29 03:13:58.000000000","message":"+1. Will change","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"03fe62f04ec0fdadc862afb8ea82d28c5012b578","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self.assertEqual(FAKE_LOCAL_AS1, self.ryu_bgp_driver.local_as)"},{"line_number":97,"context_line":"        self.ryu_bgp_driver.add_bgp_peer(FAKE_PEER_IP, FAKE_PEER_AS,"},{"line_number":98,"context_line":"                                         FAKE_PEER_PASSWORD)"},{"line_number":99,"context_line":"        self.ryu_bgp_driver.speaker.neighbor_add(address\u003dFAKE_PEER_IP,"},{"line_number":100,"context_line":"                                                 remote_as\u003dFAKE_PEER_AS,"},{"line_number":101,"context_line":"                                                 password\u003dFAKE_PEER_PASSWORD)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_ca16d8f0","line":99,"updated":"2015-08-28 15:01:41.000000000","message":"Same comment as L90","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb49026b22ea3ecaa637dbf614cb8d6f0ed10c08","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self.assertEqual(FAKE_LOCAL_AS1, self.ryu_bgp_driver.local_as)"},{"line_number":97,"context_line":"        self.ryu_bgp_driver.add_bgp_peer(FAKE_PEER_IP, FAKE_PEER_AS,"},{"line_number":98,"context_line":"                                         FAKE_PEER_PASSWORD)"},{"line_number":99,"context_line":"        self.ryu_bgp_driver.speaker.neighbor_add(address\u003dFAKE_PEER_IP,"},{"line_number":100,"context_line":"                                                 remote_as\u003dFAKE_PEER_AS,"},{"line_number":101,"context_line":"                                                 password\u003dFAKE_PEER_PASSWORD)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_a065ae1e","line":99,"in_reply_to":"da20952f_ca16d8f0","updated":"2015-08-29 03:13:58.000000000","message":"+1.","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"03fe62f04ec0fdadc862afb8ea82d28c5012b578","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.ryu_bgp_driver.add_bgp_speaker(FAKE_LOCAL_AS1)"},{"line_number":109,"context_line":"        self.assertEqual(FAKE_LOCAL_AS1, self.ryu_bgp_driver.local_as)"},{"line_number":110,"context_line":"        self.ryu_bgp_driver.remove_bgp_peer(FAKE_PEER_IP)"},{"line_number":111,"context_line":"        self.ryu_bgp_driver.speaker.neighbor_del(address\u003dFAKE_PEER_IP)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def test_remove_bgp_peer_without_adding_speaker(self):"},{"line_number":114,"context_line":"        self.ryu_bgp_driver.remove_bgp_peer(FAKE_PEER_IP)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_4ab888e5","line":111,"updated":"2015-08-28 15:01:41.000000000","message":"Same comment as L90","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cb49026b22ea3ecaa637dbf614cb8d6f0ed10c08","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.ryu_bgp_driver.add_bgp_speaker(FAKE_LOCAL_AS1)"},{"line_number":109,"context_line":"        self.assertEqual(FAKE_LOCAL_AS1, self.ryu_bgp_driver.local_as)"},{"line_number":110,"context_line":"        self.ryu_bgp_driver.remove_bgp_peer(FAKE_PEER_IP)"},{"line_number":111,"context_line":"        self.ryu_bgp_driver.speaker.neighbor_del(address\u003dFAKE_PEER_IP)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def test_remove_bgp_peer_without_adding_speaker(self):"},{"line_number":114,"context_line":"        self.ryu_bgp_driver.remove_bgp_peer(FAKE_PEER_IP)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_8070aadd","line":111,"in_reply_to":"da20952f_4ab888e5","updated":"2015-08-29 03:13:58.000000000","message":"+1.","commit_id":"b5ae47a7a89bb209187feca3d2227995b91bd273"}],"neutron/tests/unit/agent/bgp/driver/test_utils.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"a0a4ec06421ac472b2bd324c6a2001c46c6019ce","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\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":27,"id":"fa69d971_5bb5127c","line":1,"updated":"2016-01-08 03:59:26.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"2c393223ea631a839bcb2ca5586a0cfb3cf16dc3"}],"neutron/tests/unit/services/bgp_speaker/agent/driver/test_ryu_driver.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0be0e55878e9603c48a17e01de3e05f2334392d3","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.services.bgp_speaker.agent import config as bgp_config"},{"line_number":22,"context_line":"from neutron.services.bgp_speaker.agent.driver import ryu_driver"},{"line_number":23,"context_line":"from neutron.services.bgp_speaker.agent.driver import exceptions as bgp_exc"},{"line_number":24,"context_line":"from neutron.tests import base"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Test variables for BGP Speaker"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba15a1d1_2dfefb05","line":23,"updated":"2015-09-20 04:12:04.000000000","message":"PEP8 Issue. Import not in alphabetical order.","commit_id":"644307d7de66b6733efd5c8be131bbe55e0eace7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0be0e55878e9603c48a17e01de3e05f2334392d3","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.ryu_bgp_driver.speaker.prefix_del.assert_called_once_with("},{"line_number":109,"context_line":"                                                prefix\u003dFAKE_ROUTE)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    # TODO(Vikram): Add below negative tests as well"},{"line_number":112,"context_line":"    def test_add_same_bgp_speakers_twice(self):"},{"line_number":113,"context_line":"        # Check for bgp_driver_exc.BgpSpeakerAlreadyScheduled"},{"line_number":114,"context_line":"        self.ryu_bgp_driver.add_bgp_speaker(FAKE_LOCAL_AS1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba15a1d1_aa0bd12a","line":111,"updated":"2015-09-20 04:12:04.000000000","message":"Remove it. It\u0027s done.","commit_id":"644307d7de66b6733efd5c8be131bbe55e0eace7"}],"requirements.txt":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"17953a6e1aa8f4d2df335b4127fc61f02fd40a74","unresolved":false,"context_lines":[{"line_number":18,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12 # BSD"},{"line_number":19,"context_line":"python-neutronclient\u003e\u003d2.6.0 # Apache-2.0"},{"line_number":20,"context_line":"retrying!\u003d1.3.0,\u003e\u003d1.2.3 # Apache-2.0"},{"line_number":21,"context_line":"ryu!\u003d3.29,\u003e\u003d3.25.1 # Apache-2.0"},{"line_number":22,"context_line":"SQLAlchemy\u003c1.1.0,\u003e\u003d1.0.10 # MIT"},{"line_number":23,"context_line":"WebOb\u003e\u003d1.2.3 # MIT"},{"line_number":24,"context_line":"keystoneauth1\u003e\u003d2.1.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":29,"id":"9a68dd71_dabeadd3","line":21,"range":{"start_line":21,"start_character":5,"end_line":21,"end_character":6},"updated":"2016-01-21 22:44:38.000000000","message":"it doesn\u0027t match global-requirements.txt in requirements repo","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0ecb127b4a5c3af4ac3b6d54471475b4e316e083","unresolved":false,"context_lines":[{"line_number":18,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12 # BSD"},{"line_number":19,"context_line":"python-neutronclient\u003e\u003d2.6.0 # Apache-2.0"},{"line_number":20,"context_line":"retrying!\u003d1.3.0,\u003e\u003d1.2.3 # Apache-2.0"},{"line_number":21,"context_line":"ryu!\u003d3.29,\u003e\u003d3.25.1 # Apache-2.0"},{"line_number":22,"context_line":"SQLAlchemy\u003c1.1.0,\u003e\u003d1.0.10 # MIT"},{"line_number":23,"context_line":"WebOb\u003e\u003d1.2.3 # MIT"},{"line_number":24,"context_line":"keystoneauth1\u003e\u003d2.1.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":29,"id":"7a5de9d1_0063dab2","line":21,"range":{"start_line":21,"start_character":5,"end_line":21,"end_character":6},"in_reply_to":"9a68dd71_dabeadd3","updated":"2016-01-27 11:30:54.000000000","message":"This is not required. Will remove.","commit_id":"f439957b554bcae75999ef4d77799b5fc168a89d"}],"test-requirements.txt":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"8ef1c3baa7975ccdca7b72dd8ee8f3ee91db71e8","unresolved":false,"context_lines":[{"line_number":20,"context_line":"tempest-lib\u003e\u003d0.6.1"},{"line_number":21,"context_line":"ddt\u003e\u003d0.7.0"},{"line_number":22,"context_line":"pylint\u003d\u003d1.4.4 # GNU GPL v2"},{"line_number":23,"context_line":"ryu\u003e\u003d3.24"}],"source_content_type":"text/plain","patch_set":5,"id":"da20952f_06227252","line":23,"updated":"2015-09-04 06:52:01.000000000","message":"ryu is now in requirements.txt.","commit_id":"069a16101ea8cfc70f0074aadbe432a65e39cbbb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c3b1c727ed94e9483010a05afc0e0e0014a04274","unresolved":false,"context_lines":[{"line_number":20,"context_line":"tempest-lib\u003e\u003d0.6.1"},{"line_number":21,"context_line":"ddt\u003e\u003d0.7.0"},{"line_number":22,"context_line":"pylint\u003d\u003d1.4.4 # GNU GPL v2"},{"line_number":23,"context_line":"ryu\u003e\u003d3.24"}],"source_content_type":"text/plain","patch_set":5,"id":"da20952f_71b20ae7","line":23,"in_reply_to":"da20952f_06227252","updated":"2015-09-04 07:39:24.000000000","message":"Great!","commit_id":"069a16101ea8cfc70f0074aadbe432a65e39cbbb"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b358e45a47fea6b30a785a437c0a25970398f145","unresolved":false,"context_lines":[{"line_number":20,"context_line":"tempest-lib\u003e\u003d0.6.1"},{"line_number":21,"context_line":"ddt\u003e\u003d0.7.0"},{"line_number":22,"context_line":"pylint\u003d\u003d1.4.4 # GNU GPL v2"},{"line_number":23,"context_line":"ryu\u003e\u003d3.24"}],"source_content_type":"text/plain","patch_set":5,"id":"da20952f_eed86255","line":23,"in_reply_to":"da20952f_2c53d56c","updated":"2015-09-04 17:18:37.000000000","message":"requirements.txt defines ryu\u003e\u003d3.23.2, which is causing a conflict.  This is why pep8 and unit tests are failing.","commit_id":"069a16101ea8cfc70f0074aadbe432a65e39cbbb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4f51e7fa7b6c3cd302e70fef1c67da9f7dcb7f40","unresolved":false,"context_lines":[{"line_number":20,"context_line":"tempest-lib\u003e\u003d0.6.1"},{"line_number":21,"context_line":"ddt\u003e\u003d0.7.0"},{"line_number":22,"context_line":"pylint\u003d\u003d1.4.4 # GNU GPL v2"},{"line_number":23,"context_line":"ryu\u003e\u003d3.24"}],"source_content_type":"text/plain","patch_set":5,"id":"da20952f_2c53d56c","line":23,"in_reply_to":"da20952f_71b20ae7","updated":"2015-09-04 08:21:56.000000000","message":"We need  ryu\u003e\u003d3.25 for \"bgp: add neighbor_state_get method\". Please change requirement.txt","commit_id":"069a16101ea8cfc70f0074aadbe432a65e39cbbb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4579faf46838a91fab62faca0f332fe4f30381f2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"tempest-lib\u003e\u003d0.6.1"},{"line_number":21,"context_line":"ddt\u003e\u003d0.7.0"},{"line_number":22,"context_line":"pylint\u003d\u003d1.4.4 # GNU GPL v2"},{"line_number":23,"context_line":"ryu\u003e\u003d3.24"}],"source_content_type":"text/plain","patch_set":5,"id":"da20952f_70173f45","line":23,"in_reply_to":"da20952f_eed86255","updated":"2015-09-05 02:56:21.000000000","message":"Let me correct and post another patch.","commit_id":"069a16101ea8cfc70f0074aadbe432a65e39cbbb"}]}
