)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"aade577da7c926f9e3db7a177ebe5f359b1ef6ce","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch provides the infrastructure for the OVN L3 to schedule"},{"line_number":10,"context_line":"the router gateway port. The OVN hypervisor administrator can"},{"line_number":11,"context_line":"set aside certain hypervisors to be used for scheduling router"},{"line_number":12,"context_line":"gateway ports. This is the corresponding WIP patch at the moment:"},{"line_number":13,"context_line":"http://openvswitch.org/pipermail/dev/2016-June/073285.html"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"For now it is assumed that any hypervisor/chassis can host a router"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"dada55a8_9a393ea7","line":12,"updated":"2016-07-20 14:42:23.000000000","message":"Is the OVN WIP patch needed before merging this networking-ovn patch?","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"495bf08fe015c5dc69d22ee584b94056c045e161","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch provides the infrastructure for the OVN L3 to schedule"},{"line_number":10,"context_line":"the router gateway port. The OVN hypervisor administrator can"},{"line_number":11,"context_line":"set aside certain hypervisors to be used for scheduling router"},{"line_number":12,"context_line":"gateway ports. This is the corresponding WIP patch at the moment:"},{"line_number":13,"context_line":"http://openvswitch.org/pipermail/dev/2016-June/073285.html"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"For now it is assumed that any hypervisor/chassis can host a router"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"dada55a8_f454c5fe","line":12,"in_reply_to":"dada55a8_09f6a5f8","updated":"2016-07-20 17:49:28.000000000","message":"Thanks.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch provides the infrastructure for the OVN L3 to schedule"},{"line_number":10,"context_line":"the router gateway port. The OVN hypervisor administrator can"},{"line_number":11,"context_line":"set aside certain hypervisors to be used for scheduling router"},{"line_number":12,"context_line":"gateway ports. This is the corresponding WIP patch at the moment:"},{"line_number":13,"context_line":"http://openvswitch.org/pipermail/dev/2016-June/073285.html"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"For now it is assumed that any hypervisor/chassis can host a router"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"dada55a8_09f6a5f8","line":12,"in_reply_to":"dada55a8_9a393ea7","updated":"2016-07-20 16:27:21.000000000","message":"No, at the moment we can assume that all compute nodes can host router gateway ports. Once that WIP patch above merges, we can tweak the networking-ovn to only select the computes that prefer to host router ports.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"bf99ed3a21d912c61583c95c860b3470b043d3e8","unresolved":false,"context_lines":[{"line_number":19,"context_line":"(1) RandomChoice"},{"line_number":20,"context_line":"(2) LeastLoaded"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"The Chassis (add/delete/update) event is used to schedule router"},{"line_number":23,"context_line":"gateway ports which have not been bound to any chassis."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"A future patch will add functional tests."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"dada55a8_09a177f8","line":22,"updated":"2016-07-26 19:19:46.000000000","message":"Doesn\u0027t there need to be a way to schedule a newly created and configured router without requiring neutron-server to restart or Chassis changes?","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02231a22bf31ea5015c368ee9bc4e0e69b018d23","unresolved":false,"context_lines":[{"line_number":19,"context_line":"(1) RandomChoice"},{"line_number":20,"context_line":"(2) LeastLoaded"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"The Chassis (add/delete/update) event is used to schedule router"},{"line_number":23,"context_line":"gateway ports which have not been bound to any chassis."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"A future patch will add functional tests."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"dada55a8_e0634daf","line":22,"in_reply_to":"dada55a8_09a177f8","updated":"2016-07-27 00:08:00.000000000","message":"Yes, the https://review.openstack.org/#/c/346646/ WIP patch will schedule the gateway port immediately when a router is created by invoking the OVNGatewayScheduler.select API.","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"}],"devstack/lib/networking-ovn":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"351ebac4f07d65ed7524992ba13fcc742cd292ae","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"# If using OVN_L3_MODE, the type of OVN L3 Scheduler to use. The OVN L3"},{"line_number":82,"context_line":"# Scheduler determines the hypervisor/chassis where a routers gateway should"},{"line_number":83,"context_line":"# be hosted in OVN. The default OVN L3 scheduler is LeastLoaded"},{"line_number":84,"context_line":"OVN_L3_SCHEDULER\u003d${OVN_L3_SCHEDULER:-leastloaded}"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# Neutron directory"}],"source_content_type":"application/x-shellscript","patch_set":6,"id":"1aa78d24_9619208b","line":83,"updated":"2016-07-12 02:18:33.000000000","message":"SuperNit: \"LeastLoaded\" here is different than what the code below uses, which is \"leastloaded.\" Should we make these match?","commit_id":"e64c8e23186ef85c5b9aa287b9ccfacde9d7982b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"01f702f00fc607422138eac457b364281cbccfde","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"# If using OVN_L3_MODE, the type of OVN L3 Scheduler to use. The OVN L3"},{"line_number":82,"context_line":"# Scheduler determines the hypervisor/chassis where a routers gateway should"},{"line_number":83,"context_line":"# be hosted in OVN. The default OVN L3 scheduler is LeastLoaded"},{"line_number":84,"context_line":"OVN_L3_SCHEDULER\u003d${OVN_L3_SCHEDULER:-leastloaded}"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# Neutron directory"}],"source_content_type":"application/x-shellscript","patch_set":6,"id":"1aa78d24_221bc6cb","line":83,"in_reply_to":"1aa78d24_9619208b","updated":"2016-07-12 04:28:16.000000000","message":"Done","commit_id":"e64c8e23186ef85c5b9aa287b9ccfacde9d7982b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# If using OVN_L3_MODE, the type of OVN L3 Scheduler to use. The OVN L3"},{"line_number":85,"context_line":"# Scheduler determines the hypervisor/chassis where a routers gateway should"},{"line_number":86,"context_line":"# be hosted in OVN. The default OVN L3 scheduler is leastLoaded"},{"line_number":87,"context_line":"OVN_L3_SCHEDULER\u003d${OVN_L3_SCHEDULER:-leastloaded}"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"# Neutron directory"}],"source_content_type":"application/x-shellscript","patch_set":10,"id":"dada55a8_d556e9cc","line":86,"range":{"start_line":86,"start_character":52,"end_line":86,"end_character":63},"updated":"2016-07-20 15:26:07.000000000","message":"nit...\"leastloaded\"","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# If using OVN_L3_MODE, the type of OVN L3 Scheduler to use. The OVN L3"},{"line_number":85,"context_line":"# Scheduler determines the hypervisor/chassis where a routers gateway should"},{"line_number":86,"context_line":"# be hosted in OVN. The default OVN L3 scheduler is leastLoaded"},{"line_number":87,"context_line":"OVN_L3_SCHEDULER\u003d${OVN_L3_SCHEDULER:-leastloaded}"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"# Neutron directory"}],"source_content_type":"application/x-shellscript","patch_set":10,"id":"dada55a8_e9d19158","line":86,"range":{"start_line":86,"start_character":52,"end_line":86,"end_character":63},"in_reply_to":"dada55a8_d556e9cc","updated":"2016-07-20 16:27:21.000000000","message":"Done","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        populate_ml2_config /$Q_PLUGIN_CONF_FILE ovn ovn_l3_mode\u003d\"$OVN_L3_MODE\""},{"line_number":180,"context_line":"        populate_ml2_config /$Q_PLUGIN_CONF_FILE ovn neutron_sync_mode\u003d\"$OVN_NEUTRON_SYNC_MODE\""},{"line_number":181,"context_line":"        if [[ \"$OVN_L3_MODE\" \u003d\u003d \"True\" ]]; then"},{"line_number":182,"context_line":"            populate_ml2_config /$Q_PLUGIN_CONF_FILE ovn ovn_l3_scheduler\u003d\"$OVN_L3_SCHEDULER\""},{"line_number":183,"context_line":"        fi"},{"line_number":184,"context_line":"        populate_ml2_config /$Q_PLUGIN_CONF_FILE securitygroup enable_security_group\u003d\"$Q_USE_SECGROUP\""},{"line_number":185,"context_line":"        inicomment /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver"}],"source_content_type":"application/x-shellscript","patch_set":10,"id":"dada55a8_5ac7c663","line":182,"updated":"2016-07-20 15:26:07.000000000","message":"Please add this to the install documentation.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        populate_ml2_config /$Q_PLUGIN_CONF_FILE ovn ovn_l3_mode\u003d\"$OVN_L3_MODE\""},{"line_number":180,"context_line":"        populate_ml2_config /$Q_PLUGIN_CONF_FILE ovn neutron_sync_mode\u003d\"$OVN_NEUTRON_SYNC_MODE\""},{"line_number":181,"context_line":"        if [[ \"$OVN_L3_MODE\" \u003d\u003d \"True\" ]]; then"},{"line_number":182,"context_line":"            populate_ml2_config /$Q_PLUGIN_CONF_FILE ovn ovn_l3_scheduler\u003d\"$OVN_L3_SCHEDULER\""},{"line_number":183,"context_line":"        fi"},{"line_number":184,"context_line":"        populate_ml2_config /$Q_PLUGIN_CONF_FILE securitygroup enable_security_group\u003d\"$Q_USE_SECGROUP\""},{"line_number":185,"context_line":"        inicomment /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver"}],"source_content_type":"application/x-shellscript","patch_set":10,"id":"dada55a8_c9180dd6","line":182,"in_reply_to":"dada55a8_5ac7c663","updated":"2016-07-20 16:27:21.000000000","message":"Done","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"}],"devstack/local.conf.sample":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"351ebac4f07d65ed7524992ba13fcc742cd292ae","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# If OVN_L3_Mode is True, the type of OVN L3 Scheduler to use. The OVN L3"},{"line_number":65,"context_line":"# Scheduler determines the hypervisor/chassis where a routers gateway should"},{"line_number":66,"context_line":"# be hosted in OVN. The default OVN L3 scheduler is LeastLoaded"},{"line_number":67,"context_line":"#OVN_L3_SCHEDULER\u003dleastloaded"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Whether or not to build custom openvswitch kernel modules from the ovs git"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"1aa78d24_d60f2837","line":66,"updated":"2016-07-12 02:18:33.000000000","message":"SuperNit: \"LeastLoaded\" here is different than what the code below uses, which is \"leastloaded.\" Should we make these match?","commit_id":"e64c8e23186ef85c5b9aa287b9ccfacde9d7982b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"01f702f00fc607422138eac457b364281cbccfde","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# If OVN_L3_Mode is True, the type of OVN L3 Scheduler to use. The OVN L3"},{"line_number":65,"context_line":"# Scheduler determines the hypervisor/chassis where a routers gateway should"},{"line_number":66,"context_line":"# be hosted in OVN. The default OVN L3 scheduler is LeastLoaded"},{"line_number":67,"context_line":"#OVN_L3_SCHEDULER\u003dleastloaded"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Whether or not to build custom openvswitch kernel modules from the ovs git"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"1aa78d24_827a7aef","line":66,"in_reply_to":"1aa78d24_d60f2837","updated":"2016-07-12 04:28:16.000000000","message":"Done","commit_id":"e64c8e23186ef85c5b9aa287b9ccfacde9d7982b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# If OVN_L3_Mode is True, the type of OVN L3 Scheduler to use. The OVN L3"},{"line_number":65,"context_line":"# Scheduler determines the hypervisor/chassis where a routers gateway should"},{"line_number":66,"context_line":"# be hosted in OVN. The default OVN L3 scheduler is leastLoaded"},{"line_number":67,"context_line":"#OVN_L3_SCHEDULER\u003dleastloaded"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Whether or not to build custom openvswitch kernel modules from the ovs git"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"dada55a8_15752163","line":66,"range":{"start_line":66,"start_character":52,"end_line":66,"end_character":63},"updated":"2016-07-20 15:26:07.000000000","message":"nit...\"leastloaded\"","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# If OVN_L3_Mode is True, the type of OVN L3 Scheduler to use. The OVN L3"},{"line_number":65,"context_line":"# Scheduler determines the hypervisor/chassis where a routers gateway should"},{"line_number":66,"context_line":"# be hosted in OVN. The default OVN L3 scheduler is leastLoaded"},{"line_number":67,"context_line":"#OVN_L3_SCHEDULER\u003dleastloaded"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Whether or not to build custom openvswitch kernel modules from the ovs git"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"dada55a8_09cd05b7","line":66,"range":{"start_line":66,"start_character":52,"end_line":66,"end_character":63},"in_reply_to":"dada55a8_15752163","updated":"2016-07-20 16:27:21.000000000","message":"Done","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"}],"doc/source/install.rst":[{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"bf99ed3a21d912c61583c95c860b3470b043d3e8","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        that runs the ``ovsdb-server`` service. Replace ``OVN_L3_MODE``"},{"line_number":260,"context_line":"        with ``True`` if you enabled the native layer-3 service in"},{"line_number":261,"context_line":"        ``/etc/neutron/neutron.conf`` else ``False``. Replace"},{"line_number":262,"context_line":"        ``OVN_L3_SCHEDULER`` with ``leastloaded`` if you want the scheduler"},{"line_number":263,"context_line":"        to select a compute node with the least number of gateway routers"},{"line_number":264,"context_line":"        or ``chance`` if you want the scheduler to randomly select a compute"},{"line_number":265,"context_line":"        node from the available list of compute nodes."}],"source_content_type":"text/x-rst","patch_set":11,"id":"dada55a8_46599e34","line":262,"updated":"2016-07-26 19:19:46.000000000","message":"This only applies if OVN_L3_MODE is True.","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02231a22bf31ea5015c368ee9bc4e0e69b018d23","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        that runs the ``ovsdb-server`` service. Replace ``OVN_L3_MODE``"},{"line_number":260,"context_line":"        with ``True`` if you enabled the native layer-3 service in"},{"line_number":261,"context_line":"        ``/etc/neutron/neutron.conf`` else ``False``. Replace"},{"line_number":262,"context_line":"        ``OVN_L3_SCHEDULER`` with ``leastloaded`` if you want the scheduler"},{"line_number":263,"context_line":"        to select a compute node with the least number of gateway routers"},{"line_number":264,"context_line":"        or ``chance`` if you want the scheduler to randomly select a compute"},{"line_number":265,"context_line":"        node from the available list of compute nodes."}],"source_content_type":"text/x-rst","patch_set":11,"id":"dada55a8_400cd9eb","line":262,"in_reply_to":"dada55a8_46599e34","updated":"2016-07-27 00:08:00.000000000","message":"Done","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"}],"networking_ovn/common/config.py":[{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":58,"context_line":"               choices\u003d(\u0027leastloaded\u0027, \u0027chance\u0027),"},{"line_number":59,"context_line":"               help\u003d_(\u0027The OVN L3 Scheduler type used to schedule router \u0027"},{"line_number":60,"context_line":"                      \u0027gateway ports on hypervisors/chassis. \\n\u0027"},{"line_number":61,"context_line":"                      \u0027leastloaded - chassis with fewest gateway port \u0027"},{"line_number":62,"context_line":"                      \u0027selected \\n\u0027"},{"line_number":63,"context_line":"                      \u0027chance - chassis randomly selected\u0027)),"},{"line_number":64,"context_line":"    cfg.StrOpt(\"vif_type\","}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_9adf7e0c","line":61,"range":{"start_line":61,"start_character":65,"end_line":61,"end_character":69},"updated":"2016-07-20 15:26:07.000000000","message":"nit...\"ports\"","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"               choices\u003d(\u0027leastloaded\u0027, \u0027chance\u0027),"},{"line_number":59,"context_line":"               help\u003d_(\u0027The OVN L3 Scheduler type used to schedule router \u0027"},{"line_number":60,"context_line":"                      \u0027gateway ports on hypervisors/chassis. \\n\u0027"},{"line_number":61,"context_line":"                      \u0027leastloaded - chassis with fewest gateway port \u0027"},{"line_number":62,"context_line":"                      \u0027selected \\n\u0027"},{"line_number":63,"context_line":"                      \u0027chance - chassis randomly selected\u0027)),"},{"line_number":64,"context_line":"    cfg.StrOpt(\"vif_type\","}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_e93871a2","line":61,"range":{"start_line":61,"start_character":65,"end_line":61,"end_character":69},"in_reply_to":"dada55a8_9adf7e0c","updated":"2016-07-20 16:27:21.000000000","message":"Done","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"}],"networking_ovn/common/constants.py":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"d823d04fcf2e4e73873dfcd9508de5da7fa94a68","unresolved":false,"context_lines":[{"line_number":37,"context_line":"ACL_ACTION_ALLOW_RELATED \u003d \u0027allow-related\u0027"},{"line_number":38,"context_line":"ACL_ACTION_ALLOW \u003d \u0027allow\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# When a OVN L3 gateway is created, it needs to be bound to a chassis. In"},{"line_number":41,"context_line":"# a chassis is not found"},{"line_number":42,"context_line":"OVN_GATEWAY_INVALID_CHASSIS \u003d \u0027neutron-ovn-invalid-chassis\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a9cbaa1d","line":40,"updated":"2016-06-21 19:05:21.000000000","message":"Nit: The second sentence \"In a chassis is not found\" doesn\u0027t make sense, did you mean \"If a chassis is not found\"?","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":37,"context_line":"ACL_ACTION_ALLOW_RELATED \u003d \u0027allow-related\u0027"},{"line_number":38,"context_line":"ACL_ACTION_ALLOW \u003d \u0027allow\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# When a OVN L3 gateway is created, it needs to be bound to a chassis. In"},{"line_number":41,"context_line":"# a chassis is not found"},{"line_number":42,"context_line":"OVN_GATEWAY_INVALID_CHASSIS \u003d \u0027neutron-ovn-invalid-chassis\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a220dff8","line":40,"in_reply_to":"3aaa91ec_a9cbaa1d","updated":"2016-06-21 20:02:42.000000000","message":"It was an incomplete sentence, I\u0027ll fix it. \"In case a chassis is not found the OVN_GATEWAY_INVALID_CHASSIS will be set in the options:chassis column(key) of the Logical Router\".","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"}],"networking_ovn/l3/l3_ovn.py":[{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1f895394f769ab7bd068a2fd0b687c2d2f4febba","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":41,"context_line":"class OVNGatewayScheduler(object):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self):"},{"line_number":44,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_0cd12cce","line":41,"updated":"2016-06-21 19:23:19.000000000","message":"It suggest extracting these scheduler classes to their own part.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b8071178d44a10c94d922ee5728ed67166aae61d","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":41,"context_line":"class OVNGatewayScheduler(object):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self):"},{"line_number":44,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a7c58a5c","line":41,"in_reply_to":"3aaa91ec_07ba9ee1","updated":"2016-06-21 21:57:41.000000000","message":"Done","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":41,"context_line":"class OVNGatewayScheduler(object):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self):"},{"line_number":44,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_42d81bf0","line":41,"in_reply_to":"3aaa91ec_0cd12cce","updated":"2016-06-21 20:02:42.000000000","message":"I don\u0027t understand, can you explain a little more. I tried to follow way the neutron L3 scheduler is coded.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"e1b18a2bede2ab9c88adf978c43dfd2a3820d2f8","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":41,"context_line":"class OVNGatewayScheduler(object):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self):"},{"line_number":44,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_07ba9ee1","line":41,"in_reply_to":"3aaa91ec_42d81bf0","updated":"2016-06-21 21:41:01.000000000","message":"The code is fine.  I\u0027m just suggesting that these schedulers be moved from l3_ovn.py to l3_ovn_scheduler.py.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"0b5600e89eb490709c95b5ae58c64ea12b6899ff","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        return self._schedule_gateway(nb_idl, sb_idl, router_name, candidates)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _select_gateway_chassis(self, nb_idl, candidates):"},{"line_number":87,"context_line":"        return random.choice(candidates)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class OVNGatewayLeastLoadedScheduler(OVNGatewayScheduler):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_07462523","line":87,"updated":"2016-06-21 19:33:11.000000000","message":"For serviceability purposes, should we log the choice?","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        return self._schedule_gateway(nb_idl, sb_idl, router_name, candidates)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _select_gateway_chassis(self, nb_idl, candidates):"},{"line_number":87,"context_line":"        return random.choice(candidates)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class OVNGatewayLeastLoadedScheduler(OVNGatewayScheduler):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_e2edc78f","line":87,"in_reply_to":"3aaa91ec_07462523","updated":"2016-06-21 20:02:42.000000000","message":"LOG.info or LOG.debug - the choice can be seen in the OVN NB database after the fact.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"e1b18a2bede2ab9c88adf978c43dfd2a3820d2f8","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        return self._schedule_gateway(nb_idl, sb_idl, router_name, candidates)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _select_gateway_chassis(self, nb_idl, candidates):"},{"line_number":87,"context_line":"        return random.choice(candidates)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class OVNGatewayLeastLoadedScheduler(OVNGatewayScheduler):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_87720e7b","line":87,"in_reply_to":"3aaa91ec_e2edc78f","updated":"2016-06-21 21:41:01.000000000","message":"If scheduling doesn\u0027t occur often, info may be appropriate.  The logs would help with establishing a timeline.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"0b5600e89eb490709c95b5ae58c64ea12b6899ff","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        chassis_bindings \u003d nb_idl.get_all_chassis_router_bindings(candidates)"},{"line_number":98,"context_line":"        LOG.info(_LI(\"_select_gateway_chassis %s\"), chassis_bindings)"},{"line_number":99,"context_line":"        # Sort on the length of the values in the returned dictionary"},{"line_number":100,"context_line":"        return sorted(chassis_bindings.items(), key\u003dlambda x: len(x[1]))[0][0]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class OVNL3RouterPlugin(service_base.ServicePluginBase,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_674ba92c","line":100,"updated":"2016-06-21 19:33:11.000000000","message":"For serviceability purposes, should we log the choice?","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"e1b18a2bede2ab9c88adf978c43dfd2a3820d2f8","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        chassis_bindings \u003d nb_idl.get_all_chassis_router_bindings(candidates)"},{"line_number":98,"context_line":"        LOG.info(_LI(\"_select_gateway_chassis %s\"), chassis_bindings)"},{"line_number":99,"context_line":"        # Sort on the length of the values in the returned dictionary"},{"line_number":100,"context_line":"        return sorted(chassis_bindings.items(), key\u003dlambda x: len(x[1]))[0][0]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class OVNL3RouterPlugin(service_base.ServicePluginBase,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_676f2293","line":100,"in_reply_to":"3aaa91ec_620c3743","updated":"2016-06-21 21:41:01.000000000","message":"Same as above.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        chassis_bindings \u003d nb_idl.get_all_chassis_router_bindings(candidates)"},{"line_number":98,"context_line":"        LOG.info(_LI(\"_select_gateway_chassis %s\"), chassis_bindings)"},{"line_number":99,"context_line":"        # Sort on the length of the values in the returned dictionary"},{"line_number":100,"context_line":"        return sorted(chassis_bindings.items(), key\u003dlambda x: len(x[1]))[0][0]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class OVNL3RouterPlugin(service_base.ServicePluginBase,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_620c3743","line":100,"in_reply_to":"3aaa91ec_674ba92c","updated":"2016-06-21 20:02:42.000000000","message":"LOG.info or LOG.debug - the choice can be seen in the OVN NB database after the fact.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"0b5600e89eb490709c95b5ae58c64ea12b6899ff","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.scheduler \u003d OVNGatewayChanceScheduler()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @property"},{"line_number":124,"context_line":"    def _ovn(self):"},{"line_number":125,"context_line":"        if self._nb_ovn_idl is None:"},{"line_number":126,"context_line":"            LOG.info(_LI(\"Getting OvsdbNbOvnIdl\"))"},{"line_number":127,"context_line":"            self._nb_ovn_idl \u003d impl_idl_ovn.OvsdbNbOvnIdl(self)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_270fe1e2","line":124,"updated":"2016-06-21 19:33:11.000000000","message":"This should probably be changed to _nb_ovn now that _sb_ovn is being added.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.scheduler \u003d OVNGatewayChanceScheduler()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @property"},{"line_number":124,"context_line":"    def _ovn(self):"},{"line_number":125,"context_line":"        if self._nb_ovn_idl is None:"},{"line_number":126,"context_line":"            LOG.info(_LI(\"Getting OvsdbNbOvnIdl\"))"},{"line_number":127,"context_line":"            self._nb_ovn_idl \u003d impl_idl_ovn.OvsdbNbOvnIdl(self)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_bd03e00c","line":124,"in_reply_to":"3aaa91ec_270fe1e2","updated":"2016-06-21 20:02:42.000000000","message":"Should that be as part of this patch?","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b8071178d44a10c94d922ee5728ed67166aae61d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.scheduler \u003d OVNGatewayChanceScheduler()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @property"},{"line_number":124,"context_line":"    def _ovn(self):"},{"line_number":125,"context_line":"        if self._nb_ovn_idl is None:"},{"line_number":126,"context_line":"            LOG.info(_LI(\"Getting OvsdbNbOvnIdl\"))"},{"line_number":127,"context_line":"            self._nb_ovn_idl \u003d impl_idl_ovn.OvsdbNbOvnIdl(self)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_d2785292","line":124,"in_reply_to":"3aaa91ec_47266669","updated":"2016-06-21 21:57:41.000000000","message":"We can do that later then otherwise there will be merge conflicts?","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"e1b18a2bede2ab9c88adf978c43dfd2a3820d2f8","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.scheduler \u003d OVNGatewayChanceScheduler()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @property"},{"line_number":124,"context_line":"    def _ovn(self):"},{"line_number":125,"context_line":"        if self._nb_ovn_idl is None:"},{"line_number":126,"context_line":"            LOG.info(_LI(\"Getting OvsdbNbOvnIdl\"))"},{"line_number":127,"context_line":"            self._nb_ovn_idl \u003d impl_idl_ovn.OvsdbNbOvnIdl(self)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_47266669","line":124,"in_reply_to":"3aaa91ec_bd03e00c","updated":"2016-06-21 21:41:01.000000000","message":"Doesn\u0027t have to be","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"5f3827036c1a60db4e3530732a00c4eb8c45aa00","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    @property"},{"line_number":131,"context_line":"    def _sb_ovn(self):"},{"line_number":132,"context_line":"        if self._sb_ovn_idl is None:"},{"line_number":133,"context_line":"            LOG.info(_LI(\"Getting OvsdbNbOvnIdl\"))"},{"line_number":134,"context_line":"            self._sb_ovn_idl \u003d impl_idl_ovn.OvsdbSbOvnIdl(self)"},{"line_number":135,"context_line":"        return self._sb_ovn_idl"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_0c83eccd","line":133,"range":{"start_line":133,"start_character":25,"end_line":133,"end_character":48},"updated":"2016-06-21 19:20:07.000000000","message":"Nit:  \"Getting OvsdbSbOvnIdl\"","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    @property"},{"line_number":131,"context_line":"    def _sb_ovn(self):"},{"line_number":132,"context_line":"        if self._sb_ovn_idl is None:"},{"line_number":133,"context_line":"            LOG.info(_LI(\"Getting OvsdbNbOvnIdl\"))"},{"line_number":134,"context_line":"            self._sb_ovn_idl \u003d impl_idl_ovn.OvsdbSbOvnIdl(self)"},{"line_number":135,"context_line":"        return self._sb_ovn_idl"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_1d09542d","line":133,"range":{"start_line":133,"start_character":25,"end_line":133,"end_character":48},"in_reply_to":"3aaa91ec_0c83eccd","updated":"2016-06-21 20:02:42.000000000","message":"Done","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"3440300339140c84ff65d85ed4738005436c64e4","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self._nb_ovn_idl \u003d None"},{"line_number":54,"context_line":"        self._sb_ovn_idl \u003d None"},{"line_number":55,"context_line":"        self._plugin_property \u003d None"},{"line_number":56,"context_line":"        self.scheduler \u003d l3_ovn_scheduler.OVNGatewayLeastLoadedScheduler()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    def _ovn(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_2b6e672f","line":56,"range":{"start_line":56,"start_character":25,"end_line":56,"end_character":74},"updated":"2016-06-22 11:32:16.000000000","message":"Could this be made configurable?","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b45e68af39da5e7a0bb23ddc62c656506a471493","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self._nb_ovn_idl \u003d None"},{"line_number":54,"context_line":"        self._sb_ovn_idl \u003d None"},{"line_number":55,"context_line":"        self._plugin_property \u003d None"},{"line_number":56,"context_line":"        self.scheduler \u003d l3_ovn_scheduler.OVNGatewayLeastLoadedScheduler()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    def _ovn(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_0106d5cd","line":56,"range":{"start_line":56,"start_character":25,"end_line":56,"end_character":74},"in_reply_to":"3aaa91ec_2b6e672f","updated":"2016-06-22 18:09:48.000000000","message":"Done","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"3440300339140c84ff65d85ed4738005436c64e4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        return self._nb_ovn_idl"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @property"},{"line_number":66,"context_line":"    def _sb_ovn(self):"},{"line_number":67,"context_line":"        if self._sb_ovn_idl is None:"},{"line_number":68,"context_line":"            LOG.info(_LI(\"Getting OvsdbSbOvnIdl\"))"},{"line_number":69,"context_line":"            self._sb_ovn_idl \u003d impl_idl_ovn.OvsdbSbOvnIdl(self)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_c89ec955","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":15},"updated":"2016-06-22 11:32:16.000000000","message":"If the _sb_ovn here will only be used in scheduler, I think it would be better to initialize _sb_ovn in the scheduler. The benefit might be that you don\u0027t need to do the potenial rename of _ovn.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b45e68af39da5e7a0bb23ddc62c656506a471493","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        return self._nb_ovn_idl"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @property"},{"line_number":66,"context_line":"    def _sb_ovn(self):"},{"line_number":67,"context_line":"        if self._sb_ovn_idl is None:"},{"line_number":68,"context_line":"            LOG.info(_LI(\"Getting OvsdbSbOvnIdl\"))"},{"line_number":69,"context_line":"            self._sb_ovn_idl \u003d impl_idl_ovn.OvsdbSbOvnIdl(self)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_012c1501","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":15},"in_reply_to":"3aaa91ec_c89ec955","updated":"2016-06-22 18:09:48.000000000","message":"Good point. I can do that.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"3440300339140c84ff65d85ed4738005436c64e4","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                      ).execute(check_error\u003dTrue)"},{"line_number":215,"context_line":"        return router_interface_info"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def schedule_unhosted_routers(self):"},{"line_number":218,"context_line":"        unhosted_routers \u003d self._ovn.get_unhosted_routers()"},{"line_number":219,"context_line":"        if unhosted_routers:"},{"line_number":220,"context_line":"            with self._ovn.transaction(check_error\u003dTrue) as txn:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_16690ebf","line":217,"range":{"start_line":217,"start_character":8,"end_line":217,"end_character":33},"updated":"2016-06-22 11:32:16.000000000","message":"I found this will only be called when getting chassis event. I think the router should be scheduled when the gateway is set. That is more close to the real use case.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b45e68af39da5e7a0bb23ddc62c656506a471493","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                      ).execute(check_error\u003dTrue)"},{"line_number":215,"context_line":"        return router_interface_info"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def schedule_unhosted_routers(self):"},{"line_number":218,"context_line":"        unhosted_routers \u003d self._ovn.get_unhosted_routers()"},{"line_number":219,"context_line":"        if unhosted_routers:"},{"line_number":220,"context_line":"            with self._ovn.transaction(check_error\u003dTrue) as txn:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_01053579","line":217,"range":{"start_line":217,"start_character":8,"end_line":217,"end_character":33},"in_reply_to":"3aaa91ec_16690ebf","updated":"2016-06-22 18:09:48.000000000","message":"The Floating IP and SNAT patch (coming soon from Chandra) will actually invoke the OVN L3 Scheduler when the gateway port is created. This patch is simply the OVN L3 scheduler.\n\nNow it\u0027s possible that when the gateway port is created there is no chassis available. So we simply mark that gateway/router chassis as \"neutron-invalid-chassis\", and when a chassis becomes available we schedule the routers who have \"neutron-invalid-chassis\" on the newly available chassis.\n\nI\u0027m not quite happy with his simple implementation because what happens is that when the 1st chassis that becomes available, all the router gateways which have \"neutron-invalid-chassis\" will all be scheduled on that 1st chassis.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.scheduler \u003d l3_ovn_scheduler.get_scheduler()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    def _ovn(self):"},{"line_number":60,"context_line":"        if self._nb_ovn_idl is None:"},{"line_number":61,"context_line":"            LOG.info(_LI(\"Getting OvsdbNbOvnIdl\"))"},{"line_number":62,"context_line":"            self._nb_ovn_idl \u003d impl_idl_ovn.OvsdbNbOvnIdl(self)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_357dc5b1","line":59,"updated":"2016-07-20 15:26:07.000000000","message":"It\u0027s not a big deal, but this should probably be _nb_ovn now.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"}],"networking_ovn/l3/l3_ovn_scheduler.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"3440300339140c84ff65d85ed4738005436c64e4","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":28,"context_line":"class OVNGatewayScheduler(object):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self):"},{"line_number":31,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_08dbb17d","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":25},"updated":"2016-06-22 11:32:16.000000000","message":"Is it possible to use the base_scheduler and base_resource_filter from neutron here? I see the gap that scheduler in neutron are based on agent, but I think it is worth a try.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b45e68af39da5e7a0bb23ddc62c656506a471493","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":28,"context_line":"class OVNGatewayScheduler(object):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self):"},{"line_number":31,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_615a3952","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":25},"in_reply_to":"3aaa91ec_08dbb17d","updated":"2016-06-22 18:09:48.000000000","message":"Yes I looked into it, the neutron base scheduler relies heavily on the l3 agent and RPC channel (for heartbeats etc), we don\u0027t want to rely on traditional L3 agents and RPC channel. Additionally the mapping of agents to L3 nodes are saved in the neutron DB whereas in OVN, the mapping of router gateway to chassis is stored in the OVN_Northbound DB. There is also the notion that not all routers have gateways and such routers will not need to be scheduled.\n\nDue to all the other exceptions, I decided to go with a simple L3 scheduler for the moment to let the eventual OVN L3 Floating IP and SNAT patch get going.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def __init__(self):"},{"line_number":35,"context_line":"        pass"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @abc.abstractmethod"},{"line_number":38,"context_line":"    def select(self, nb_idl, sb_idl, router_name, candidates\u003dNone):"},{"line_number":39,"context_line":"        \"\"\"Schedule the gateway port of a router to an OVN chassis."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_15f1a001","line":37,"updated":"2016-07-20 15:26:07.000000000","message":"Does this need to be abstract?  The implementations are the same.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def __init__(self):"},{"line_number":35,"context_line":"        pass"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @abc.abstractmethod"},{"line_number":38,"context_line":"    def select(self, nb_idl, sb_idl, router_name, candidates\u003dNone):"},{"line_number":39,"context_line":"        \"\"\"Schedule the gateway port of a router to an OVN chassis."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_4471a475","line":37,"in_reply_to":"dada55a8_15f1a001","updated":"2016-07-20 16:27:21.000000000","message":"I was following the \"schedule\" abstract method in the neutron L3Scheduler scheduler. It\u0027s similar. I think it leaves flexibility to the actual type of scheduler to decide how to implement select.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"495bf08fe015c5dc69d22ee584b94056c045e161","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def __init__(self):"},{"line_number":35,"context_line":"        pass"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @abc.abstractmethod"},{"line_number":38,"context_line":"    def select(self, nb_idl, sb_idl, router_name, candidates\u003dNone):"},{"line_number":39,"context_line":"        \"\"\"Schedule the gateway port of a router to an OVN chassis."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_d470a1a6","line":37,"in_reply_to":"dada55a8_4471a475","updated":"2016-07-20 17:49:28.000000000","message":"okay","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"}],"networking_ovn/ml2/mech_driver.py":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"d823d04fcf2e4e73873dfcd9508de5da7fa94a68","unresolved":false,"context_lines":[{"line_number":676,"context_line":"    def schedule_unhosted_routers(self):"},{"line_number":677,"context_line":"        \"\"\"Schedule gateway for routers which are not hosted by any chassis"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        This should be done in the l3_ovn(.py) but the ML2 mechanism driver"},{"line_number":680,"context_line":"        is the one which subscribes to Chassis Events."},{"line_number":681,"context_line":"        \"\"\""},{"line_number":682,"context_line":"        service_plugins \u003d manager.NeutronManager.get_service_plugins()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_89934efa","line":679,"updated":"2016-06-21 19:05:21.000000000","message":"Should we fix that and have the l3 plugin subscribe to chassis events? I guess we can\u0027t because we\u0027ll need chassis events in the ML2 driver for the routed network work as well.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"e1b18a2bede2ab9c88adf978c43dfd2a3820d2f8","unresolved":false,"context_lines":[{"line_number":676,"context_line":"    def schedule_unhosted_routers(self):"},{"line_number":677,"context_line":"        \"\"\"Schedule gateway for routers which are not hosted by any chassis"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        This should be done in the l3_ovn(.py) but the ML2 mechanism driver"},{"line_number":680,"context_line":"        is the one which subscribes to Chassis Events."},{"line_number":681,"context_line":"        \"\"\""},{"line_number":682,"context_line":"        service_plugins \u003d manager.NeutronManager.get_service_plugins()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_c7e7f63e","line":679,"in_reply_to":"3aaa91ec_829043ee","updated":"2016-06-21 21:41:01.000000000","message":"This seems okay.  But I suggest pulling out the l3_plugin logic from ChassisEvent and let the caller pass it in like driver.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"0b5600e89eb490709c95b5ae58c64ea12b6899ff","unresolved":false,"context_lines":[{"line_number":676,"context_line":"    def schedule_unhosted_routers(self):"},{"line_number":677,"context_line":"        \"\"\"Schedule gateway for routers which are not hosted by any chassis"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        This should be done in the l3_ovn(.py) but the ML2 mechanism driver"},{"line_number":680,"context_line":"        is the one which subscribes to Chassis Events."},{"line_number":681,"context_line":"        \"\"\""},{"line_number":682,"context_line":"        service_plugins \u003d manager.NeutronManager.get_service_plugins()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a7f111d0","line":679,"in_reply_to":"3aaa91ec_89934efa","updated":"2016-06-21 19:33:11.000000000","message":"Agreed, it would be nice to move this to l3 plugin.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":676,"context_line":"    def schedule_unhosted_routers(self):"},{"line_number":677,"context_line":"        \"\"\"Schedule gateway for routers which are not hosted by any chassis"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        This should be done in the l3_ovn(.py) but the ML2 mechanism driver"},{"line_number":680,"context_line":"        is the one which subscribes to Chassis Events."},{"line_number":681,"context_line":"        \"\"\""},{"line_number":682,"context_line":"        service_plugins \u003d manager.NeutronManager.get_service_plugins()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_829043ee","line":679,"in_reply_to":"3aaa91ec_a7f111d0","updated":"2016-06-21 20:02:42.000000000","message":"I am making the change instead in ovsdb_monitor.py?\n\nclass ChassisEvent(row_event.RowEvent):\n    \"\"\"Chassis create update delete event.\"\"\"\n\n    def __init__(self, driver):\n        self.driver \u003d driver\n        self.l3_plugin \u003d manager.NeutronManager.get_service_plugins().get(\n            plugin_constants.L3_ROUTER_NAT)","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b8071178d44a10c94d922ee5728ed67166aae61d","unresolved":false,"context_lines":[{"line_number":676,"context_line":"    def schedule_unhosted_routers(self):"},{"line_number":677,"context_line":"        \"\"\"Schedule gateway for routers which are not hosted by any chassis"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        This should be done in the l3_ovn(.py) but the ML2 mechanism driver"},{"line_number":680,"context_line":"        is the one which subscribes to Chassis Events."},{"line_number":681,"context_line":"        \"\"\""},{"line_number":682,"context_line":"        service_plugins \u003d manager.NeutronManager.get_service_plugins()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_723a3ecf","line":679,"in_reply_to":"3aaa91ec_c7e7f63e","updated":"2016-06-21 21:57:41.000000000","message":"That\u0027s not possible (easily). There is only 1 worker/driver (the mech_driver) can register for events (since it acquires a lock on the OVN database). Currently the mech_driver is the only one that registers a event handler and the corresponding driver is the mech_driver. Both the mech driver and l3 plugin need the Chassis Event for different purposes.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1f895394f769ab7bd068a2fd0b687c2d2f4febba","unresolved":false,"context_lines":[{"line_number":680,"context_line":"        is the one which subscribes to Chassis Events."},{"line_number":681,"context_line":"        \"\"\""},{"line_number":682,"context_line":"        service_plugins \u003d manager.NeutronManager.get_service_plugins()"},{"line_number":683,"context_line":"        l3_plugin \u003d service_plugins.get(plugin_constants.L3_ROUTER_NAT)"},{"line_number":684,"context_line":"        if l3_plugin:"},{"line_number":685,"context_line":"            l3_plugin.schedule_unhosted_routers()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_8c587c58","line":683,"updated":"2016-06-21 19:23:19.000000000","message":"This may not be the OVN l3 plugin.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":680,"context_line":"        is the one which subscribes to Chassis Events."},{"line_number":681,"context_line":"        \"\"\""},{"line_number":682,"context_line":"        service_plugins \u003d manager.NeutronManager.get_service_plugins()"},{"line_number":683,"context_line":"        l3_plugin \u003d service_plugins.get(plugin_constants.L3_ROUTER_NAT)"},{"line_number":684,"context_line":"        if l3_plugin:"},{"line_number":685,"context_line":"            l3_plugin.schedule_unhosted_routers()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_62b0b78c","line":683,"in_reply_to":"3aaa91ec_8c587c58","updated":"2016-06-21 20:02:42.000000000","message":"Moving to class ChassisEvent","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"}],"networking_ovn/ovn_db_sync.py":[{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":417,"context_line":"    def __init__(self, core_plugin, ovn_api, ovn_driver):"},{"line_number":418,"context_line":"        super(OvnSbSynchronizer, self).__init__("},{"line_number":419,"context_line":"            core_plugin, ovn_api, ovn_driver)"},{"line_number":420,"context_line":"        self.l3_plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":421,"context_line":"            service_constants.L3_ROUTER_NAT)"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def _sync(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_1557e158","line":420,"updated":"2016-07-20 15:26:07.000000000","message":"This may not be the OVN L3 plugin. I think you need to check the OVN L3 mode at some point.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":417,"context_line":"    def __init__(self, core_plugin, ovn_api, ovn_driver):"},{"line_number":418,"context_line":"        super(OvnSbSynchronizer, self).__init__("},{"line_number":419,"context_line":"            core_plugin, ovn_api, ovn_driver)"},{"line_number":420,"context_line":"        self.l3_plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":421,"context_line":"            service_constants.L3_ROUTER_NAT)"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def _sync(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_04e04cf9","line":420,"in_reply_to":"dada55a8_1557e158","updated":"2016-07-20 16:27:21.000000000","message":"I\u0027ve got to figure this out. Good point!","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"}],"networking_ovn/ovsdb/impl_idl_ovn.py":[{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"0b5600e89eb490709c95b5ae58c64ea12b6899ff","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        chassis_bindings \u003d {}"},{"line_number":254,"context_line":"        for chassis_name in chassis_candidate_list:"},{"line_number":255,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":256,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":257,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":258,"context_line":"            if not chassis_name:"},{"line_number":259,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_c7ba5dc0","line":256,"updated":"2016-06-21 19:33:11.000000000","message":"This and other methods below should ignore non-neutron routers.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b8071178d44a10c94d922ee5728ed67166aae61d","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        chassis_bindings \u003d {}"},{"line_number":254,"context_line":"        for chassis_name in chassis_candidate_list:"},{"line_number":255,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":256,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":257,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":258,"context_line":"            if not chassis_name:"},{"line_number":259,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_b234a6de","line":256,"in_reply_to":"3aaa91ec_a258df57","updated":"2016-06-21 21:57:41.000000000","message":"Done","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        chassis_bindings \u003d {}"},{"line_number":254,"context_line":"        for chassis_name in chassis_candidate_list:"},{"line_number":255,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":256,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":257,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":258,"context_line":"            if not chassis_name:"},{"line_number":259,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a258df57","line":256,"in_reply_to":"3aaa91ec_c7ba5dc0","updated":"2016-06-21 20:02:42.000000000","message":"Interesting - but sure, I\u0027ll take out routers not starting with neutron-.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"4270d5758a419bf0573aa6522f957e9446381c98","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":286,"context_line":"            if chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS:"},{"line_number":287,"context_line":"                return None"},{"line_number":288,"context_line":"            else:"},{"line_number":289,"context_line":"                chassis_name"},{"line_number":290,"context_line":"        except idlutils.RowNotFound:"},{"line_number":291,"context_line":"            return None"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_799d57bb","line":289,"range":{"start_line":288,"start_character":0,"end_line":289,"end_character":28},"updated":"2016-07-12 18:01:26.000000000","message":"what\u0027s going on here? Seems like you don\u0027t need this if/else?","commit_id":"18de3130c7a69adc94e9b478d2c6175a6ca13e30"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"4d3289eda38e1a63bc149e0947ae989ea7ae99ce","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":286,"context_line":"            if chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS:"},{"line_number":287,"context_line":"                return None"},{"line_number":288,"context_line":"            else:"},{"line_number":289,"context_line":"                chassis_name"},{"line_number":290,"context_line":"        except idlutils.RowNotFound:"},{"line_number":291,"context_line":"            return None"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_06ae672d","line":289,"range":{"start_line":288,"start_character":0,"end_line":289,"end_character":28},"in_reply_to":"1aa78d24_799d57bb","updated":"2016-07-12 22:58:39.000000000","message":"This is a very good catch. It\u0027s a mistake, this should have been:\n\nreturn chassis_name.\n\nWe\u0027ve been mocking out the return values from the impl_idl_ovn functions for the unit tests, it seems like we need to have a functional tests for them.\n\nI know the NAT patch tested this - but it doesn\u0027t typically try to re-schedule an already existing router, so it missed this case.","commit_id":"18de3130c7a69adc94e9b478d2c6175a6ca13e30"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"4270d5758a419bf0573aa6522f957e9446381c98","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            # We only need to know the content of Chassis in OVN_Southbound"},{"line_number":316,"context_line":"            OvsdbSbOvnIdl.ovsdb_connection.start(driver,"},{"line_number":317,"context_line":"                                                 table_name_list\u003d[\u0027Chassis\u0027])"},{"line_number":318,"context_line":"        else:"},{"line_number":319,"context_line":"            OvsdbSbOvnIdl.ovsdb_connection.start()"},{"line_number":320,"context_line":"        self.idl \u003d OvsdbSbOvnIdl.ovsdb_connection.idl"},{"line_number":321,"context_line":"        self.ovsdb_timeout \u003d cfg.get_ovn_ovsdb_timeout()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_19b89310","line":318,"updated":"2016-07-12 18:01:26.000000000","message":"nit: would you mind adding a comment about why/ in what case we are just entering the else block below? I think it would be nice to document the code a little with comments for things that aren\u0027t obvious.\n\n\nI\u0027m wondering why this isn\u0027t done in one call and needs the if/else logic.","commit_id":"18de3130c7a69adc94e9b478d2c6175a6ca13e30"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"98c3ead3fd80324cc24afc383c11f37e4b7519f9","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def get_all_chassis_router_bindings(self, chassis_candidate_list\u003dNone):"},{"line_number":268,"context_line":"        chassis_bindings \u003d {}"},{"line_number":269,"context_line":"        for chassis_name in chassis_candidate_list:"},{"line_number":270,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":271,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":272,"context_line":"            if not utils.is_ovn_name(router.name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_a5f8be4a","line":269,"updated":"2016-07-19 06:04:29.000000000","message":"There will be \"TypeError: \u0027NoneType\u0027 object is not iterable\" if \u0027chassis_candidate_list\u0027 is None.\nYou can change it to\nfor chassis_name in chassis_candidate_list or []:\n  ...","commit_id":"582f8d35197524ed0e6cbea8ef521447efe18b96"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"13007ea6de11eeef64a3e775fe8afe7ad4cf0167","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def get_all_chassis_router_bindings(self, chassis_candidate_list\u003dNone):"},{"line_number":268,"context_line":"        chassis_bindings \u003d {}"},{"line_number":269,"context_line":"        for chassis_name in chassis_candidate_list:"},{"line_number":270,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":271,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":272,"context_line":"            if not utils.is_ovn_name(router.name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_90130866","line":269,"in_reply_to":"dada55a8_8efe7236","updated":"2016-07-19 22:41:35.000000000","message":"It\u0027s a good point, I do want to allow calling with a list, so I will fix this.","commit_id":"582f8d35197524ed0e6cbea8ef521447efe18b96"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"4d96bfcea707e0adb9c5ca8651560bd2f51e966d","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def get_all_chassis_router_bindings(self, chassis_candidate_list\u003dNone):"},{"line_number":268,"context_line":"        chassis_bindings \u003d {}"},{"line_number":269,"context_line":"        for chassis_name in chassis_candidate_list:"},{"line_number":270,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":271,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":272,"context_line":"            if not utils.is_ovn_name(router.name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_a9b17e91","line":269,"in_reply_to":"dada55a8_90130866","updated":"2016-07-20 04:22:23.000000000","message":"I will add the functional test as a follow up patch.","commit_id":"582f8d35197524ed0e6cbea8ef521447efe18b96"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"e08ec3af9b4eba4c1aed96a78723c94a4a87bf75","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def get_all_chassis_router_bindings(self, chassis_candidate_list\u003dNone):"},{"line_number":268,"context_line":"        chassis_bindings \u003d {}"},{"line_number":269,"context_line":"        for chassis_name in chassis_candidate_list:"},{"line_number":270,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":271,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":272,"context_line":"            if not utils.is_ovn_name(router.name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_8efe7236","line":269,"in_reply_to":"dada55a8_a5f8be4a","updated":"2016-07-19 08:59:40.000000000","message":"You can chose to ignore this comment as \"chassis_candidate_list\" will not be \u0027None\u0027 after looking in the places where from it is called.","commit_id":"582f8d35197524ed0e6cbea8ef521447efe18b96"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"98c3ead3fd80324cc24afc383c11f37e4b7519f9","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    def get_all_chassis(self, chassis_type\u003dNone):"},{"line_number":336,"context_line":"        chassis_list \u003d []"},{"line_number":337,"context_line":"        for ch in self.idl.tables[\u0027Chassis\u0027].rows.values():"},{"line_number":338,"context_line":"            if not chassis_type or chassis_type in ch.compute_types:"},{"line_number":339,"context_line":"                chassis_list.append(ch.name)"},{"line_number":340,"context_line":"        return chassis_list"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_603d14bb","line":338,"updated":"2016-07-19 06:04:29.000000000","message":"I think you can delete this line for now since anyway \"chassis_type\" is passed as None from all the callers of this functions and the upstream OVN patch can store the compute type in exernal_ids field.","commit_id":"582f8d35197524ed0e6cbea8ef521447efe18b96"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"13007ea6de11eeef64a3e775fe8afe7ad4cf0167","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    def get_all_chassis(self, chassis_type\u003dNone):"},{"line_number":336,"context_line":"        chassis_list \u003d []"},{"line_number":337,"context_line":"        for ch in self.idl.tables[\u0027Chassis\u0027].rows.values():"},{"line_number":338,"context_line":"            if not chassis_type or chassis_type in ch.compute_types:"},{"line_number":339,"context_line":"                chassis_list.append(ch.name)"},{"line_number":340,"context_line":"        return chassis_list"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_44839156","line":338,"in_reply_to":"dada55a8_603d14bb","updated":"2016-07-19 22:41:35.000000000","message":"Done","commit_id":"582f8d35197524ed0e6cbea8ef521447efe18b96"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        for chassis_name in chassis_candidate_list or []:"},{"line_number":270,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":271,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":272,"context_line":"            if not utils.is_ovn_name(router.name):"},{"line_number":273,"context_line":"                continue"},{"line_number":274,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":275,"context_line":"            if not chassis_name:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_15440148","line":272,"updated":"2016-07-20 15:26:07.000000000","message":"I think ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY should be used when checking for neutron routers.  This is how get_all_logical_routers_with_rports() works.  If you change this then I don\u0027t think that the is_ovn_name utility is needed.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        for chassis_name in chassis_candidate_list or []:"},{"line_number":270,"context_line":"            chassis_bindings.setdefault(chassis_name, [])"},{"line_number":271,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":272,"context_line":"            if not utils.is_ovn_name(router.name):"},{"line_number":273,"context_line":"                continue"},{"line_number":274,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":275,"context_line":"            if not chassis_name:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_04b32cea","line":272,"in_reply_to":"dada55a8_15440148","updated":"2016-07-20 16:27:21.000000000","message":"Done","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    def get_unhosted_routers(self):"},{"line_number":298,"context_line":"        unhosted_routers \u003d {}"},{"line_number":299,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":300,"context_line":"            if not utils.is_ovn_name(router.name):"},{"line_number":301,"context_line":"                continue"},{"line_number":302,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":303,"context_line":"            if chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_757bbd8c","line":300,"updated":"2016-07-20 15:26:07.000000000","message":"Same comment as above.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    def get_unhosted_routers(self):"},{"line_number":298,"context_line":"        unhosted_routers \u003d {}"},{"line_number":299,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":300,"context_line":"            if not utils.is_ovn_name(router.name):"},{"line_number":301,"context_line":"                continue"},{"line_number":302,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":303,"context_line":"            if chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_c4e3d4d7","line":300,"in_reply_to":"dada55a8_757bbd8c","updated":"2016-07-20 16:27:21.000000000","message":"Done","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":300,"context_line":"            if not utils.is_ovn_name(router.name):"},{"line_number":301,"context_line":"                continue"},{"line_number":302,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":303,"context_line":"            if chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS:"},{"line_number":304,"context_line":"                unhosted_routers[router.name] \u003d router.options"},{"line_number":305,"context_line":"        return unhosted_routers"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_758e1cd1","line":302,"updated":"2016-07-20 15:26:07.000000000","message":"Doesn\u0027t this need to handle the case when the chassis no longer exists?","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":300,"context_line":"            if not utils.is_ovn_name(router.name):"},{"line_number":301,"context_line":"                continue"},{"line_number":302,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":303,"context_line":"            if chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS:"},{"line_number":304,"context_line":"                unhosted_routers[router.name] \u003d router.options"},{"line_number":305,"context_line":"        return unhosted_routers"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_8449dcb9","line":302,"in_reply_to":"dada55a8_758e1cd1","updated":"2016-07-20 16:27:21.000000000","message":"That should be a bug/enhancement handled in OVN. It\u0027s not just moving a router over, it involves moving conntrack state for existing connection etc. We can make it a TODO here and solve it in OVN first.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"495bf08fe015c5dc69d22ee584b94056c045e161","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        for router in self._tables[\u0027Logical_Router\u0027].rows.values():"},{"line_number":300,"context_line":"            if not utils.is_ovn_name(router.name):"},{"line_number":301,"context_line":"                continue"},{"line_number":302,"context_line":"            chassis_name \u003d router.options.get(\u0027chassis\u0027)"},{"line_number":303,"context_line":"            if chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS:"},{"line_number":304,"context_line":"                unhosted_routers[router.name] \u003d router.options"},{"line_number":305,"context_line":"        return unhosted_routers"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_14aeb9e5","line":302,"in_reply_to":"dada55a8_8449dcb9","updated":"2016-07-20 17:49:28.000000000","message":"Okay, let\u0027s add a TODO which links to a bug report.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"bf99ed3a21d912c61583c95c860b3470b043d3e8","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                lrouter.external_ids):"},{"line_number":303,"context_line":"                continue"},{"line_number":304,"context_line":"            chassis_name \u003d lrouter.options.get(\u0027chassis\u0027)"},{"line_number":305,"context_line":"            # TODO(azbiswas): Handle the case when a chassis is no"},{"line_number":306,"context_line":"            # longer valid. This may involve moving conntrack states,"},{"line_number":307,"context_line":"            # so it needs to discussed in the OVN community first."},{"line_number":308,"context_line":"            if (chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS or"}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_86aef62b","line":305,"updated":"2016-07-26 19:19:46.000000000","message":"Has a bug report been opened to track this?  If so, please reference that here.","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02231a22bf31ea5015c368ee9bc4e0e69b018d23","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                lrouter.external_ids):"},{"line_number":303,"context_line":"                continue"},{"line_number":304,"context_line":"            chassis_name \u003d lrouter.options.get(\u0027chassis\u0027)"},{"line_number":305,"context_line":"            # TODO(azbiswas): Handle the case when a chassis is no"},{"line_number":306,"context_line":"            # longer valid. This may involve moving conntrack states,"},{"line_number":307,"context_line":"            # so it needs to discussed in the OVN community first."},{"line_number":308,"context_line":"            if (chassis_name \u003d\u003d ovn_const.OVN_GATEWAY_INVALID_CHASSIS or"}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_002dc145","line":305,"in_reply_to":"dada55a8_86aef62b","updated":"2016-07-27 00:08:00.000000000","message":"I added support for re-scheduling gateway ports that are no longer in the valid_chassis_list. So this has been taken care of. Will remove the comment.","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"}],"networking_ovn/ovsdb/ovn_api.py":[{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1f895394f769ab7bd068a2fd0b687c2d2f4febba","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        :param chassis_candidate_list:  List of possible chassis candidates"},{"line_number":300,"context_line":"        :type chassis_candidate_list:   []"},{"line_number":301,"context_line":"        :returns:                       {}"},{"line_number":302,"context_line":"        \"\"\""},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_6cef10b1","line":301,"updated":"2016-06-21 19:23:19.000000000","message":"Other methods above document both returns and rtype.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        :param chassis_candidate_list:  List of possible chassis candidates"},{"line_number":300,"context_line":"        :type chassis_candidate_list:   []"},{"line_number":301,"context_line":"        :returns:                       {}"},{"line_number":302,"context_line":"        \"\"\""},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_e2178752","line":301,"in_reply_to":"3aaa91ec_6cef10b1","updated":"2016-06-21 20:02:42.000000000","message":"Done","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1f895394f769ab7bd068a2fd0b687c2d2f4febba","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        :param router_id:     The neutron router id"},{"line_number":309,"context_line":"        :type router_id:      string"},{"line_number":310,"context_line":"        :returns              string"},{"line_number":311,"context_line":"        \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_cc2a84e7","line":310,"updated":"2016-06-21 19:23:19.000000000","message":"Other methods above document both returns and rtype.","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02883eaf7ce9e0e10c739deba3e7125367f029cb","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        :param router_id:     The neutron router id"},{"line_number":309,"context_line":"        :type router_id:      string"},{"line_number":310,"context_line":"        :returns              string"},{"line_number":311,"context_line":"        \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_c21c0b7a","line":310,"in_reply_to":"3aaa91ec_cc2a84e7","updated":"2016-06-21 20:02:42.000000000","message":"Done","commit_id":"3f1aa0c077b7d58ce630b5ae6e91641ec0c8329b"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"bf99ed3a21d912c61583c95c860b3470b043d3e8","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        \"\"\""},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    @abc.abstractmethod"},{"line_number":371,"context_line":"    def get_unhosted_routers(self):"},{"line_number":372,"context_line":"        \"\"\"Return a dictionary of routers gateways not hosted on chassis\"\"\""},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_867a7622","line":371,"updated":"2016-07-26 19:19:46.000000000","message":"This also has a valid_chassis_list parameter.","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02231a22bf31ea5015c368ee9bc4e0e69b018d23","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        \"\"\""},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    @abc.abstractmethod"},{"line_number":371,"context_line":"    def get_unhosted_routers(self):"},{"line_number":372,"context_line":"        \"\"\"Return a dictionary of routers gateways not hosted on chassis\"\"\""},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_80e891e3","line":371,"in_reply_to":"dada55a8_867a7622","updated":"2016-07-27 00:08:00.000000000","message":"Done","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"}],"networking_ovn/ovsdb/ovsdb_monitor.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"3440300339140c84ff65d85ed4738005436c64e4","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # TODO(lizk): Need a follow-up patch to consume the Chassis"},{"line_number":52,"context_line":"        # row and event, for when Chasiss table content changes"},{"line_number":53,"context_line":"        # caused by nodes come and leave."},{"line_number":54,"context_line":"        self.l3_plugin.schedule_unhosted_routers()"},{"line_number":55,"context_line":"        pass"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_ebabbf87","line":54,"range":{"start_line":54,"start_character":23,"end_line":54,"end_character":48},"updated":"2016-06-22 11:32:16.000000000","message":"This is a bit like auto_schedule in neutron agent scheduler. I think you only need to consider create/update event. And you can pass the chassis name to the scheduler, so that the scheduler know where to schedule the unhosted routers.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b45e68af39da5e7a0bb23ddc62c656506a471493","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # TODO(lizk): Need a follow-up patch to consume the Chassis"},{"line_number":52,"context_line":"        # row and event, for when Chasiss table content changes"},{"line_number":53,"context_line":"        # caused by nodes come and leave."},{"line_number":54,"context_line":"        self.l3_plugin.schedule_unhosted_routers()"},{"line_number":55,"context_line":"        pass"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_049c23bf","line":54,"range":{"start_line":54,"start_character":23,"end_line":54,"end_character":48},"in_reply_to":"3aaa91ec_ebabbf87","updated":"2016-06-22 18:09:48.000000000","message":"Agree. Though at this moment, this is an oversimplification. Eventually we do want to deal with chassis delete as well. But that requires conntrack state migration and other stuff.\n\nAlso it\u0027s possible that 1 chassis event may actually have multiple new chassis in the SB (those other events are coming soon). So it\u0027s better to just let the algorithm run through the pool of available chassis candidates at the moment.\n\nAnd this brings up another aspect of scheduling. Let\u0027s say the neutron server was brought down (for upgrade), and there were a bunch of gateway router which had \"invalid chassis\", and there are new chassis added while the neutron server was down. When the neutron server comes back up, there is no \"chassis\" event - Is there?","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"3440300339140c84ff65d85ed4738005436c64e4","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # row and event, for when Chasiss table content changes"},{"line_number":53,"context_line":"        # caused by nodes come and leave."},{"line_number":54,"context_line":"        self.l3_plugin.schedule_unhosted_routers()"},{"line_number":55,"context_line":"        pass"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class LogicalSwitchPortCreateUpEvent(row_event.RowEvent):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_4b9db364","line":55,"range":{"start_line":55,"start_character":8,"end_line":55,"end_character":12},"updated":"2016-06-22 11:32:16.000000000","message":"This could be removed.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b45e68af39da5e7a0bb23ddc62c656506a471493","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # row and event, for when Chasiss table content changes"},{"line_number":53,"context_line":"        # caused by nodes come and leave."},{"line_number":54,"context_line":"        self.l3_plugin.schedule_unhosted_routers()"},{"line_number":55,"context_line":"        pass"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class LogicalSwitchPortCreateUpEvent(row_event.RowEvent):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_413c5de2","line":55,"range":{"start_line":55,"start_character":8,"end_line":55,"end_character":12},"in_reply_to":"3aaa91ec_4b9db364","updated":"2016-06-22 18:09:48.000000000","message":"Done","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"3440300339140c84ff65d85ed4738005436c64e4","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"class OvnSbIdl(OvnIdl):"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __init__(self, driver, remote, schema):"},{"line_number":284,"context_line":"        super(OvnSbIdl, self).__init__(driver, remote, schema)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def post_initialize(self, driver):"},{"line_number":287,"context_line":"        \"\"\"Watch Chassis events."}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_cb87e30d","line":284,"range":{"start_line":283,"start_character":0,"end_line":284,"end_character":62},"updated":"2016-06-22 11:32:16.000000000","message":"I think this is not required, right?","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"b45e68af39da5e7a0bb23ddc62c656506a471493","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"class OvnSbIdl(OvnIdl):"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __init__(self, driver, remote, schema):"},{"line_number":284,"context_line":"        super(OvnSbIdl, self).__init__(driver, remote, schema)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def post_initialize(self, driver):"},{"line_number":287,"context_line":"        \"\"\"Watch Chassis events."}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_a4a6ef50","line":284,"range":{"start_line":283,"start_character":0,"end_line":284,"end_character":62},"in_reply_to":"3aaa91ec_cb87e30d","updated":"2016-06-22 18:09:48.000000000","message":"Correct. It\u0027s not required - I\u0027d added it for initial code, forget to remove it. Will do.","commit_id":"da6255b797ec459f29146931f338617c8d5b5d85"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"1cda4feb08aec9212b5b5074b05485d64b762c66","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def __init__(self, driver):"},{"line_number":43,"context_line":"        self.driver \u003d driver"},{"line_number":44,"context_line":"        self.l3_plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":45,"context_line":"            plugin_constants.L3_ROUTER_NAT)"},{"line_number":46,"context_line":"        table \u003d \u0027Chassis\u0027"},{"line_number":47,"context_line":"        events \u003d (self.ROW_CREATE, self.ROW_UPDATE, self.ROW_DELETE)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_7ace0a2f","line":44,"updated":"2016-07-20 15:26:07.000000000","message":"This may not be the OVN L3 plugin.  I think you need to check the OVN L3 mode at some point.","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"970be302dbd9649170930e9cdad3b1e4b56b264d","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def __init__(self, driver):"},{"line_number":43,"context_line":"        self.driver \u003d driver"},{"line_number":44,"context_line":"        self.l3_plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":45,"context_line":"            plugin_constants.L3_ROUTER_NAT)"},{"line_number":46,"context_line":"        table \u003d \u0027Chassis\u0027"},{"line_number":47,"context_line":"        events \u003d (self.ROW_CREATE, self.ROW_UPDATE, self.ROW_DELETE)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_a4e340a3","line":44,"in_reply_to":"dada55a8_7ace0a2f","updated":"2016-07-20 16:27:21.000000000","message":"Done","commit_id":"727551f3e01404cb5622dcf8ff4c422721c9b144"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"bf99ed3a21d912c61583c95c860b3470b043d3e8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            phy_nets \u003d list(mapping_dict)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        self.driver.update_segment_host_mapping(host, phy_nets)"},{"line_number":61,"context_line":"        if ovn_config.is_ovn_l3():"},{"line_number":62,"context_line":"            self.l3_plugin.schedule_unhosted_routers()"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_e603720e","line":61,"updated":"2016-07-26 19:19:46.000000000","message":"Please update unit tests for this.","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"02231a22bf31ea5015c368ee9bc4e0e69b018d23","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            phy_nets \u003d list(mapping_dict)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        self.driver.update_segment_host_mapping(host, phy_nets)"},{"line_number":61,"context_line":"        if ovn_config.is_ovn_l3():"},{"line_number":62,"context_line":"            self.l3_plugin.schedule_unhosted_routers()"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_00b781d8","line":61,"in_reply_to":"dada55a8_e603720e","updated":"2016-07-27 00:08:00.000000000","message":"Yes, will do.","commit_id":"2984868defdf8d303067f4e4780ceeb4b93053cc"}],"networking_ovn/tests/functional/base.py":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"351ebac4f07d65ed7524992ba13fcc742cd292ae","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        impl_idl_ovn.OvsdbSbOvnIdl.ovsdb_connection \u003d None"},{"line_number":137,"context_line":"        self.mech_driver._nb_ovn \u003d None"},{"line_number":138,"context_line":"        self.mech_driver._sb_ovn \u003d None"},{"line_number":139,"context_line":"        self.l3_plugin._nb_ovn \u003d None"},{"line_number":140,"context_line":"        self.monitor_idl_con \u003d None"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        self._start_ovsdb_server_and_idls()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1aa78d24_c16be4b7","side":"PARENT","line":139,"updated":"2016-07-12 02:18:33.000000000","message":"Nit: Is this change related or should it be separate?","commit_id":"b8f530536c642f8a2a6b4d369243711fa5648f37"},{"author":{"_account_id":17595,"name":"Amitabha Biswas","email":"azbiswas@gmail.com","username":"azbiswas"},"change_message_id":"01f702f00fc607422138eac457b364281cbccfde","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        impl_idl_ovn.OvsdbSbOvnIdl.ovsdb_connection \u003d None"},{"line_number":137,"context_line":"        self.mech_driver._nb_ovn \u003d None"},{"line_number":138,"context_line":"        self.mech_driver._sb_ovn \u003d None"},{"line_number":139,"context_line":"        self.l3_plugin._nb_ovn \u003d None"},{"line_number":140,"context_line":"        self.monitor_idl_con \u003d None"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        self._start_ovsdb_server_and_idls()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1aa78d24_a2e976b9","side":"PARENT","line":139,"in_reply_to":"1aa78d24_c16be4b7","updated":"2016-07-12 04:28:16.000000000","message":"It is related, the l3 plugin now has _nb_ovn_idl and _sb_ovn_idl.","commit_id":"b8f530536c642f8a2a6b4d369243711fa5648f37"}]}
