)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9fea3645fc6536c4a992225393d0ce494a573939","unresolved":false,"context_lines":[{"line_number":17,"context_line":"health check functionality should be enabled. Requires allowed ICMP"},{"line_number":18,"context_line":"ECHO_REQUEST because of that by default disabled."},{"line_number":19,"context_line":"Added a new parameter to \u0027l3_agent.ini\u0027 named"},{"line_number":20,"context_line":"\u0027ha_vrrp_health_check_interval\u0027 which will determine the VRRP health check interval"},{"line_number":21,"context_line":"in seconds."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3afc51ec_03d4101e","line":20,"updated":"2016-03-14 06:29:01.000000000","message":"have you consider adding the ability to use notify scripts too?","commit_id":"2dc75dbeb6706e66e3c9f81391f612f4fe689836"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"f79cf4e7e8b6119c1201141230567f71666fe269","unresolved":false,"context_lines":[{"line_number":17,"context_line":"health check functionality should be enabled. Requires allowed ICMP"},{"line_number":18,"context_line":"ECHO_REQUEST because of that by default disabled."},{"line_number":19,"context_line":"Added a new parameter to \u0027l3_agent.ini\u0027 named"},{"line_number":20,"context_line":"\u0027ha_vrrp_health_check_interval\u0027 which will determine the VRRP health check interval"},{"line_number":21,"context_line":"in seconds."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3afc51ec_37d7adc0","line":20,"in_reply_to":"3afc51ec_03d4101e","updated":"2016-03-14 14:58:54.000000000","message":"No I didn\u0027t. May you write something more about what exactly you\u0027re think?","commit_id":"2dc75dbeb6706e66e3c9f81391f612f4fe689836"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fba65ae617c63963817cb6ec0b20fa1e8c56f936","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"},{"line_number":24,"context_line":"Closes-Bug: #1365461"},{"line_number":25,"context_line":"Closes-Bug: #1375625"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3afc51ec_a11edf60","line":25,"updated":"2016-03-14 14:13:39.000000000","message":"how is this patch fixing this last bug? I don\u0027t see the relationship","commit_id":"2dc75dbeb6706e66e3c9f81391f612f4fe689836"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"f79cf4e7e8b6119c1201141230567f71666fe269","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"},{"line_number":24,"context_line":"Closes-Bug: #1365461"},{"line_number":25,"context_line":"Closes-Bug: #1375625"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3afc51ec_9759615d","line":25,"in_reply_to":"3afc51ec_a11edf60","updated":"2016-03-14 14:58:54.000000000","message":"I miss read the interface configurtion. It\u0027s true that in current version it\u0027s not solving that issue.","commit_id":"2dc75dbeb6706e66e3c9f81391f612f4fe689836"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"504a93d3f1dbe2ca754695895e094ffbdfa4a1ac","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lubosz Kosnik \u003cdiltram@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-03-14 14:58:09 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support for Keepalived VRRP health check"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds functionality to generate bash script which verify health of current"},{"line_number":10,"context_line":"keepalived instance by pinging all available in configuration GW addresess."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"ba0121b8_485a6f2b","line":7,"updated":"2016-03-30 15:00:58.000000000","message":"This patch is missing a functional test. Especially in light of John\u0027s comments... I was wondering how this was passing CI, and then I noticed that we only have unit tests.\n\nTake a look at neutron.tests.functional.agent.l3.test_ha_router.\n\nYou can make sure the HA router has connectivity to the default gateway of its external network, assert that the router transitioned to master, then disconnect connectivity to that IP (For example delete it), then assert that the router transitions to FAIL mode.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"677eb695519fae32d589bad6b3a579625654fd7b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"in seconds."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"},{"line_number":24,"context_line":"Closes-Bug: #1365461"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"3afc51ec_96f4a387","line":24,"updated":"2016-03-15 03:54:35.000000000","message":"I noticed you dropped a fix for the bug 1375625. Do you intend to piggyback on the solution proposed here to come up with a solution?","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8e1f6c33a55c1fb21783697d8c09fa611d1402a2","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"},{"line_number":24,"context_line":"Closes-Bug: #1365461"},{"line_number":25,"context_line":"Closes-Bug: #1375625"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5a18252c_e93c6631","line":25,"updated":"2016-04-12 21:51:25.000000000","message":"this patch as is doesn\u0027t fix this second bug, and I would advise to split the fix regardless.","commit_id":"afdd42abc4b513fe024e233e20d57de88f4a2f6f"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"23859589b340eeaeba923ce7a0bf09207a1b733c","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"},{"line_number":24,"context_line":"Closes-Bug: #1365461"},{"line_number":25,"context_line":"Closes-Bug: #1375625"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5a18252c_dea487a7","line":25,"in_reply_to":"5a18252c_e93c6631","updated":"2016-04-13 19:28:34.000000000","message":"Done","commit_id":"afdd42abc4b513fe024e233e20d57de88f4a2f6f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b8f393e38d793eee1ca2d0327623ac46c49f3fbd","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Added a new parameter to \u0027l3_agent.ini\u0027 named"},{"line_number":20,"context_line":"\u0027ha_vrrp_health_check_interval\u0027 which will determine the VRRP health check"},{"line_number":21,"context_line":"interval in seconds."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"},{"line_number":24,"context_line":"Closes-Bug: #1365461"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"1a122d0e_0d0bf27d","line":22,"updated":"2016-04-21 09:53:47.000000000","message":"Please add a release note","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"0bd53f2ef3f41fae53637a4b642ea8bc1138afd8","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Added a new parameter to \u0027l3_agent.ini\u0027 named"},{"line_number":20,"context_line":"\u0027ha_vrrp_health_check_interval\u0027 which will determine the VRRP health check"},{"line_number":21,"context_line":"interval in seconds."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ib4d0691f432830357ea3f113036719645bc59a62"},{"line_number":24,"context_line":"Closes-Bug: #1365461"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"1a122d0e_84c4b492","line":22,"in_reply_to":"1a122d0e_0d0bf27d","updated":"2016-04-22 15:52:52.000000000","message":"Done","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"}],"neutron/agent/l3/ha.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0de1f17765633d3909804db1f216d4dc1d952d54","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_advert_int\u0027,"},{"line_number":46,"context_line":"               default\u003d2,"},{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_health_check_gateway\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027The VRRP healt check thru pinging GW - require \u0027"},{"line_number":51,"context_line":"                      \u0027ICMP ECHO_REQUEST to be enabled\u0027)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_dcffa7ff","line":48,"updated":"2016-01-28 16:22:47.000000000","message":"Should this be ha_vrrp_health_check_gateway ?","commit_id":"3479e46e5e898b9af9adbef0b73a276bbf48e1a3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"bca72413c1c643c2bf44b0031ec9bd2acb94cc98","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_advert_int\u0027,"},{"line_number":46,"context_line":"               default\u003d2,"},{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_health_check_gateway\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027The VRRP healt check thru pinging GW - require \u0027"},{"line_number":51,"context_line":"                      \u0027ICMP ECHO_REQUEST to be enabled\u0027)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_01ed198e","line":48,"in_reply_to":"7a5de9d1_dcffa7ff","updated":"2016-02-02 12:43:55.000000000","message":"Done","commit_id":"3479e46e5e898b9af9adbef0b73a276bbf48e1a3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0de1f17765633d3909804db1f216d4dc1d952d54","unresolved":false,"context_lines":[{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_health_check_gateway\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027The VRRP healt check thru pinging GW - require \u0027"},{"line_number":51,"context_line":"                      \u0027ICMP ECHO_REQUEST to be enabled\u0027)),"},{"line_number":52,"context_line":"    cfg.IntOpt(\u0027ha_health_check_interval\u0027,"},{"line_number":53,"context_line":"               default\u003d5,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_7a30f601","line":50,"updated":"2016-01-28 16:22:47.000000000","message":"My attempt at a rewrite:\n\n\"Enable VRRP health checks. This will cause pings to be sent to the virtual gateway IP address(es) - requires ICMP_ECHO_REQUEST to be enabled.\"\n\nProbably need some more info on exactly where ECHO\u0027s need to be enabled - a setting on the router?","commit_id":"3479e46e5e898b9af9adbef0b73a276bbf48e1a3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"bca72413c1c643c2bf44b0031ec9bd2acb94cc98","unresolved":false,"context_lines":[{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_health_check_gateway\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027The VRRP healt check thru pinging GW - require \u0027"},{"line_number":51,"context_line":"                      \u0027ICMP ECHO_REQUEST to be enabled\u0027)),"},{"line_number":52,"context_line":"    cfg.IntOpt(\u0027ha_health_check_interval\u0027,"},{"line_number":53,"context_line":"               default\u003d5,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_21f29570","line":50,"in_reply_to":"7a5de9d1_7a30f601","updated":"2016-02-02 12:43:55.000000000","message":"Done","commit_id":"3479e46e5e898b9af9adbef0b73a276bbf48e1a3"},{"author":{"_account_id":15130,"name":"Sonu","email":"sonu.sudhakaran@gmail.com","username":"sonu"},"change_message_id":"65005b4214e2e11ac959a15025fe9bbd66454a0c","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_advert_int\u0027,"},{"line_number":46,"context_line":"               default\u003d2,"},{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check_gateway\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027Enable VRRP health checks. This will cause pings to be \u0027"},{"line_number":51,"context_line":"                      \u0027sent to the virtual gateway IP address(es) - requires \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"dae33548_058fb275","line":48,"range":{"start_line":48,"start_character":17,"end_line":48,"end_character":45},"updated":"2016-02-17 04:24:52.000000000","message":"Do we have a better name for the conf, ha_vrrp_health_check seems better to me, since, it just enables health checking.\nHow we do the health check is by pinging gateway, but that need not come in the name of the conf. It gets confusing.","commit_id":"e2196b92a7ce5f9dd3866d683a376426db522a1d"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"ff2c9e47b3b65a59faaebd40b7bf4a9fae1fb25e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_advert_int\u0027,"},{"line_number":46,"context_line":"               default\u003d2,"},{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check_gateway\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027Enable VRRP health checks. This will cause pings to be \u0027"},{"line_number":51,"context_line":"                      \u0027sent to the virtual gateway IP address(es) - requires \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5aef4532_2245b16f","line":48,"range":{"start_line":48,"start_character":17,"end_line":48,"end_character":45},"in_reply_to":"dae33548_058fb275","updated":"2016-03-08 19:35:54.000000000","message":"Done","commit_id":"e2196b92a7ce5f9dd3866d683a376426db522a1d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9fea3645fc6536c4a992225393d0ce494a573939","unresolved":false,"context_lines":[{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027Enable VRRP health checks. This will cause pings to be \u0027"},{"line_number":51,"context_line":"                      \u0027sent to the virtual gateway IP address(es) - requires \u0027"},{"line_number":52,"context_line":"                      \u0027ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3afc51ec_8314a044","line":50,"updated":"2016-03-14 06:29:01.000000000","message":"I am not sure how extensively this was discussed in the past so apologies if I bring this up for discussion now. But have you considered devising a way to allow operators to bring their own check script? Perhaps this is not feasible by the VRRP framework? In other words I can see that later on we\u0027d want to extend/modify the check to beyond simple pings to virtual gateway IPs and what happens then?","commit_id":"2dc75dbeb6706e66e3c9f81391f612f4fe689836"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"f79cf4e7e8b6119c1201141230567f71666fe269","unresolved":false,"context_lines":[{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027Enable VRRP health checks. This will cause pings to be \u0027"},{"line_number":51,"context_line":"                      \u0027sent to the virtual gateway IP address(es) - requires \u0027"},{"line_number":52,"context_line":"                      \u0027ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3afc51ec_b22f4b3d","line":50,"in_reply_to":"3afc51ec_8314a044","updated":"2016-03-14 14:58:54.000000000","message":"There was idea like that but there was a problem that this script must me configured to work with exact VRRP instance - there may be multiple routers running on same machine.\nBecause of that after stabilizing that solution I was thinking about giving a operator possibility to upload his own scripts with variables which will be later evaluated.","commit_id":"2dc75dbeb6706e66e3c9f81391f612f4fe689836"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"12225ea3c8b6876d1127729fe8e6154913ee9162","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                      \u0027ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":54,"context_line":"               default\u003d5,"},{"line_number":55,"context_line":"               help\u003d_(\u0027The VRRP health check interval in seconds\u0027)),"},{"line_number":56,"context_line":"]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a122d0e_83760fa2","line":55,"updated":"2016-04-19 21:55:57.000000000","message":"Consistency nit: missing period at end of sentence. Probably not worth a new patch, but if you to push another.","commit_id":"2d10763c8d1be01372f0120102b9735f665d3ce9"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"f3f8e862975d75534de02ce1e8515cdd98b1cbfc","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                      \u0027ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":54,"context_line":"               default\u003d5,"},{"line_number":55,"context_line":"               help\u003d_(\u0027The VRRP health check interval in seconds\u0027)),"},{"line_number":56,"context_line":"]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a122d0e_032491c2","line":55,"updated":"2016-04-20 15:02:27.000000000","message":"Still missing the period at the end of the help text sentence : )","commit_id":"0df514928b07d1baabe217a9b1297049c28cca72"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"cb65176de717e53f0050259e8a2b71ebddaf1e0a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                      \u0027ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":54,"context_line":"               default\u003d5,"},{"line_number":55,"context_line":"               help\u003d_(\u0027The VRRP health check interval in seconds\u0027)),"},{"line_number":56,"context_line":"]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a122d0e_e05ce61a","line":55,"in_reply_to":"1a122d0e_032491c2","updated":"2016-04-20 15:43:58.000000000","message":"Done","commit_id":"0df514928b07d1baabe217a9b1297049c28cca72"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b8f393e38d793eee1ca2d0327623ac46c49f3fbd","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_advert_int\u0027,"},{"line_number":46,"context_line":"               default\u003d2,"},{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check_gateway\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027Enable VRRP health checks. This will cause pings to be \u0027"},{"line_number":51,"context_line":"                      \u0027sent to the virtual gateway IP address(es) - requires \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_2dcfce56","line":48,"updated":"2016-04-21 09:53:47.000000000","message":"alignment","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"0bd53f2ef3f41fae53637a4b642ea8bc1138afd8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_advert_int\u0027,"},{"line_number":46,"context_line":"               default\u003d2,"},{"line_number":47,"context_line":"               help\u003d_(\u0027The advertisement interval in seconds\u0027)),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check_gateway\u0027,"},{"line_number":49,"context_line":"               default\u003dFalse,"},{"line_number":50,"context_line":"               help\u003d_(\u0027Enable VRRP health checks. This will cause pings to be \u0027"},{"line_number":51,"context_line":"                      \u0027sent to the virtual gateway IP address(es) - requires \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_b27cc9ec","line":48,"in_reply_to":"1a122d0e_2dcfce56","updated":"2016-04-22 15:52:52.000000000","message":"Done","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check_gateway\u0027,"},{"line_number":49,"context_line":"                default\u003dFalse,"},{"line_number":50,"context_line":"                help\u003d_(\u0027Enable VRRP health checks. This will cause pings to be\u0027"},{"line_number":51,"context_line":"                       \u0027 sent to the virtual gateway IP address(es) - requires\u0027"},{"line_number":52,"context_line":"                       \u0027 ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":54,"context_line":"               default\u003d5,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_9f97bc8f","line":51,"updated":"2016-06-22 19:03:26.000000000","message":"nit: please put the spaces at the end of the previous lines","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                default\u003dFalse,"},{"line_number":50,"context_line":"                help\u003d_(\u0027Enable VRRP health checks. This will cause pings to be\u0027"},{"line_number":51,"context_line":"                       \u0027 sent to the virtual gateway IP address(es) - requires\u0027"},{"line_number":52,"context_line":"                       \u0027 ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":54,"context_line":"               default\u003d5,"},{"line_number":55,"context_line":"               help\u003d_(\u0027The VRRP health check interval in seconds.\u0027)),"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_1f9c6cbf","line":52,"updated":"2016-06-22 19:03:26.000000000","message":"s/gateway/the gateway\n\nAnd what exactly does this mean?  ICMP must be allowed in iptables?  That should be described in the documentation somewhere.","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bccb630c73d6c46cb66e70b6e9d8ac6a9bbaeedf","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                       \u0027 sent to the virtual gateway IP address(es) - requires\u0027"},{"line_number":52,"context_line":"                       \u0027 ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":54,"context_line":"               default\u003d5,"},{"line_number":55,"context_line":"               help\u003d_(\u0027The VRRP health check interval in seconds.\u0027)),"},{"line_number":56,"context_line":"]"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_2ad2d3d2","line":54,"range":{"start_line":54,"start_character":15,"end_line":54,"end_character":24},"updated":"2016-06-22 15:07:31.000000000","message":"Was there some testing behind 5 seconds? How was it decided that it is optimal?","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"1ba8fe63d0726273656e4bb0f311774167f651f3","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                       \u0027 sent to the virtual gateway IP address(es) - requires\u0027"},{"line_number":52,"context_line":"                       \u0027 ICMP_ECHO_REQUEST to be enabled on gateway.\u0027)),"},{"line_number":53,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":54,"context_line":"               default\u003d5,"},{"line_number":55,"context_line":"               help\u003d_(\u0027The VRRP health check interval in seconds.\u0027)),"},{"line_number":56,"context_line":"]"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_1eaf5595","line":54,"range":{"start_line":54,"start_character":15,"end_line":54,"end_character":24},"in_reply_to":"3aaa91ec_2ad2d3d2","updated":"2016-06-22 16:04:25.000000000","message":"All information which I found on internet are talking about 5 second. We can decrease that value but we will dramatically increase amount of ICMPs send to network","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"}],"neutron/agent/l3/ha_router.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9112668c418ecc585f47b503279bacd61da22d44","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                                        self.agent_conf.ha_vrrp_auth_password)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        if self.agent_conf.ha_vrrp_health_check:"},{"line_number":121,"context_line":"            track_script \u003d keepalived.KeepalivedTrackScript("},{"line_number":122,"context_line":"                self.agent_conf.ha_vrrp_health_check_interval,"},{"line_number":123,"context_line":"                self.keepalived_manager.get_conf_dir(),"},{"line_number":124,"context_line":"                instance.vrouter_id)"},{"line_number":125,"context_line":"            instance.track_script \u003d track_script"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        config.add_instance(instance)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba0121b8_42c1ca2d","line":125,"range":{"start_line":121,"start_character":27,"end_line":125,"end_character":48},"updated":"2016-03-30 09:47:04.000000000","message":"I would much prefer if this was placed inside the constructor of KeepaliveedInstance. I was expecting the initialization of this variable to be in neutron/agent/linux/keepalived.py and since it wasn\u0027t I had to do a recursive grep of the entire project to see where it was :(\n\nPlease add the \u0027ha_vrrp_health_check_interval\u0027 and \u0027conf_dir\u0027 to the KeepalivedInstace\u0027s constructor so that it may create it itself.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"d09025fb4b69ac347fa0668702e874cdece46597","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                                        self.agent_conf.ha_vrrp_auth_password)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        if self.agent_conf.ha_vrrp_health_check:"},{"line_number":121,"context_line":"            track_script \u003d keepalived.KeepalivedTrackScript("},{"line_number":122,"context_line":"                self.agent_conf.ha_vrrp_health_check_interval,"},{"line_number":123,"context_line":"                self.keepalived_manager.get_conf_dir(),"},{"line_number":124,"context_line":"                instance.vrouter_id)"},{"line_number":125,"context_line":"            instance.track_script \u003d track_script"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        config.add_instance(instance)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_4bcbb353","line":125,"range":{"start_line":121,"start_character":27,"end_line":125,"end_character":48},"in_reply_to":"ba0121b8_42c1ca2d","updated":"2016-04-06 18:38:42.000000000","message":"Done","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"20456b77c8b6d3dca43eb95bbcedc204473cc5ed","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        interface_name \u003d self.get_ha_device_name()"},{"line_number":102,"context_line":"        subnets \u003d self.ha_port.get(\u0027subnets\u0027, [])"},{"line_number":103,"context_line":"        conf \u003d self.agent_conf"},{"line_number":104,"context_line":"        ha_port_cidrs \u003d [subnet[\u0027cidr\u0027] for subnet in subnets]"},{"line_number":105,"context_line":"        instance \u003d keepalived.KeepalivedInstance("},{"line_number":106,"context_line":"            \u0027BACKUP\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_2865731d","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":30},"updated":"2016-04-14 05:52:41.000000000","message":"nit: the var \"conf\" here looks like a way to shorten line 113~114. Can the parameter \"ha_vrrp_health_check_gateway\" be changed to a shorter name to avoid use this var here. I bring this out, because the agent configuration is read from \"self.ageng_conf\" in other places in this file.","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"73fe6dbb49735d1b161bc04d7720482ba4b37c9a","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        interface_name \u003d self.get_ha_device_name()"},{"line_number":102,"context_line":"        subnets \u003d self.ha_port.get(\u0027subnets\u0027, [])"},{"line_number":103,"context_line":"        conf \u003d self.agent_conf"},{"line_number":104,"context_line":"        ha_port_cidrs \u003d [subnet[\u0027cidr\u0027] for subnet in subnets]"},{"line_number":105,"context_line":"        instance \u003d keepalived.KeepalivedInstance("},{"line_number":106,"context_line":"            \u0027BACKUP\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_0124a95d","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":30},"in_reply_to":"5a18252c_2865731d","updated":"2016-04-14 16:49:47.000000000","message":"Done","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0233d5299ce52d256911d4fceb269c7fede5730c","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            advert_int\u003dself.agent_conf.ha_vrrp_advert_int,"},{"line_number":111,"context_line":"            priority\u003dself.ha_priority,"},{"line_number":112,"context_line":"            vrrp_health_check\u003dself.agent_conf.ha_vrrp_health_check_gateway,"},{"line_number":113,"context_line":"            vrrp_check_int\u003dself.agent_conf.ha_vrrp_health_check_interval,"},{"line_number":114,"context_line":"            ha_conf_dir\u003dself.keepalived_manager.get_conf_dir())"},{"line_number":115,"context_line":"        instance.track_interfaces.append(interface_name)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_fefbba78","line":113,"range":{"start_line":113,"start_character":12,"end_line":113,"end_character":26},"updated":"2016-04-29 19:54:55.000000000","message":"This suggest \u0027vrrp_check_int\u0027 is an integer. Please rename to \u0027vrrp_check_interval\u0027.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"830a80eed2838743bf5e397e2c63cf09532bb538","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            advert_int\u003dself.agent_conf.ha_vrrp_advert_int,"},{"line_number":111,"context_line":"            priority\u003dself.ha_priority,"},{"line_number":112,"context_line":"            vrrp_health_check\u003dself.agent_conf.ha_vrrp_health_check_gateway,"},{"line_number":113,"context_line":"            vrrp_check_int\u003dself.agent_conf.ha_vrrp_health_check_interval,"},{"line_number":114,"context_line":"            ha_conf_dir\u003dself.keepalived_manager.get_conf_dir())"},{"line_number":115,"context_line":"        instance.track_interfaces.append(interface_name)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_538f3823","line":113,"range":{"start_line":113,"start_character":12,"end_line":113,"end_character":26},"in_reply_to":"1a122d0e_72392da3","updated":"2016-05-06 14:32:40.000000000","message":"Done","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bd193f7158265b6f1ac46fdc20841b7ddd13462b","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            advert_int\u003dself.agent_conf.ha_vrrp_advert_int,"},{"line_number":111,"context_line":"            priority\u003dself.ha_priority,"},{"line_number":112,"context_line":"            vrrp_health_check\u003dself.agent_conf.ha_vrrp_health_check_gateway,"},{"line_number":113,"context_line":"            vrrp_check_int\u003dself.agent_conf.ha_vrrp_health_check_interval,"},{"line_number":114,"context_line":"            ha_conf_dir\u003dself.keepalived_manager.get_conf_dir())"},{"line_number":115,"context_line":"        instance.track_interfaces.append(interface_name)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_72392da3","line":113,"range":{"start_line":113,"start_character":12,"end_line":113,"end_character":26},"in_reply_to":"1a122d0e_fefbba78","updated":"2016-05-06 10:57:40.000000000","message":"+1","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"}],"neutron/agent/linux/keepalived.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0de1f17765633d3909804db1f216d4dc1d952d54","unresolved":false,"context_lines":[{"line_number":33,"context_line":"FIP_LL_SUBNET \u003d \u0027169.254.30.0/23\u0027"},{"line_number":34,"context_line":"KEEPALIVED_SERVICE_NAME \u003d \u0027keepalived\u0027"},{"line_number":35,"context_line":"GARP_MASTER_DELAY \u003d 60"},{"line_number":36,"context_line":"HEALTH_CHECK_NAME \u003d \u0027chk_script\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_1fc5313b","line":36,"updated":"2016-01-28 16:22:47.000000000","message":"nit: better name ?","commit_id":"3479e46e5e898b9af9adbef0b73a276bbf48e1a3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"bca72413c1c643c2bf44b0031ec9bd2acb94cc98","unresolved":false,"context_lines":[{"line_number":33,"context_line":"FIP_LL_SUBNET \u003d \u0027169.254.30.0/23\u0027"},{"line_number":34,"context_line":"KEEPALIVED_SERVICE_NAME \u003d \u0027keepalived\u0027"},{"line_number":35,"context_line":"GARP_MASTER_DELAY \u003d 60"},{"line_number":36,"context_line":"HEALTH_CHECK_NAME \u003d \u0027chk_script\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_41fb1148","line":36,"in_reply_to":"7a5de9d1_1fc5313b","updated":"2016-02-02 12:43:55.000000000","message":"Done","commit_id":"3479e46e5e898b9af9adbef0b73a276bbf48e1a3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0de1f17765633d3909804db1f216d4dc1d952d54","unresolved":false,"context_lines":[{"line_number":487,"context_line":"            6: \u0027ping6\u0027,"},{"line_number":488,"context_line":"        }.get(netaddr.IPAddress(ip_addr).version)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        return \u0027%s -c 1 %s 1\u003e/dev/null || return 1\u0027 % (cmd, ip_addr)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    def get_config_str(self):"},{"line_number":493,"context_line":"        \"\"\"Generates and returns track_script section of Keepalived"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_dc4a4783","line":490,"updated":"2016-01-28 16:22:47.000000000","message":"Should add -n to avoid DNS lookups\nShould also think about adding a \u0027-w 1\u0027 else ping could take up to 3 seconds to complete when the gateway is unreachable (3 ARP probes)","commit_id":"3479e46e5e898b9af9adbef0b73a276bbf48e1a3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"bca72413c1c643c2bf44b0031ec9bd2acb94cc98","unresolved":false,"context_lines":[{"line_number":487,"context_line":"            6: \u0027ping6\u0027,"},{"line_number":488,"context_line":"        }.get(netaddr.IPAddress(ip_addr).version)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        return \u0027%s -c 1 %s 1\u003e/dev/null || return 1\u0027 % (cmd, ip_addr)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    def get_config_str(self):"},{"line_number":493,"context_line":"        \"\"\"Generates and returns track_script section of Keepalived"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_e1a23d4b","line":490,"in_reply_to":"7a5de9d1_dc4a4783","updated":"2016-02-02 12:43:55.000000000","message":"Done","commit_id":"3479e46e5e898b9af9adbef0b73a276bbf48e1a3"},{"author":{"_account_id":15130,"name":"Sonu","email":"sonu.sudhakaran@gmail.com","username":"sonu"},"change_message_id":"009bf0a0f081e440555b691079a510248a8f2def","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3afc51ec_dfd51fba","updated":"2016-03-11 11:15:04.000000000","message":"In general, how would a router in FAULT state recover? say, if the gateway starts pinging after sometime, does the router move to BACKUP state automatically?","commit_id":"a79f50c07a83bd1db2f76f4bb8f94c386d035a82"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"0d2ddcee46d4bf2651e2c38f919b8b7fdaaa74f0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3afc51ec_3dfeb96b","in_reply_to":"3afc51ec_dfd51fba","updated":"2016-03-11 17:12:55.000000000","message":"That solution for now is a little tricky. If there will be lost connectivity to GW it will go to FAULT state and move the active state to other router. After losing the FIP it will move automatically to BACKUP state because the first if in bash script.\nFor now it\u0027s any possible solution. We need to think about improving that solution in future by giving a possibility to assign multiple IP\u0027s to routers to give a chance to check connectivity to GW all the time but I would like to implement it in future with other improvements to that functionality","commit_id":"a79f50c07a83bd1db2f76f4bb8f94c386d035a82"},{"author":{"_account_id":15130,"name":"Sonu","email":"sonu.sudhakaran@gmail.com","username":"sonu"},"change_message_id":"009bf0a0f081e440555b691079a510248a8f2def","unresolved":false,"context_lines":[{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        return \u0027%s -c 1 -w 1 -n %s 1\u003e/dev/null || exit 1\u0027 % (cmd, ip_addr)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def _check_ip_assigned(self):"},{"line_number":503,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"},{"line_number":504,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":505,"context_line":"            self.vips) else \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_9f64374a","line":502,"range":{"start_line":502,"start_character":8,"end_line":502,"end_character":26},"updated":"2016-03-11 11:15:04.000000000","message":"Why is this needed? Running the script on a stand-by node would make the router go into FAULT state, since it would return \u00270\u0027.","commit_id":"a79f50c07a83bd1db2f76f4bb8f94c386d035a82"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"0d2ddcee46d4bf2651e2c38f919b8b7fdaaa74f0","unresolved":false,"context_lines":[{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        return \u0027%s -c 1 -w 1 -n %s 1\u003e/dev/null || exit 1\u0027 % (cmd, ip_addr)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def _check_ip_assigned(self):"},{"line_number":503,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"},{"line_number":504,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":505,"context_line":"            self.vips) else \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_3d0cf993","line":502,"range":{"start_line":502,"start_character":8,"end_line":502,"end_character":26},"in_reply_to":"3afc51ec_9f64374a","updated":"2016-03-11 17:12:55.000000000","message":"No - if script gonna return 0 it meas \u0027OK\u0027. So it will be moved into BACKUP state","commit_id":"a79f50c07a83bd1db2f76f4bb8f94c386d035a82"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9fea3645fc6536c4a992225393d0ce494a573939","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def _get_script_location(self):"},{"line_number":523,"context_line":"        return os.path.join(self.conf_dir,"},{"line_number":524,"context_line":"                            \u0027ha_check_script_%s.sh\u0027 % self.vr_id)"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"    def write_check_script(self):"},{"line_number":527,"context_line":"        common_utils.replace_file("}],"source_content_type":"text/x-python","patch_set":9,"id":"3afc51ec_2345cc16","line":524,"updated":"2016-03-14 06:29:01.000000000","message":"what about we introduced an extra level of indirection here and assumed that ha_check_script_%s.sh be an out-of-band script that takes the parameters needed to execute its own defined check? That in itself could be calling out more checks if required. That would introduce a level of flexibility that I see ourselves needing when considering fault detection scenarios.","commit_id":"2dc75dbeb6706e66e3c9f81391f612f4fe689836"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fe8b8bbd9cbe3371b336244203baf655d5a375cd","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def _get_script_location(self):"},{"line_number":523,"context_line":"        return os.path.join(self.conf_dir,"},{"line_number":524,"context_line":"                            \u0027ha_check_script_%s.sh\u0027 % self.vr_id)"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"    def write_check_script(self):"},{"line_number":527,"context_line":"        common_utils.replace_file("}],"source_content_type":"text/x-python","patch_set":9,"id":"3afc51ec_0ccb95a6","line":524,"in_reply_to":"3afc51ec_2345cc16","updated":"2016-03-14 11:50:10.000000000","message":"On second thought, that would open up quite a huge security hole, oh well never mind.","commit_id":"2dc75dbeb6706e66e3c9f81391f612f4fe689836"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9112668c418ecc585f47b503279bacd61da22d44","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                       \u0027    garp_master_delay %s\u0027 % self.garp_master_delay])"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        if self.track_script:"},{"line_number":283,"context_line":"            self.track_script.routes \u003d self.virtual_routes.gateway_routes"},{"line_number":284,"context_line":"            self.track_script.vips \u003d self.vips"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if self.nopreempt:"},{"line_number":287,"context_line":"            config.append(\u0027    nopreempt\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba0121b8_a22d4648","line":284,"range":{"start_line":283,"start_character":12,"end_line":284,"end_character":46},"updated":"2016-03-30 09:47:04.000000000","message":"These can be moved to the \u0027if\u0027 block of line 270.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"d09025fb4b69ac347fa0668702e874cdece46597","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                       \u0027    garp_master_delay %s\u0027 % self.garp_master_delay])"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        if self.track_script:"},{"line_number":283,"context_line":"            self.track_script.routes \u003d self.virtual_routes.gateway_routes"},{"line_number":284,"context_line":"            self.track_script.vips \u003d self.vips"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if self.nopreempt:"},{"line_number":287,"context_line":"            config.append(\u0027    nopreempt\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_fc09e6de","line":284,"range":{"start_line":283,"start_character":12,"end_line":284,"end_character":46},"in_reply_to":"ba0121b8_a22d4648","updated":"2016-04-06 18:38:42.000000000","message":"Done","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9112668c418ecc585f47b503279bacd61da22d44","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                                      service_name\u003dKEEPALIVED_SERVICE_NAME,"},{"line_number":407,"context_line":"                                      monitored_process\u003dkeepalived_pm)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        if self.config.instances.get(1).track_script:"},{"line_number":410,"context_line":"            self.config.instances.get(1).track_script.write_check_script()"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        LOG.debug(\u0027Keepalived spawned with config %s\u0027, config_path)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba0121b8_c2167a54","line":409,"range":{"start_line":409,"start_character":37,"end_line":409,"end_character":38},"updated":"2016-03-30 09:47:04.000000000","message":"Assuming that the vrouter_id\u003d1 is wrong since [1] can allocate other IDs.\n\n[1]: https://github.com/openstack/neutron/blob/fc1db4690f572f889e5bda6e9dfc1d44ba1fa1ae/neutron/db/l3_hamode_db.py#L203","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"1b7e44b8fcb89fcf2901dfb6a3911f757fa60695","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                                      service_name\u003dKEEPALIVED_SERVICE_NAME,"},{"line_number":407,"context_line":"                                      monitored_process\u003dkeepalived_pm)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        if self.config.instances.get(1).track_script:"},{"line_number":410,"context_line":"            self.config.instances.get(1).track_script.write_check_script()"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        LOG.debug(\u0027Keepalived spawned with config %s\u0027, config_path)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a18252c_fec4e35f","line":409,"range":{"start_line":409,"start_character":37,"end_line":409,"end_character":38},"in_reply_to":"5a18252c_342180b5","updated":"2016-04-13 19:28:27.000000000","message":"I never said that this is not a dict. I\u0027m only saying that self.config.instances.get(1) means take the first instance from config not take a instance with ID \u003d 1.\nLike I said I changed in my tests the ID from 1 to 2 and you will see that still everything is working OK.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"907a36e18d575b008b6fcaf5ac0abe35cb89139a","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                                      service_name\u003dKEEPALIVED_SERVICE_NAME,"},{"line_number":407,"context_line":"                                      monitored_process\u003dkeepalived_pm)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        if self.config.instances.get(1).track_script:"},{"line_number":410,"context_line":"            self.config.instances.get(1).track_script.write_check_script()"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        LOG.debug(\u0027Keepalived spawned with config %s\u0027, config_path)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a18252c_b8c6fe46","line":409,"range":{"start_line":409,"start_character":37,"end_line":409,"end_character":38},"in_reply_to":"5a18252c_492a7f7f","updated":"2016-04-13 20:34:35.000000000","message":"You\u0027re right about that ID\u0027s. I thought that it only is used to iterate over instances not to that. Sorry for that.\nAbout testing this code. This specific method is tested in functional tests. When you put pdb statement in code and run functional you will see that they was run. This method is changing the environment so it not suppose to be tested by unittests. In that specific situation you\u0027re registering process monitors and create track scripts on local storage.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f100968ca35666e0524272c4c70e6a7c204a0a33","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                                      service_name\u003dKEEPALIVED_SERVICE_NAME,"},{"line_number":407,"context_line":"                                      monitored_process\u003dkeepalived_pm)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        if self.config.instances.get(1).track_script:"},{"line_number":410,"context_line":"            self.config.instances.get(1).track_script.write_check_script()"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        LOG.debug(\u0027Keepalived spawned with config %s\u0027, config_path)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a18252c_492a7f7f","line":409,"range":{"start_line":409,"start_character":37,"end_line":409,"end_character":38},"in_reply_to":"5a18252c_fec4e35f","updated":"2016-04-13 19:54:13.000000000","message":"This code is never ran by the tests that you wrote (so any change you made in later patchsets didn\u0027t check what you wanted to check). I\u0027ve put a pdb.set_trace() and this code is never triggered.\n\nFurthermore, changing the value in [1] to some other value (say, 3), causes the functional tests to crash [2] because the vrouter_id is not found. This is because a python dictionary is not ordered so you can\u0027t \"take the first\".\n\n[1]: https://github.com/openstack/neutron/blob/2a305c563073a3066aac3f07aab3c895ec2cd2fb/neutron/tests/unit/agent/linux/test_keepalived.py#L64\n[2]: http://pastebin.com/XTL4rL2D","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d08227a8358815185bf6cc60c8ed038ede5139f3","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                                      service_name\u003dKEEPALIVED_SERVICE_NAME,"},{"line_number":407,"context_line":"                                      monitored_process\u003dkeepalived_pm)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        if self.config.instances.get(1).track_script:"},{"line_number":410,"context_line":"            self.config.instances.get(1).track_script.write_check_script()"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        LOG.debug(\u0027Keepalived spawned with config %s\u0027, config_path)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a18252c_342180b5","line":409,"range":{"start_line":409,"start_character":37,"end_line":409,"end_character":38},"in_reply_to":"9a061dce_b39d660c","updated":"2016-04-13 10:38:17.000000000","message":"I believe self.config.instances is a dictionary (see line 326). According to [1], this code will most definitely get the instance whose key is vrouter_id (and not the \u0027first instance\u0027).\n\nIf self.config.instances isn\u0027t a dictionary, can you tell what it is?\n\n[1]: https://docs.python.org/2/library/stdtypes.html?highlight\u003ddict#dict.get","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"d09025fb4b69ac347fa0668702e874cdece46597","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                                      service_name\u003dKEEPALIVED_SERVICE_NAME,"},{"line_number":407,"context_line":"                                      monitored_process\u003dkeepalived_pm)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        if self.config.instances.get(1).track_script:"},{"line_number":410,"context_line":"            self.config.instances.get(1).track_script.write_check_script()"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        LOG.debug(\u0027Keepalived spawned with config %s\u0027, config_path)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_b39d660c","line":409,"range":{"start_line":409,"start_character":37,"end_line":409,"end_character":38},"in_reply_to":"ba0121b8_c2167a54","updated":"2016-04-06 18:38:42.000000000","message":"It\u0027s not so true. This 1 means take first instance not instance with vrouter_id\u003d1\nI changed my tests and now you suppose to have a better look into this. In tests vrouter_id I changed to 2.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9112668c418ecc585f47b503279bacd61da22d44","unresolved":false,"context_lines":[{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        return config"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def build_script(self):"},{"line_number":488,"context_line":"        return itertools.chain([\u0027#!/bin/bash -eu\u0027],"},{"line_number":489,"context_line":"                               [\u0027%s\u0027 % self._check_ip_assigned()],"},{"line_number":490,"context_line":"                               (\u0027%s\u0027 % self._add_ip_addr(route.nexthop)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba0121b8_508d107a","line":487,"range":{"start_line":487,"start_character":8,"end_line":487,"end_character":20},"updated":"2016-03-30 09:47:04.000000000","message":"I ran this on my machine. The file was empty bar the \u0027#!/bin/bash -eu\u0027 shebang line. This is due to the fact that _check_ip_assigned returned an empty string (\"\") and self.routes was empty.\n\nI think that in this case we should probably avoid even adding the script_track and only add it when we actually need it.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"d09025fb4b69ac347fa0668702e874cdece46597","unresolved":false,"context_lines":[{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        return config"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def build_script(self):"},{"line_number":488,"context_line":"        return itertools.chain([\u0027#!/bin/bash -eu\u0027],"},{"line_number":489,"context_line":"                               [\u0027%s\u0027 % self._check_ip_assigned()],"},{"line_number":490,"context_line":"                               (\u0027%s\u0027 % self._add_ip_addr(route.nexthop)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_9338223f","line":487,"range":{"start_line":487,"start_character":8,"end_line":487,"end_character":20},"in_reply_to":"ba0121b8_508d107a","updated":"2016-04-06 18:38:42.000000000","message":"Done","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9112668c418ecc585f47b503279bacd61da22d44","unresolved":false,"context_lines":[{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def _check_ip_assigned(self):"},{"line_number":503,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"},{"line_number":504,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":505,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def get_config_str(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba0121b8_10239806","line":504,"range":{"start_line":504,"start_character":39,"end_line":504,"end_character":51},"updated":"2016-03-30 09:47:04.000000000","message":"One router can have more than one vip. Why do you only use one?","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"d09025fb4b69ac347fa0668702e874cdece46597","unresolved":false,"context_lines":[{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def _check_ip_assigned(self):"},{"line_number":503,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"},{"line_number":504,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":505,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def get_config_str(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_02fa7042","line":504,"range":{"start_line":504,"start_character":39,"end_line":504,"end_character":51},"in_reply_to":"ba0121b8_10239806","updated":"2016-04-06 18:38:42.000000000","message":"There is required any of these VIP\u0027s so if there is one configured there will be other. I\u0027m only checking is there is any way to ping GW.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9112668c418ecc585f47b503279bacd61da22d44","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":505,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def get_config_str(self):"},{"line_number":508,"context_line":"        \"\"\"Generates and returns track_script section of Keepalived"},{"line_number":509,"context_line":"        configuration."},{"line_number":510,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba0121b8_a5c8b023","line":507,"range":{"start_line":507,"start_character":8,"end_line":507,"end_character":22},"updated":"2016-03-30 09:47:04.000000000","message":"If this class were to inherit from KeepalivedConf, this function would have been made available for you.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"d09025fb4b69ac347fa0668702e874cdece46597","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":505,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def get_config_str(self):"},{"line_number":508,"context_line":"        \"\"\"Generates and returns track_script section of Keepalived"},{"line_number":509,"context_line":"        configuration."},{"line_number":510,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_c2519864","line":507,"range":{"start_line":507,"start_character":8,"end_line":507,"end_character":22},"in_reply_to":"ba0121b8_a5c8b023","updated":"2016-04-06 18:38:42.000000000","message":"Done","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9112668c418ecc585f47b503279bacd61da22d44","unresolved":false,"context_lines":[{"line_number":525,"context_line":""},{"line_number":526,"context_line":"    def write_check_script(self):"},{"line_number":527,"context_line":"        common_utils.replace_file("},{"line_number":528,"context_line":"            self._get_script_location(), self.get_script_str(), 520)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba0121b8_d05c80ef","line":528,"range":{"start_line":528,"start_character":64,"end_line":528,"end_character":67},"updated":"2016-03-30 09:47:04.000000000","message":"I ran this on my machine. The permissions of the file wasn\u0027t 520 as suggested in line 528 but rather it was 010. This is most likely due to the fact that 520 in decimal !\u003d 520 in octal, which is what the function expects.\nThis should probably be changed to 0o520.","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"d09025fb4b69ac347fa0668702e874cdece46597","unresolved":false,"context_lines":[{"line_number":525,"context_line":""},{"line_number":526,"context_line":"    def write_check_script(self):"},{"line_number":527,"context_line":"        common_utils.replace_file("},{"line_number":528,"context_line":"            self._get_script_location(), self.get_script_str(), 520)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_c26a381a","line":528,"range":{"start_line":528,"start_character":64,"end_line":528,"end_character":67},"in_reply_to":"ba0121b8_d05c80ef","updated":"2016-04-06 18:38:42.000000000","message":"Done","commit_id":"4274fdcf71f9907ce99bda6d4752cbe0fd67d112"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"20456b77c8b6d3dca43eb95bbcedc204473cc5ed","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        self.virtual_routes \u003d KeepalivedInstanceRoutes()"},{"line_number":182,"context_line":"        self.authentication \u003d None"},{"line_number":183,"context_line":"        self.track_script \u003d None"},{"line_number":184,"context_line":"        metadata_cidr \u003d \u0027169.254.169.254/32\u0027"},{"line_number":185,"context_line":"        self.primary_vip_range \u003d get_free_range("},{"line_number":186,"context_line":"            parent_range\u003dconstants.PRIVATE_CIDR_RANGE,"},{"line_number":187,"context_line":"            excluded_ranges\u003d[constants.METADATA_CIDR,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_08519736","line":184,"range":{"start_line":184,"start_character":0,"end_line":184,"end_character":44},"updated":"2016-04-14 05:52:41.000000000","message":"Don\u0027t see where it is used.","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"73fe6dbb49735d1b161bc04d7720482ba4b37c9a","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        self.virtual_routes \u003d KeepalivedInstanceRoutes()"},{"line_number":182,"context_line":"        self.authentication \u003d None"},{"line_number":183,"context_line":"        self.track_script \u003d None"},{"line_number":184,"context_line":"        metadata_cidr \u003d \u0027169.254.169.254/32\u0027"},{"line_number":185,"context_line":"        self.primary_vip_range \u003d get_free_range("},{"line_number":186,"context_line":"            parent_range\u003dconstants.PRIVATE_CIDR_RANGE,"},{"line_number":187,"context_line":"            excluded_ranges\u003d[constants.METADATA_CIDR,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_061e7f5e","line":184,"range":{"start_line":184,"start_character":0,"end_line":184,"end_character":44},"in_reply_to":"5a18252c_08519736","updated":"2016-04-14 16:49:47.000000000","message":"Done","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"20456b77c8b6d3dca43eb95bbcedc204473cc5ed","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            size\u003dPRIMARY_VIP_RANGE_SIZE)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        if ha_vrrp_health_check_gateway:"},{"line_number":192,"context_line":"            track_script \u003d KeepalivedTrackScript("},{"line_number":193,"context_line":"                ha_vrrp_health_check_interval, ha_conf_dir, self.vrouter_id)"},{"line_number":194,"context_line":"            self.track_script \u003d track_script"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_a87983ca","line":192,"range":{"start_line":192,"start_character":12,"end_line":192,"end_character":24},"updated":"2016-04-14 05:52:41.000000000","message":"nit: this could just be \"this.track_scipt \u003d KeepalivedTrackScript(\", without introducing another var","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"73fe6dbb49735d1b161bc04d7720482ba4b37c9a","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            size\u003dPRIMARY_VIP_RANGE_SIZE)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        if ha_vrrp_health_check_gateway:"},{"line_number":192,"context_line":"            track_script \u003d KeepalivedTrackScript("},{"line_number":193,"context_line":"                ha_vrrp_health_check_interval, ha_conf_dir, self.vrouter_id)"},{"line_number":194,"context_line":"            self.track_script \u003d track_script"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_e659c336","line":192,"range":{"start_line":192,"start_character":12,"end_line":192,"end_character":24},"in_reply_to":"5a18252c_a87983ca","updated":"2016-04-14 16:49:47.000000000","message":"Done","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"20456b77c8b6d3dca43eb95bbcedc204473cc5ed","unresolved":false,"context_lines":[{"line_number":425,"context_line":"                                      service_name\u003dKEEPALIVED_SERVICE_NAME,"},{"line_number":426,"context_line":"                                      monitored_process\u003dkeepalived_pm)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        for key, instance in six.iteritems(self.config.instances):"},{"line_number":429,"context_line":"            if instance.track_script:"},{"line_number":430,"context_line":"                instance.track_script.write_check_script()"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"        LOG.debug(\u0027Keepalived spawned with config %s\u0027, config_path)"},{"line_number":433,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_3f280786","line":430,"range":{"start_line":428,"start_character":0,"end_line":430,"end_character":58},"updated":"2016-04-14 05:52:41.000000000","message":"I think it would be more appropriate to create shell script before spawning keepalived process. And","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"73fe6dbb49735d1b161bc04d7720482ba4b37c9a","unresolved":false,"context_lines":[{"line_number":425,"context_line":"                                      service_name\u003dKEEPALIVED_SERVICE_NAME,"},{"line_number":426,"context_line":"                                      monitored_process\u003dkeepalived_pm)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        for key, instance in six.iteritems(self.config.instances):"},{"line_number":429,"context_line":"            if instance.track_script:"},{"line_number":430,"context_line":"                instance.track_script.write_check_script()"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"        LOG.debug(\u0027Keepalived spawned with config %s\u0027, config_path)"},{"line_number":433,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_a67a2b86","line":430,"range":{"start_line":428,"start_character":0,"end_line":430,"end_character":58},"in_reply_to":"5a18252c_3f280786","updated":"2016-04-14 16:49:47.000000000","message":"Done","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"20456b77c8b6d3dca43eb95bbcedc204473cc5ed","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def build_config_preamble(self):"},{"line_number":488,"context_line":"        config \u003d [\"\"\""},{"line_number":489,"context_line":"vrrp_script %(health_check_name)s_%(vr_id)s {"},{"line_number":490,"context_line":"    script \"%(script_location)s\""},{"line_number":491,"context_line":"    interval %(interval)s"},{"line_number":492,"context_line":"    fall 2"},{"line_number":493,"context_line":"    rise 2"},{"line_number":494,"context_line":"}"},{"line_number":495,"context_line":"\"\"\" % {"},{"line_number":496,"context_line":"            \u0027vr_id\u0027: self.vr_id,"},{"line_number":497,"context_line":"            \u0027health_check_name\u0027: HEALTH_CHECK_NAME,"},{"line_number":498,"context_line":"            \u0027script_location\u0027: self._get_script_location(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_4bb389e9","line":495,"range":{"start_line":489,"start_character":0,"end_line":495,"end_character":7},"updated":"2016-04-14 05:52:41.000000000","message":"Could this be something like line 286~291?","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"73fe6dbb49735d1b161bc04d7720482ba4b37c9a","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def build_config_preamble(self):"},{"line_number":488,"context_line":"        config \u003d [\"\"\""},{"line_number":489,"context_line":"vrrp_script %(health_check_name)s_%(vr_id)s {"},{"line_number":490,"context_line":"    script \"%(script_location)s\""},{"line_number":491,"context_line":"    interval %(interval)s"},{"line_number":492,"context_line":"    fall 2"},{"line_number":493,"context_line":"    rise 2"},{"line_number":494,"context_line":"}"},{"line_number":495,"context_line":"\"\"\" % {"},{"line_number":496,"context_line":"            \u0027vr_id\u0027: self.vr_id,"},{"line_number":497,"context_line":"            \u0027health_check_name\u0027: HEALTH_CHECK_NAME,"},{"line_number":498,"context_line":"            \u0027script_location\u0027: self._get_script_location(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_26c9fb59","line":495,"range":{"start_line":489,"start_character":0,"end_line":495,"end_character":7},"in_reply_to":"5a18252c_4bb389e9","updated":"2016-04-14 16:49:47.000000000","message":"Done","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"20456b77c8b6d3dca43eb95bbcedc204473cc5ed","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        return config"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    def is_needed(self):"},{"line_number":505,"context_line":"        \"\"\"Check is track script is needed by checking amount of routes."},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        :return: True/False"},{"line_number":508,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_ebc25533","line":505,"range":{"start_line":505,"start_character":17,"end_line":505,"end_character":19},"updated":"2016-04-14 05:52:41.000000000","message":"if","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"73fe6dbb49735d1b161bc04d7720482ba4b37c9a","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        return config"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    def is_needed(self):"},{"line_number":505,"context_line":"        \"\"\"Check is track script is needed by checking amount of routes."},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        :return: True/False"},{"line_number":508,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_a6e34bd8","line":505,"range":{"start_line":505,"start_character":17,"end_line":505,"end_character":19},"in_reply_to":"5a18252c_ebc25533","updated":"2016-04-14 16:49:47.000000000","message":"Done","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"20456b77c8b6d3dca43eb95bbcedc204473cc5ed","unresolved":false,"context_lines":[{"line_number":519,"context_line":"        return config"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def build_script(self):"},{"line_number":522,"context_line":"        if not self.is_needed():"},{"line_number":523,"context_line":"            return []"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        return itertools.chain([\u0027#!/bin/bash -eu\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_5faea398","line":522,"range":{"start_line":522,"start_character":0,"end_line":522,"end_character":32},"updated":"2016-04-14 05:52:41.000000000","message":"I think this check is duplicated with line 556. If is_needed return false, the code will not hit here.","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"73fe6dbb49735d1b161bc04d7720482ba4b37c9a","unresolved":false,"context_lines":[{"line_number":519,"context_line":"        return config"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def build_script(self):"},{"line_number":522,"context_line":"        if not self.is_needed():"},{"line_number":523,"context_line":"            return []"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        return itertools.chain([\u0027#!/bin/bash -eu\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_01078918","line":522,"range":{"start_line":522,"start_character":0,"end_line":522,"end_character":32},"in_reply_to":"5a18252c_5faea398","updated":"2016-04-14 16:49:47.000000000","message":"Done","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"20456b77c8b6d3dca43eb95bbcedc204473cc5ed","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    def get_script_str(self):"},{"line_number":545,"context_line":"        \"\"\"Generates and returns bash script to veryfy connectivity."},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        :return: Bash script code"},{"line_number":548,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_8b6761e8","line":545,"range":{"start_line":545,"start_character":48,"end_line":545,"end_character":54},"updated":"2016-04-14 05:52:41.000000000","message":"nit: verify","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"73fe6dbb49735d1b161bc04d7720482ba4b37c9a","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    def get_script_str(self):"},{"line_number":545,"context_line":"        \"\"\"Generates and returns bash script to veryfy connectivity."},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        :return: Bash script code"},{"line_number":548,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_a105f511","line":545,"range":{"start_line":545,"start_character":48,"end_line":545,"end_character":54},"in_reply_to":"5a18252c_8b6761e8","updated":"2016-04-14 16:49:47.000000000","message":"Done","commit_id":"2d22226931d28a01fc3990d8582da7c1a1ce4ca7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"87dcf29224c4db1b8ff7afe3f6dc2c3e956399c8","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                 priority\u003dHA_DEFAULT_PRIORITY, advert_int\u003dNone,"},{"line_number":161,"context_line":"                 mcast_src_ip\u003dNone, nopreempt\u003dFalse,"},{"line_number":162,"context_line":"                 garp_master_delay\u003dGARP_MASTER_DELAY,"},{"line_number":163,"context_line":"                 ha_vrrp\u003dFalse,"},{"line_number":164,"context_line":"                 ha_vrrp_interval\u003dNone,"},{"line_number":165,"context_line":"                 ha_conf_dir\u003dNone):"},{"line_number":166,"context_line":"        self.name \u003d \u0027VR_%s\u0027 % vrouter_id"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_4a42f0ae","line":163,"range":{"start_line":163,"start_character":17,"end_line":163,"end_character":24},"updated":"2016-04-21 09:40:00.000000000","message":"I think the parameter ha_vrrp here is a bit ambiguous. Maybe better with \"health_check\"?","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"0bd53f2ef3f41fae53637a4b642ea8bc1138afd8","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                 priority\u003dHA_DEFAULT_PRIORITY, advert_int\u003dNone,"},{"line_number":161,"context_line":"                 mcast_src_ip\u003dNone, nopreempt\u003dFalse,"},{"line_number":162,"context_line":"                 garp_master_delay\u003dGARP_MASTER_DELAY,"},{"line_number":163,"context_line":"                 ha_vrrp\u003dFalse,"},{"line_number":164,"context_line":"                 ha_vrrp_interval\u003dNone,"},{"line_number":165,"context_line":"                 ha_conf_dir\u003dNone):"},{"line_number":166,"context_line":"        self.name \u003d \u0027VR_%s\u0027 % vrouter_id"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_b298491d","line":163,"range":{"start_line":163,"start_character":17,"end_line":163,"end_character":24},"in_reply_to":"1a122d0e_4a42f0ae","updated":"2016-04-22 15:52:52.000000000","message":"Done","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"87dcf29224c4db1b8ff7afe3f6dc2c3e956399c8","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                 mcast_src_ip\u003dNone, nopreempt\u003dFalse,"},{"line_number":162,"context_line":"                 garp_master_delay\u003dGARP_MASTER_DELAY,"},{"line_number":163,"context_line":"                 ha_vrrp\u003dFalse,"},{"line_number":164,"context_line":"                 ha_vrrp_interval\u003dNone,"},{"line_number":165,"context_line":"                 ha_conf_dir\u003dNone):"},{"line_number":166,"context_line":"        self.name \u003d \u0027VR_%s\u0027 % vrouter_id"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_aa658445","line":164,"range":{"start_line":164,"start_character":17,"end_line":164,"end_character":33},"updated":"2016-04-21 09:40:00.000000000","message":"This is also a bit ambiguous, maybe better with \"health_check_int\"?","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"0bd53f2ef3f41fae53637a4b642ea8bc1138afd8","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                 mcast_src_ip\u003dNone, nopreempt\u003dFalse,"},{"line_number":162,"context_line":"                 garp_master_delay\u003dGARP_MASTER_DELAY,"},{"line_number":163,"context_line":"                 ha_vrrp\u003dFalse,"},{"line_number":164,"context_line":"                 ha_vrrp_interval\u003dNone,"},{"line_number":165,"context_line":"                 ha_conf_dir\u003dNone):"},{"line_number":166,"context_line":"        self.name \u003d \u0027VR_%s\u0027 % vrouter_id"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_129e5d07","line":164,"range":{"start_line":164,"start_character":17,"end_line":164,"end_character":33},"in_reply_to":"1a122d0e_aa658445","updated":"2016-04-22 15:52:52.000000000","message":"Done","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0233d5299ce52d256911d4fceb269c7fede5730c","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        return config_path"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @staticmethod"},{"line_number":390,"context_line":"    def _safe_remove_pid_file(pid_file):"},{"line_number":391,"context_line":"        try:"},{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_7e47aabb","line":390,"range":{"start_line":390,"start_character":8,"end_line":390,"end_character":29},"updated":"2016-04-29 19:54:55.000000000","message":"This seems like some function I would expect to see in some common.py file.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"64fe73a9fb96bb83515c9aa2b6d5ead15b24ba05","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        return config_path"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @staticmethod"},{"line_number":390,"context_line":"    def _safe_remove_pid_file(pid_file):"},{"line_number":391,"context_line":"        try:"},{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_b8bf76a9","line":390,"range":{"start_line":390,"start_character":8,"end_line":390,"end_character":29},"in_reply_to":"1a122d0e_7e47aabb","updated":"2016-05-04 15:49:47.000000000","message":"This functionality was already wrote by someone else. I would prefer to not touch this because it\u0027s a refactoring which should be done separately or when someone gonna change something here.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bd193f7158265b6f1ac46fdc20841b7ddd13462b","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        return config_path"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @staticmethod"},{"line_number":390,"context_line":"    def _safe_remove_pid_file(pid_file):"},{"line_number":391,"context_line":"        try:"},{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_ebf2ba99","line":390,"range":{"start_line":390,"start_character":8,"end_line":390,"end_character":29},"in_reply_to":"1a122d0e_90fdd770","updated":"2016-05-06 10:57:40.000000000","message":"I agree with Lubosz, this is sound like a reasonable refactor and can be done in a separate change.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a9fa9314e7d1957bc8f2fc8bb4002ef53fca9a8d","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        return config_path"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @staticmethod"},{"line_number":390,"context_line":"    def _safe_remove_pid_file(pid_file):"},{"line_number":391,"context_line":"        try:"},{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_90fdd770","line":390,"range":{"start_line":390,"start_character":8,"end_line":390,"end_character":29},"in_reply_to":"1a122d0e_b8bf76a9","updated":"2016-05-04 17:14:42.000000000","message":"I understand the concern of John for these lines, but I\u0027m agree with Lubosz regarding those lines weren\u0027t touched by his patch.  IMHO, the changes that John proposes should be addressed in another patchset.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"efa4cd81d13a28136ae2edfcb4f09a3c5412f57d","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        return config_path"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @staticmethod"},{"line_number":390,"context_line":"    def _safe_remove_pid_file(pid_file):"},{"line_number":391,"context_line":"        try:"},{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_a6ba6edf","line":390,"range":{"start_line":390,"start_character":8,"end_line":390,"end_character":29},"in_reply_to":"dab17558_93b080df","updated":"2016-05-09 08:32:49.000000000","message":"Ah wow, I apologize for these 3 comments - I was looking at a diff between the versions and thought this was added. Obviously it\u0027s out of the scope and shouldn\u0027t be handled in this patch. Sorry again :(","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"830a80eed2838743bf5e397e2c63cf09532bb538","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        return config_path"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @staticmethod"},{"line_number":390,"context_line":"    def _safe_remove_pid_file(pid_file):"},{"line_number":391,"context_line":"        try:"},{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_93b080df","line":390,"range":{"start_line":390,"start_character":8,"end_line":390,"end_character":29},"in_reply_to":"dab17558_ebf2ba99","updated":"2016-05-06 14:32:40.000000000","message":"On top of this patch in next week I\u0027m gonna prepare a refactoring patch which will change that three parts of code.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0233d5299ce52d256911d4fceb269c7fede5730c","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        try:"},{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"},{"line_number":394,"context_line":"            if e.errno !\u003d errno.ENOENT:"},{"line_number":395,"context_line":"                LOG.error(_LE(\"Could not delete file %s, keepalived can \""},{"line_number":396,"context_line":"                              \"refuse to start.\"), pid_file)"},{"line_number":397,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_9e1606a5","line":394,"range":{"start_line":394,"start_character":15,"end_line":394,"end_character":38},"updated":"2016-04-29 19:54:55.000000000","message":"What\u0027s wrong with using os.path.exists?","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"64fe73a9fb96bb83515c9aa2b6d5ead15b24ba05","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        try:"},{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"},{"line_number":394,"context_line":"            if e.errno !\u003d errno.ENOENT:"},{"line_number":395,"context_line":"                LOG.error(_LE(\"Could not delete file %s, keepalived can \""},{"line_number":396,"context_line":"                              \"refuse to start.\"), pid_file)"},{"line_number":397,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_18db0a23","line":394,"range":{"start_line":394,"start_character":15,"end_line":394,"end_character":38},"in_reply_to":"1a122d0e_9e1606a5","updated":"2016-05-04 15:49:47.000000000","message":"Upper comment","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0233d5299ce52d256911d4fceb269c7fede5730c","unresolved":false,"context_lines":[{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"},{"line_number":394,"context_line":"            if e.errno !\u003d errno.ENOENT:"},{"line_number":395,"context_line":"                LOG.error(_LE(\"Could not delete file %s, keepalived can \""},{"line_number":396,"context_line":"                              \"refuse to start.\"), pid_file)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    def get_vrrp_pid_file_name(self, base_pid_file):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_3e41b2a9","line":395,"range":{"start_line":395,"start_character":20,"end_line":395,"end_character":25},"updated":"2016-04-29 19:54:55.000000000","message":"This seems like more than a warning, not an error. I would expect the function to fail on error, but the text and the code hint that this code will continue to run.\n\nDo we even want to continue to run in this case?","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"64fe73a9fb96bb83515c9aa2b6d5ead15b24ba05","unresolved":false,"context_lines":[{"line_number":392,"context_line":"            os.remove(pid_file)"},{"line_number":393,"context_line":"        except OSError as e:"},{"line_number":394,"context_line":"            if e.errno !\u003d errno.ENOENT:"},{"line_number":395,"context_line":"                LOG.error(_LE(\"Could not delete file %s, keepalived can \""},{"line_number":396,"context_line":"                              \"refuse to start.\"), pid_file)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    def get_vrrp_pid_file_name(self, base_pid_file):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_f8df2e0a","line":395,"range":{"start_line":395,"start_character":20,"end_line":395,"end_character":25},"in_reply_to":"1a122d0e_3e41b2a9","updated":"2016-05-04 15:49:47.000000000","message":"Upper.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":20076,"name":"QunyingRan","email":"ran.qunying@zte.com.cn","username":"QunyingRan"},"change_message_id":"73299a27f424d7d2c38bcef597cfe3774b9aad39","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            return \u0027\u0027"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        config \u003d [\u0027    track_script {\u0027,"},{"line_number":509,"context_line":"                  \u0027        %s_%s\u0027 % (HEALTH_CHECK_NAME, self.vr_id),"},{"line_number":510,"context_line":"                  \u0027    }\u0027]"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        return config"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_2f1cc976","line":509,"range":{"start_line":509,"start_character":61,"end_line":509,"end_character":66},"updated":"2016-05-24 11:25:18.000000000","message":"If the parameters should be dict ??","commit_id":"6af23370c61ebf07e24ab22e2cbbe02e1882f785"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    def build_script(self):"},{"line_number":515,"context_line":"        return itertools.chain([\u0027#!/bin/bash -eu\u0027],"},{"line_number":516,"context_line":"                               [\u0027%s\u0027 % self._check_ip_assigned()],"},{"line_number":517,"context_line":"                               (\u0027%s\u0027 % self._add_ip_addr(route.nexthop)"},{"line_number":518,"context_line":"                                for route in self.routes if route.nexthop),"},{"line_number":519,"context_line":"                               )"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_b54577b4","line":516,"updated":"2016-06-22 19:03:26.000000000","message":"Why don\u0027t you add \u0027for vip in self.vips\u0027 here and pass it to _check_ip_assigned() instead of checking len(self.vips) ?","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":524,"context_line":"            6: \u0027ping6\u0027,"},{"line_number":525,"context_line":"        }.get(netaddr.IPAddress(ip_addr).version)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        return \u0027%s -c 1 -w 1 -n %s 1\u003e/dev/null || exit 1\u0027 % (cmd, ip_addr)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def _check_ip_assigned(self):"},{"line_number":530,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_dfa024a2","line":527,"updated":"2016-06-22 19:03:26.000000000","message":"Don\u0027t think you need the -n if you\u0027re using an IP address, it shouldn\u0027t use DNS in that case.","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        return \u0027%s -c 1 -w 1 -n %s 1\u003e/dev/null || exit 1\u0027 % (cmd, ip_addr)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def _check_ip_assigned(self):"},{"line_number":530,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"},{"line_number":531,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":532,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":533,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_f0026d08","line":530,"updated":"2016-06-22 19:03:26.000000000","message":"nit: you could add self.interface and then use it here to be more strict:\n\nip a s dev $intf...","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def _check_ip_assigned(self):"},{"line_number":530,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"},{"line_number":531,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":532,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    def get_script_str(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_b5d737ec","line":531,"updated":"2016-06-22 19:03:26.000000000","message":"netaddr.IPAddress, right?","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"24233cc69b205217638dc2191a263612b431e2c8","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                 mcast_src_ip\u003dNone, nopreempt\u003dFalse,"},{"line_number":165,"context_line":"                 garp_master_delay\u003dGARP_MASTER_DELAY,"},{"line_number":166,"context_line":"                 vrrp_health_check\u003dFalse,"},{"line_number":167,"context_line":"                 vrrp_check_interval\u003dNone,"},{"line_number":168,"context_line":"                 ha_conf_dir\u003dNone):"},{"line_number":169,"context_line":"        self.name \u003d \u0027VR_%s\u0027 % vrouter_id"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_0c124809","line":167,"updated":"2017-01-30 16:37:05.000000000","message":"nit: Shouldn\u0027t this be the default value and not None?  Although the only caller is specifying it.\n\nAlso, I think the value should be range-checked somehow.","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2087484ee42488bea1d769513e2af377fa6d64d8","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                 mcast_src_ip\u003dNone, nopreempt\u003dFalse,"},{"line_number":165,"context_line":"                 garp_master_delay\u003dGARP_MASTER_DELAY,"},{"line_number":166,"context_line":"                 vrrp_health_check\u003dFalse,"},{"line_number":167,"context_line":"                 vrrp_check_interval\u003dNone,"},{"line_number":168,"context_line":"                 ha_conf_dir\u003dNone):"},{"line_number":169,"context_line":"        self.name \u003d \u0027VR_%s\u0027 % vrouter_id"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_e25ca4ef","line":167,"in_reply_to":"3a461143_0c124809","updated":"2017-02-02 14:07:08.000000000","message":"Changed to vrrp_health_check_interval\u003d0, 0 is disabling the feautre by default.","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"24233cc69b205217638dc2191a263612b431e2c8","unresolved":false,"context_lines":[{"line_number":482,"context_line":"class KeepalivedTrackScript(KeepalivedConf):"},{"line_number":483,"context_line":"    \"\"\"Track script generator for Keepalived\"\"\""},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def __init__(self, interval, conf_dir, vr_id):"},{"line_number":486,"context_line":"        self.interval \u003d interval"},{"line_number":487,"context_line":"        self.conf_dir \u003d conf_dir"},{"line_number":488,"context_line":"        self.vr_id \u003d vr_id"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_72cd62b6","line":485,"updated":"2017-01-30 16:37:05.000000000","message":"Should the interface be given as well?  I guess they addresses must be unique in the root namespace though.","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"f70ee8c9e60471d1557104ed002f5b46b40bbbdd","unresolved":false,"context_lines":[{"line_number":482,"context_line":"class KeepalivedTrackScript(KeepalivedConf):"},{"line_number":483,"context_line":"    \"\"\"Track script generator for Keepalived\"\"\""},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def __init__(self, interval, conf_dir, vr_id):"},{"line_number":486,"context_line":"        self.interval \u003d interval"},{"line_number":487,"context_line":"        self.conf_dir \u003d conf_dir"},{"line_number":488,"context_line":"        self.vr_id \u003d vr_id"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_3b752aca","line":485,"in_reply_to":"3a461143_72cd62b6","updated":"2017-02-01 12:15:58.000000000","message":"Passing interface does not make any difference. We are executing the ping and check interface in qrouter namespace. The addresses that are checked will be in HA master namespace. If router will become slave, all virtual addresses will be moved to new master.\n\nI\u0027m not an author of this patch, but I do not see a need to add interface here.","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"24233cc69b205217638dc2191a263612b431e2c8","unresolved":false,"context_lines":[{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        return config"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    def is_needed(self):"},{"line_number":505,"context_line":"        \"\"\"Check if track script is needed by checking amount of routes."},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        :return: True/False"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_6c566c2b","line":504,"updated":"2017-01-30 16:37:05.000000000","message":"nit: this can be private as well","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2087484ee42488bea1d769513e2af377fa6d64d8","unresolved":false,"context_lines":[{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        return config"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    def is_needed(self):"},{"line_number":505,"context_line":"        \"\"\"Check if track script is needed by checking amount of routes."},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        :return: True/False"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_f09b9170","line":504,"in_reply_to":"3a461143_6c566c2b","updated":"2017-02-02 14:07:08.000000000","message":"Done","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"24233cc69b205217638dc2191a263612b431e2c8","unresolved":false,"context_lines":[{"line_number":534,"context_line":"        return \u0027%s -c 1 -w 1 %s 1\u003e/dev/null || exit 1\u0027 % (cmd, ip_addr)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    def _check_ip_assigned(self):"},{"line_number":537,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"},{"line_number":538,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":539,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":540,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_128a5e1b","line":537,"updated":"2017-01-30 16:37:05.000000000","message":"Does this work in all cases?  grep could match the wrong address\n\n$ ip a | grep 10.1.2.3\ninet 10.1.2.30/24 brd 10.1.2.255 scope global eth0\n\n$ ip a s to 10.1.2.3\n(although this returns status code 0)","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"f70ee8c9e60471d1557104ed002f5b46b40bbbdd","unresolved":false,"context_lines":[{"line_number":534,"context_line":"        return \u0027%s -c 1 -w 1 %s 1\u003e/dev/null || exit 1\u0027 % (cmd, ip_addr)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    def _check_ip_assigned(self):"},{"line_number":537,"context_line":"        cmd \u003d \u0027ip a | grep %s || exit 0\u0027"},{"line_number":538,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":539,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":540,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_56c72b63","line":537,"in_reply_to":"3a461143_128a5e1b","updated":"2017-02-01 12:15:58.000000000","message":"The \u0027self.vips[0].ip_address\u0027 is address with subnet mask, i.e. \u002735.4.0.4/24\u0027, \u002719.4.4.2/32\u0027, \u0027fe80::c8fe:deff:fead:beee/64\u0027, so in your example you should grep with 10.1.2.30/24, which should be precise enough. \nWe are checking here if any of the managed VIP is present in qrouter namespace, so in my opinion, if first on list in matched, then we are fine.\nIf we will find by mistake wrong IP address, there is still ping activity in second line of this script validating if there is any connectivity from qrouter namespace to gateway.\n\nWe could add interface here and match VIP with route next hope, which will be pinged in second line of check connectivity script built here. But this would add more complex and error prone logic in bash script.\n\nIn my understanding, the current implementation is enough for checking if master router has gateway connectivity, no need to make it more complex.","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"24233cc69b205217638dc2191a263612b431e2c8","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":539,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    def get_script_str(self):"},{"line_number":542,"context_line":"        \"\"\"Generates and returns bash script to verify connectivity."},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        :return: Bash script code"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_6c7f4cab","line":541,"updated":"2017-01-30 16:37:05.000000000","message":"nit: this can be private as well","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2087484ee42488bea1d769513e2af377fa6d64d8","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        return cmd % netaddr.IPNetwork(self.vips[0].ip_address).ip if len("},{"line_number":539,"context_line":"            self.vips) else \u0027\u0027"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    def get_script_str(self):"},{"line_number":542,"context_line":"        \"\"\"Generates and returns bash script to verify connectivity."},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        :return: Bash script code"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_d09e9562","line":541,"in_reply_to":"3a461143_6c7f4cab","updated":"2017-02-02 14:07:08.000000000","message":"Done","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"}],"neutron/conf/agent/l3/ha.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"0777fd93edd1bbf50efbbdc064d90abb8a99a4a0","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check_gateway\u0027,"},{"line_number":47,"context_line":"                default\u003dFalse,"},{"line_number":48,"context_line":"                help\u003d_(\u0027Enable VRRP health checks. This will cause pings to \u0027"},{"line_number":49,"context_line":"                       \u0027be sent to the virtual gateway IP address(es) - \u0027"},{"line_number":50,"context_line":"                       \u0027requires ICMP_ECHO_REQUEST to be enabled on the \u0027"},{"line_number":51,"context_line":"                       \u0027gateway.\u0027)),"},{"line_number":52,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"3a461143_30d8b953","line":49,"updated":"2017-01-26 08:02:49.000000000","message":"What do you mean by \u0027virtual gateway IP\u0027 in this context. I was under the impression that it was pinging the subnet gateway, but that might not be virtual. Can you clarify?\n\nIf it is pinging the subnet gateway, remove the \u0027virtual\u0027 keyword and add a sentence indicating that if the gateway fails, all nodes will transition to backup.","commit_id":"a0b72a843e12725fc9e9ca9abd9fb95eb60d1412"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1a324a69fb0ef4e0afcc8fd9f57fed5e9d4cce21","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    cfg.BoolOpt(\u0027ha_vrrp_health_check_gateway\u0027,"},{"line_number":47,"context_line":"                default\u003dFalse,"},{"line_number":48,"context_line":"                help\u003d_(\u0027Enable VRRP health checks. This will cause pings to \u0027"},{"line_number":49,"context_line":"                       \u0027be sent to the virtual gateway IP address(es) - \u0027"},{"line_number":50,"context_line":"                       \u0027requires ICMP_ECHO_REQUEST to be enabled on the \u0027"},{"line_number":51,"context_line":"                       \u0027gateway.\u0027)),"},{"line_number":52,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"3a461143_224f81be","line":49,"in_reply_to":"3a461143_30d8b953","updated":"2017-01-26 14:14:42.000000000","message":"The same as in other place:\n\"In case of gateway failure, the election process will be repeated round-robin until one of the router restore the gateway connection. In the mean time, all of the routers will be reported as \u0027master\u0027\"","commit_id":"a0b72a843e12725fc9e9ca9abd9fb95eb60d1412"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"24233cc69b205217638dc2191a263612b431e2c8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                       \u0027restore the gateway connection.\u0027)),"},{"line_number":55,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":56,"context_line":"               default\u003d5,"},{"line_number":57,"context_line":"               help\u003d_(\u0027The VRRP health check interval in seconds.\u0027)),"},{"line_number":58,"context_line":"]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_8c9ab86c","line":57,"updated":"2017-01-30 16:37:05.000000000","message":"So I\u0027m a little late to this review, but why do we need two config options?  ha_vrrp_health_check_gateway\u003d0 could signify it\u0027s disabled.\n\nWhat do others think?","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"a4cdd69c0812d0540522bbd973ac3d0d44b775ba","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                       \u0027restore the gateway connection.\u0027)),"},{"line_number":55,"context_line":"    cfg.IntOpt(\u0027ha_vrrp_health_check_interval\u0027,"},{"line_number":56,"context_line":"               default\u003d5,"},{"line_number":57,"context_line":"               help\u003d_(\u0027The VRRP health check interval in seconds.\u0027)),"},{"line_number":58,"context_line":"]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_62d8b41e","line":57,"in_reply_to":"3a461143_8c9ab86c","updated":"2017-02-02 14:08:47.000000000","message":"I have added ha_vrrp_health_check_interval as one config option.","commit_id":"28e11d4cc48ea359df4f08c90e3c8c028fc31620"}],"neutron/tests/functional/agent/l3/test_ha_router.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"0eafe14ab2e4821bf878780b8c7d3672253e3435","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.fail_gw_router_port(router2)"},{"line_number":333,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"5a18252c_d40a6389","line":330,"updated":"2016-04-14 20:56:05.000000000","message":"Failing the backup router seems like an odd choice. We\u0027re really more interested to see what happens when we fail the master replica.","commit_id":"23cd1b49472bc048b8b9077b0fbe6fe2da3b8bbf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0233d5299ce52d256911d4fceb269c7fede5730c","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        self.failover_agent.conf.set_override("},{"line_number":309,"context_line":"            \u0027ha_vrrp_health_check_gateway\u0027, True)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        router_info \u003d self.generate_router_info(enable_ha\u003dTrue)"},{"line_number":312,"context_line":"        get_ns_name \u003d mock.patch.object("},{"line_number":313,"context_line":"            namespaces.RouterNamespace, \u0027_get_ns_name\u0027).start()"},{"line_number":314,"context_line":"        get_ns_name.return_value \u003d \"%s%s%s\" % ("},{"line_number":315,"context_line":"            \u0027qrouter-\u0027 + router_info[\u0027id\u0027],"},{"line_number":316,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.agent.host)"},{"line_number":317,"context_line":"        router1 \u003d self.manage_router(self.agent, router_info)"},{"line_number":318,"context_line":"        self._add_fip(router1, \u0027192.168.111.12\u0027)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        router_info_2 \u003d copy.deepcopy(router_info)"},{"line_number":321,"context_line":"        router_info_2[l3_constants.HA_INTERFACE_KEY] \u003d ("},{"line_number":322,"context_line":"            l3_test_common.get_ha_interface(ip\u003d\u0027169.254.192.2\u0027,"},{"line_number":323,"context_line":"                                            mac\u003d\u002722:22:22:22:22:22\u0027))"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        get_ns_name.return_value \u003d \"%s%s%s\" % ("},{"line_number":326,"context_line":"            namespaces.RouterNamespace._get_ns_name(router_info_2[\u0027id\u0027]),"},{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_be894228","line":328,"range":{"start_line":311,"start_character":8,"end_line":328,"end_character":72},"updated":"2016-04-29 19:54:55.000000000","message":"This is all (except line 318) a complete duplicate of lines 279-295. Please extract this code to some shared function (setUp?) and eliminate the code duplication.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"64fe73a9fb96bb83515c9aa2b6d5ead15b24ba05","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        self.failover_agent.conf.set_override("},{"line_number":309,"context_line":"            \u0027ha_vrrp_health_check_gateway\u0027, True)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        router_info \u003d self.generate_router_info(enable_ha\u003dTrue)"},{"line_number":312,"context_line":"        get_ns_name \u003d mock.patch.object("},{"line_number":313,"context_line":"            namespaces.RouterNamespace, \u0027_get_ns_name\u0027).start()"},{"line_number":314,"context_line":"        get_ns_name.return_value \u003d \"%s%s%s\" % ("},{"line_number":315,"context_line":"            \u0027qrouter-\u0027 + router_info[\u0027id\u0027],"},{"line_number":316,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.agent.host)"},{"line_number":317,"context_line":"        router1 \u003d self.manage_router(self.agent, router_info)"},{"line_number":318,"context_line":"        self._add_fip(router1, \u0027192.168.111.12\u0027)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        router_info_2 \u003d copy.deepcopy(router_info)"},{"line_number":321,"context_line":"        router_info_2[l3_constants.HA_INTERFACE_KEY] \u003d ("},{"line_number":322,"context_line":"            l3_test_common.get_ha_interface(ip\u003d\u0027169.254.192.2\u0027,"},{"line_number":323,"context_line":"                                            mac\u003d\u002722:22:22:22:22:22\u0027))"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        get_ns_name.return_value \u003d \"%s%s%s\" % ("},{"line_number":326,"context_line":"            namespaces.RouterNamespace._get_ns_name(router_info_2[\u0027id\u0027]),"},{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_b84496b7","line":328,"range":{"start_line":311,"start_character":8,"end_line":328,"end_character":72},"in_reply_to":"1a122d0e_be894228","updated":"2016-05-04 15:49:47.000000000","message":"Done","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0233d5299ce52d256911d4fceb269c7fede5730c","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # TODO(diltram) failing and restoring one router to stabilize"},{"line_number":334,"context_line":"        # the routers states."},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_fea8da8d","line":338,"range":{"start_line":330,"start_character":8,"end_line":338,"end_character":67},"updated":"2016-04-29 19:54:55.000000000","message":"This is all tested by \u0027test_ha_router_failover\u0027 - no need to check this again here.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7527fb44b54d03ca9fafc7a025bc39685f256c84","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # TODO(diltram) failing and restoring one router to stabilize"},{"line_number":334,"context_line":"        # the routers states."},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_8e5c8eee","line":338,"range":{"start_line":330,"start_character":8,"end_line":338,"end_character":67},"in_reply_to":"1a122d0e_3886c6db","updated":"2016-05-09 16:18:52.000000000","message":"That doesn\u0027t make sense - if router1 and router2 both report ha_state as master, the check in line 331 will fail (since router2 is master and not backup) and the test will never succeed. Sure, the failover can be used to make sure router2 is master - but that won\u0027t happen until router2 is first backup.\n\nThis means that IMO you can keep lines 330 and 331 and remove all the others, and just treat router1 as the first known master. Also, then the comment in L342 is still relevant.\n\nIf, on the other hand, we have a case where both router1 and router2 can report ha_state as master for so long that the test doesn\u0027t succeed (or worst - that it doesn\u0027t switch but report that it is master, causing the test to succeed), we should probably halt progress on this patch and investigate this problem first.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"64fe73a9fb96bb83515c9aa2b6d5ead15b24ba05","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # TODO(diltram) failing and restoring one router to stabilize"},{"line_number":334,"context_line":"        # the routers states."},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_3886c6db","line":338,"range":{"start_line":330,"start_character":8,"end_line":338,"end_character":67},"in_reply_to":"1a122d0e_fea8da8d","updated":"2016-05-04 15:49:47.000000000","message":"Unfortunately it\u0027s needed. Without that router1 and router2 report ha_state as master.\nBecause of that I need to failover that router to stabilize it\u0027s status and get one router as master and second as backup.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"b0a778d24a69822f3e007c9ff80ce6e08deb7bdf","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # TODO(diltram) failing and restoring one router to stabilize"},{"line_number":334,"context_line":"        # the routers states."},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_8f28e387","line":338,"range":{"start_line":330,"start_character":8,"end_line":338,"end_character":67},"in_reply_to":"dab17558_007debb0","updated":"2016-05-10 09:53:56.000000000","message":"I took the lasted patch set and run tox -e dsvm-functional -- test_ha_router.L3HATestFailover.test_ha_router_lost_gw_connection with pdb\n\n297  \n298  -\u003e         utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)\n299             utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)\n300  \n301             # TODO(diltram) failing and restoring one router to stabilize\n302             # the routers states.\n303  \n(Pdb) router1.ha_state\n\u0027master\u0027\n(Pdb) router2.ha_state\n\u0027master\u0027\n(Pdb) router1.ha_state\n\u0027master\u0027\n(Pdb) router2.ha_state\n\u0027master\u0027\n\nSo, both started as a master o_O \n\nBut I don\u0027t understand why you need self.fail_ha_router() for stabilizing this.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"de50f3085e52a8ecd520caff0ea95279f98f20fa","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # TODO(diltram) failing and restoring one router to stabilize"},{"line_number":334,"context_line":"        # the routers states."},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_9d013008","line":338,"range":{"start_line":330,"start_character":8,"end_line":338,"end_character":67},"in_reply_to":"dab17558_007debb0","updated":"2016-05-10 14:15:51.000000000","message":"That two routers suppose to start as backups and one should become a master.\nAfter that two of them has master state in next few seconds.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"841ec098ebfe765094c442889ff56511079d0e40","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # TODO(diltram) failing and restoring one router to stabilize"},{"line_number":334,"context_line":"        # the routers states."},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_fdd22eff","line":338,"range":{"start_line":330,"start_character":8,"end_line":338,"end_character":67},"in_reply_to":"dab17558_8e5c8eee","updated":"2016-05-09 18:25:45.000000000","message":"Please test that code and you will see how it\u0027s working and because of what I done this.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"de50f3085e52a8ecd520caff0ea95279f98f20fa","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # TODO(diltram) failing and restoring one router to stabilize"},{"line_number":334,"context_line":"        # the routers states."},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_fd679ce6","line":338,"range":{"start_line":330,"start_character":8,"end_line":338,"end_character":67},"in_reply_to":"dab17558_8f28e387","updated":"2016-05-10 14:15:51.000000000","message":"I found the issue with keepalived_state_change. Maybe it\u0027s because of that but I\u0027m gonna try to figure it out what exactly it\u0027s wrong with that code and I will fix that.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7df307ac277dc64d26e82bf176a2a7e22981d91e","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            self.NESTED_NAMESPACE_SEPARATOR, self.failover_agent.host)"},{"line_number":328,"context_line":"        router2 \u003d self.manage_router(self.failover_agent, router_info_2)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":331,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # TODO(diltram) failing and restoring one router to stabilize"},{"line_number":334,"context_line":"        # the routers states."},{"line_number":335,"context_line":"        self.fail_ha_router(router1)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"dab17558_007debb0","line":338,"range":{"start_line":330,"start_character":8,"end_line":338,"end_character":67},"in_reply_to":"dab17558_fdd22eff","updated":"2016-05-10 08:11:16.000000000","message":"I did just that: I put a pdb.set_trace() call in line 329 (before the first wait_until_true) and printed some values:\n\n     330         import ipdb;ipdb.set_trace()\n --\u003e 331         utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027master\u0027)\n     332         utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027backup\u0027)\n\n ipdb\u003e router1.ha_state\n \u0027backup\u0027\n ipdb\u003e router2.ha_state\n \u0027backup\u0027\n ipdb\u003e router1.ha_state\n \u0027master\u0027\n ipdb\u003e router2.ha_state\n \u0027backup\u0027\n\nBoth routers started as \u0027backup\u0027 and it took some time (10 seconds tops) but eventually router1 changed its state to \u0027master\u0027. Certainly both didn\u0027t start as \u0027master\u0027.\n\nCan you please test that code and show the relevant variables? I think I\u0027m missing something here..","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0233d5299ce52d256911d4fceb269c7fede5730c","unresolved":false,"context_lines":[{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"},{"line_number":342,"context_line":"        ha_device.link.set_up()"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":345,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_7ec20a35","line":342,"range":{"start_line":340,"start_character":8,"end_line":342,"end_character":31},"updated":"2016-04-29 19:54:55.000000000","message":"Removing lines 330-338 will make this code irrelevant.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"64fe73a9fb96bb83515c9aa2b6d5ead15b24ba05","unresolved":false,"context_lines":[{"line_number":337,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":338,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        device_name \u003d router1.get_ha_device_name()"},{"line_number":341,"context_line":"        ha_device \u003d ip_lib.IPDevice(device_name, router1.ha_namespace)"},{"line_number":342,"context_line":"        ha_device.link.set_up()"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":345,"context_line":"        utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a122d0e_f8628e3c","line":342,"range":{"start_line":340,"start_character":8,"end_line":342,"end_character":31},"in_reply_to":"1a122d0e_7ec20a35","updated":"2016-05-04 15:49:47.000000000","message":"I can\u0027t remove that. Upper comment.","commit_id":"d877e96eba829c9b372b484f549aa1a4f51f99d8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"59c6c71f06603b1f3366280ffcc9801296893bfe","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        r2_br.addr.add(\u002719.4.4.1/24\u0027)"},{"line_number":300,"context_line":"        r2_br.link.set_up()"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        common_utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":303,"context_line":"        common_utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        self.fail_gw_router_port(router2)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_de6044a7","line":302,"range":{"start_line":302,"start_character":8,"end_line":302,"end_character":74},"updated":"2016-09-01 08:09:36.000000000","message":"Looking back at this and at line 280, this makes no sense at all. How come test_ha_router_failover expects router1 to be \u0027master\u0027 and router2 to to be \u0027backup\u0027, but this test expects exactly the opposite? From this I would gather that one of this tests should fail but both pass (even though they present contradictory checks). What is the difference between the checks? What causes this difference?","commit_id":"ef41528a14d7e6a1c7f2ff013ad1a2f82e014ae3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"e325300a95bf53d2738be8a1fc5eb38295dddcab","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        r2_br.addr.add(\u002719.4.4.1/24\u0027)"},{"line_number":300,"context_line":"        r2_br.link.set_up()"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        common_utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":303,"context_line":"        common_utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        self.fail_gw_router_port(router2)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_fcaa4670","line":302,"range":{"start_line":302,"start_character":8,"end_line":302,"end_character":74},"in_reply_to":"fa7ab95a_de6044a7","updated":"2016-09-01 19:06:09.000000000","message":"My code and enabling ha_vrrp_health_check_gateway make it.\nThere is no connectivity with gateway so it\u0027s changing active/backup routers.","commit_id":"ef41528a14d7e6a1c7f2ff013ad1a2f82e014ae3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"33931a786d522a47a6a561706b1371b81fe36569","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        r2_br.addr.add(\u002719.4.4.1/24\u0027)"},{"line_number":300,"context_line":"        r2_br.link.set_up()"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        common_utils.wait_until_true(lambda: router1.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":303,"context_line":"        common_utils.wait_until_true(lambda: router2.ha_state \u003d\u003d \u0027master\u0027)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        self.fail_gw_router_port(router2)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_26f32e0c","line":302,"range":{"start_line":302,"start_character":8,"end_line":302,"end_character":74},"in_reply_to":"fa7ab95a_fcaa4670","updated":"2016-09-04 11:07:28.000000000","message":"Can you explain exactly how this occurs? I understand from this test that both routers are connected to the exact same gateway IP, so there shouldn\u0027t be a difference (especially since router1 is connected first, so I\u0027d expect router1 to be \u0027master\u0027).","commit_id":"ef41528a14d7e6a1c7f2ff013ad1a2f82e014ae3"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"0777fd93edd1bbf50efbbdc064d90abb8a99a4a0","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        common_utils.wait_until_true("},{"line_number":367,"context_line":"            lambda: master_router.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":368,"context_line":"        self._assert_external_device(slave_router)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"class LinuxBridgeL3HATestCase(L3HATestCase):"},{"line_number":372,"context_line":"    INTERFACE_DRIVER \u003d \u0027neutron.agent.linux.interface.BridgeInterfaceDriver\u0027"}],"source_content_type":"text/x-python","patch_set":38,"id":"3a461143_300a79d3","line":369,"updated":"2017-01-26 08:02:49.000000000","message":"can you add a test case that takes down both routers GW ports to show that they both end up in \u0027backup\u0027? My reading of the behavior of keepalived makes it sound like that is what happens but I would like to have it tested in code.","commit_id":"a0b72a843e12725fc9e9ca9abd9fb95eb60d1412"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1a324a69fb0ef4e0afcc8fd9f57fed5e9d4cce21","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        common_utils.wait_until_true("},{"line_number":367,"context_line":"            lambda: master_router.ha_state \u003d\u003d \u0027backup\u0027)"},{"line_number":368,"context_line":"        self._assert_external_device(slave_router)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"class LinuxBridgeL3HATestCase(L3HATestCase):"},{"line_number":372,"context_line":"    INTERFACE_DRIVER \u003d \u0027neutron.agent.linux.interface.BridgeInterfaceDriver\u0027"}],"source_content_type":"text/x-python","patch_set":38,"id":"3a461143_828d9533","line":369,"in_reply_to":"3a461143_300a79d3","updated":"2017-01-26 14:14:42.000000000","message":"I have played with failing both routers with cutting off the gateway connectivity, and the result was that both routers went to \u0027master\u0027 state, and the process of electing master was constantly repeating in infinite loop, by every 2 seconds (set in keepalived config as interval for fail-over). The keepalived process was checking if one of the router can become master again, but it was resulting in fast failover with exposing state of both routers as \u0027master\u0027.","commit_id":"a0b72a843e12725fc9e9ca9abd9fb95eb60d1412"}],"neutron/tests/unit/agent/linux/test_keepalived.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b8f393e38d793eee1ca2d0327623ac46c49f3fbd","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"import testtools"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron.agent.linux import keepalived"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_cd145aa1","line":16,"updated":"2016-04-21 09:53:47.000000000","message":"os is not third party","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"0bd53f2ef3f41fae53637a4b642ea8bc1138afd8","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"import testtools"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron.agent.linux import keepalived"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_d55ccff2","line":16,"in_reply_to":"1a122d0e_cd145aa1","updated":"2016-04-22 15:52:52.000000000","message":"Done","commit_id":"063b9f686f8fa6e4a9bc5d56662ba3dc4efc35d7"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"542c8c86d92b2d8d1aa34a618db0acc9e8bbd607","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    }"},{"line_number":310,"context_line":"}\"\"\""},{"line_number":311,"context_line":"        instance \u003d keepalived.KeepalivedInstance("},{"line_number":312,"context_line":"            \u0027MASTER\u0027, \u0027eth0\u0027, 2, [\u0027169.254.192.0/18\u0027])"},{"line_number":313,"context_line":"        self.assertEqual(expected, \u0027\\n\u0027.join(instance.build_config()))"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def test_build_config_no_vips_track_script(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_eecf1a7d","line":312,"range":{"start_line":312,"start_character":30,"end_line":312,"end_character":32},"updated":"2016-05-09 16:21:20.000000000","message":"Why 2?\n\nPlease put this into some clear constant so that it will have meaning. This will be relevant also to the constant in line 336 (which is now a \"magic integer\" with the value 1).","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"70acee0f8221c084378300b479b644d55e76664f","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    }"},{"line_number":310,"context_line":"}\"\"\""},{"line_number":311,"context_line":"        instance \u003d keepalived.KeepalivedInstance("},{"line_number":312,"context_line":"            \u0027MASTER\u0027, \u0027eth0\u0027, 2, [\u0027169.254.192.0/18\u0027])"},{"line_number":313,"context_line":"        self.assertEqual(expected, \u0027\\n\u0027.join(instance.build_config()))"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def test_build_config_no_vips_track_script(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_f327ff0f","line":312,"range":{"start_line":312,"start_character":30,"end_line":312,"end_character":32},"in_reply_to":"dab17558_eecf1a7d","updated":"2016-05-09 19:21:58.000000000","message":"Done","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"542c8c86d92b2d8d1aa34a618db0acc9e8bbd607","unresolved":false,"context_lines":[{"line_number":310,"context_line":"}\"\"\""},{"line_number":311,"context_line":"        instance \u003d keepalived.KeepalivedInstance("},{"line_number":312,"context_line":"            \u0027MASTER\u0027, \u0027eth0\u0027, 2, [\u0027169.254.192.0/18\u0027])"},{"line_number":313,"context_line":"        self.assertEqual(expected, \u0027\\n\u0027.join(instance.build_config()))"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def test_build_config_no_vips_track_script(self):"},{"line_number":316,"context_line":"        ts \u003d keepalived.KeepalivedTrackScript(5, \u0027/etc/ha_confs/qrouter-x\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_2ecac26d","line":313,"range":{"start_line":313,"start_character":35,"end_line":313,"end_character":39},"updated":"2016-05-09 16:21:20.000000000","message":"Please use os.linesep instead.","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"70acee0f8221c084378300b479b644d55e76664f","unresolved":false,"context_lines":[{"line_number":310,"context_line":"}\"\"\""},{"line_number":311,"context_line":"        instance \u003d keepalived.KeepalivedInstance("},{"line_number":312,"context_line":"            \u0027MASTER\u0027, \u0027eth0\u0027, 2, [\u0027169.254.192.0/18\u0027])"},{"line_number":313,"context_line":"        self.assertEqual(expected, \u0027\\n\u0027.join(instance.build_config()))"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def test_build_config_no_vips_track_script(self):"},{"line_number":316,"context_line":"        ts \u003d keepalived.KeepalivedTrackScript(5, \u0027/etc/ha_confs/qrouter-x\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_931033aa","line":313,"range":{"start_line":313,"start_character":35,"end_line":313,"end_character":39},"in_reply_to":"dab17558_2ecac26d","updated":"2016-05-09 19:21:58.000000000","message":"Done","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"542c8c86d92b2d8d1aa34a618db0acc9e8bbd607","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        self.assertEqual(expected, \u0027\\n\u0027.join(instance.build_config()))"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def test_build_config_no_vips_track_script(self):"},{"line_number":316,"context_line":"        ts \u003d keepalived.KeepalivedTrackScript(5, \u0027/etc/ha_confs/qrouter-x\u0027, 1)"},{"line_number":317,"context_line":"        expected \u003d \"\"\""},{"line_number":318,"context_line":"vrrp_script ha_health_check_1 {"},{"line_number":319,"context_line":"    script \"/etc/ha_confs/qrouter-x/ha_check_script_1.sh\""}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_cec69648","line":316,"range":{"start_line":316,"start_character":8,"end_line":316,"end_character":11},"updated":"2016-05-09 16:21:20.000000000","message":"Since \u0027ts\u0027 is only used once, we can simply move the creation of the object to line 337 and dump the variable.","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"70acee0f8221c084378300b479b644d55e76664f","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        self.assertEqual(expected, \u0027\\n\u0027.join(instance.build_config()))"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def test_build_config_no_vips_track_script(self):"},{"line_number":316,"context_line":"        ts \u003d keepalived.KeepalivedTrackScript(5, \u0027/etc/ha_confs/qrouter-x\u0027, 1)"},{"line_number":317,"context_line":"        expected \u003d \"\"\""},{"line_number":318,"context_line":"vrrp_script ha_health_check_1 {"},{"line_number":319,"context_line":"    script \"/etc/ha_confs/qrouter-x/ha_check_script_1.sh\""}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_5316cba7","line":316,"range":{"start_line":316,"start_character":8,"end_line":316,"end_character":11},"in_reply_to":"dab17558_cec69648","updated":"2016-05-09 19:21:58.000000000","message":"Done","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"542c8c86d92b2d8d1aa34a618db0acc9e8bbd607","unresolved":false,"context_lines":[{"line_number":378,"context_line":"            \u0027    rise 2\u0027,"},{"line_number":379,"context_line":"            \u0027}\u0027,"},{"line_number":380,"context_line":"            \u0027\u0027]"},{"line_number":381,"context_line":"        ts \u003d keepalived.KeepalivedTrackScript(5, \u0027/etc/ha_confs/qrouter-x\u0027, 1)"},{"line_number":382,"context_line":"        self.assertEqual(exp_conf, ts.build_config_preamble())"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def test_get_config_str(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_0ed89e1c","line":381,"range":{"start_line":381,"start_character":46,"end_line":381,"end_character":47},"updated":"2016-05-09 16:21:20.000000000","message":"The comment about magic numbers from above is relevant to all the \u00275\u0027s and \u00271\u0027s here.","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"70acee0f8221c084378300b479b644d55e76664f","unresolved":false,"context_lines":[{"line_number":378,"context_line":"            \u0027    rise 2\u0027,"},{"line_number":379,"context_line":"            \u0027}\u0027,"},{"line_number":380,"context_line":"            \u0027\u0027]"},{"line_number":381,"context_line":"        ts \u003d keepalived.KeepalivedTrackScript(5, \u0027/etc/ha_confs/qrouter-x\u0027, 1)"},{"line_number":382,"context_line":"        self.assertEqual(exp_conf, ts.build_config_preamble())"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def test_get_config_str(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_334b47cb","line":381,"range":{"start_line":381,"start_character":46,"end_line":381,"end_character":47},"in_reply_to":"dab17558_0ed89e1c","updated":"2016-05-09 19:21:58.000000000","message":"Done","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"542c8c86d92b2d8d1aa34a618db0acc9e8bbd607","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        ts.routes \u003d ["},{"line_number":387,"context_line":"            keepalived.KeepalivedVirtualRoute(\u002712.0.0.0\u0027, \u002710.0.0.0\u0027), ]"},{"line_number":388,"context_line":"        self.assertEqual("},{"line_number":389,"context_line":"            \u0027    track_script {\\n        ha_health_check_1\\n    }\u0027,"},{"line_number":390,"context_line":"            ts.get_config_str())"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def test_get_script_str(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_0eeffeb0","line":389,"range":{"start_line":389,"start_character":13,"end_line":389,"end_character":65},"updated":"2016-05-09 16:21:20.000000000","message":"Please use multilined strings as per the other tests.","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"70acee0f8221c084378300b479b644d55e76664f","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        ts.routes \u003d ["},{"line_number":387,"context_line":"            keepalived.KeepalivedVirtualRoute(\u002712.0.0.0\u0027, \u002710.0.0.0\u0027), ]"},{"line_number":388,"context_line":"        self.assertEqual("},{"line_number":389,"context_line":"            \u0027    track_script {\\n        ha_health_check_1\\n    }\u0027,"},{"line_number":390,"context_line":"            ts.get_config_str())"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def test_get_script_str(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_73130fb9","line":389,"range":{"start_line":389,"start_character":13,"end_line":389,"end_character":65},"in_reply_to":"dab17558_0eeffeb0","updated":"2016-05-09 19:21:58.000000000","message":"Done","commit_id":"71427763f4316f0f58495ece50a2a62c7fb483e3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":399,"context_line":"        ts \u003d keepalived.KeepalivedTrackScript("},{"line_number":400,"context_line":"            VRRP_INTERVAL, \u0027/etc/ha_confs/qrouter-x\u0027, VRRP_ID)"},{"line_number":401,"context_line":"        ts.routes \u003d ["},{"line_number":402,"context_line":"            keepalived.KeepalivedVirtualRoute(\u002712.0.0.0\u0027, \u002710.0.0.0\u0027), ]"},{"line_number":403,"context_line":"        ts.vips \u003d ["},{"line_number":404,"context_line":"            keepalived.KeepalivedVipAddress(\u0027192.168.0.3/18\u0027, \u0027ha-xxx\u0027), ]"},{"line_number":405,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_f08b8d1c","line":402,"updated":"2016-06-22 19:03:26.000000000","message":"Routes need to be in cidr notation, like \u002712.0.0.0/24\u0027","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        self.assertEqual(\"\"\"#!/bin/bash -eu"},{"line_number":407,"context_line":"ip a | grep 192.168.0.3 || exit 0"},{"line_number":408,"context_line":"ping -c 1 -w 1 -n 10.0.0.0 1\u003e/dev/null || exit 1\"\"\","},{"line_number":409,"context_line":"                         ts.get_script_str())"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def test_get_script_str_no_routes(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_30ceb5b4","line":408,"updated":"2016-06-22 19:03:26.000000000","message":"That doesn\u0027t look right at all, you\u0027re pinging the subnet, which will do this:\n\n$ ping 10.0.0.0\nDo you want to ping broadcast? Then -b\n$ echo $?\n2\n\nMaybe you meant to use 10.0.0.1 on L402 ?","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        ts \u003d keepalived.KeepalivedTrackScript(VRRP_INTERVAL, conf_dir, VRRP_ID)"},{"line_number":420,"context_line":"        ts.routes \u003d ["},{"line_number":421,"context_line":"            keepalived.KeepalivedVirtualRoute(\u002712.0.0.0\u0027, \u002710.0.0.0\u0027),"},{"line_number":422,"context_line":"            keepalived.KeepalivedVirtualRoute(\u00272001:db8::1\u0027, \u00272001:db8::1\u0027), ]"},{"line_number":423,"context_line":"        with mock.patch.object(keepalived, \u0027common_utils\u0027) as patched_utils:"},{"line_number":424,"context_line":"            ts.write_check_script()"},{"line_number":425,"context_line":"            patched_utils.replace_file.assert_called_with("}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_d0ae5184","line":422,"updated":"2016-06-22 19:03:26.000000000","message":"Same issue here.","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                \"\"\"#!/bin/bash -eu"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"ping -c 1 -w 1 -n 10.0.0.0 1\u003e/dev/null || exit 1"},{"line_number":430,"context_line":"ping6 -c 1 -w 1 -n 2001:db8::1 1\u003e/dev/null || exit 1\"\"\","},{"line_number":431,"context_line":"                0o520"},{"line_number":432,"context_line":"            )"},{"line_number":433,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_f0b9cdcc","line":430,"updated":"2016-06-22 19:03:26.000000000","message":"and here","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"}],"releasenotes/notes/add-keepalived-vrrp-healt-check-f23ed7c853151484.yaml":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b010afc03fdebd1246becc3045bf209f74d94af8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  - Activation of these feature enable gateway"},{"line_number":8,"context_line":"    connectivity validation and rescheduling \"master\""},{"line_number":9,"context_line":"    router to another node in case of connectivity"},{"line_number":10,"context_line":"    loose."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"3aaa91ec_30eb55b2","line":10,"updated":"2016-06-22 19:03:26.000000000","message":"There\u0027s some grammatical errors in both of these paragraphs.","commit_id":"ba64275469c29e381d6f2a4c926c09d7b1b95ad7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"0777fd93edd1bbf50efbbdc064d90abb8a99a4a0","unresolved":false,"context_lines":[{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - Activation of these feature enable gateway connectivity validation and"},{"line_number":7,"context_line":"    rescheduling \"master\" router to another node in case of losing"},{"line_number":8,"context_line":"    connectivity."}],"source_content_type":"text/x-yaml","patch_set":38,"id":"3a461143_d003f5b6","line":8,"updated":"2017-01-26 08:02:49.000000000","message":"add a note here indicating that if the gateway connectivity goes away, all of the routers will transition to backup. I think that\u0027s an important consideration when enabling this feature because it makes the gateway ICMP responses critical.","commit_id":"a0b72a843e12725fc9e9ca9abd9fb95eb60d1412"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1a324a69fb0ef4e0afcc8fd9f57fed5e9d4cce21","unresolved":false,"context_lines":[{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - Activation of these feature enable gateway connectivity validation and"},{"line_number":7,"context_line":"    rescheduling \"master\" router to another node in case of losing"},{"line_number":8,"context_line":"    connectivity."}],"source_content_type":"text/x-yaml","patch_set":38,"id":"3a461143_023d252b","line":8,"in_reply_to":"3a461143_d003f5b6","updated":"2017-01-26 14:14:42.000000000","message":"If all routers go away, both of them will become master. I can add a sentence here:\n\"In case of all routers loose its connectivity to gateway, the election process will be repeated round-robin until one of the router restore the gateway connection. In the mean time, all of the routers will be reported as \u0027master\u0027\"","commit_id":"a0b72a843e12725fc9e9ca9abd9fb95eb60d1412"}]}
