)]}'
{"neutron/plugins/ml2/drivers/linuxbridge/agent/arp_protect.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"477b674af90841735a2b00617412647ce8deb9b7","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    install_arp_spoofing_protection(vif, addresses)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def chain_name(vif):"},{"line_number":52,"context_line":"    # start each chain with a common identifer for cleanup to find"},{"line_number":53,"context_line":"    return \u0027%s%s\u0027 % (SPOOF_CHAIN_PREFIX, vif)"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_13e1419a","line":51,"updated":"2015-07-01 20:25:16.000000000","message":"max chain name length is 32, prefix/vif lengths are 12/15 \u003d\u003e OK","commit_id":"c42029943a23a89cad8ccc7bed259235ba98a9fd"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"477b674af90841735a2b00617412647ce8deb9b7","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                  chain_name(vif), \u0027-p\u0027, \u0027ARP\u0027])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def vif_jumps_present(vifs):"},{"line_number":103,"context_line":"    # returns a dict keyed by vif indicating whether or not each has a jump"},{"line_number":104,"context_line":"    output \u003d ebtables([\u0027-L\u0027, \u0027FORWARD\u0027]).splitlines()"},{"line_number":105,"context_line":"    resp \u003d {vif: vif_jump_present(vif, output) for vif in vifs}"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_0e5efa11","line":102,"updated":"2015-07-01 20:25:16.000000000","message":"get_vif_jump(s) seem clearer?","commit_id":"c42029943a23a89cad8ccc7bed259235ba98a9fd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1dd9efba3f0d88a823126c7c61409482864cea1f","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                  chain_name(vif), \u0027-p\u0027, \u0027ARP\u0027])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def vif_jumps_present(vifs):"},{"line_number":103,"context_line":"    # returns a dict keyed by vif indicating whether or not each has a jump"},{"line_number":104,"context_line":"    output \u003d ebtables([\u0027-L\u0027, \u0027FORWARD\u0027]).splitlines()"},{"line_number":105,"context_line":"    resp \u003d {vif: vif_jump_present(vif, output) for vif in vifs}"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_8fac0f8d","line":102,"in_reply_to":"ba3cc151_0e5efa11","updated":"2015-07-02 19:29:27.000000000","message":"Done","commit_id":"c42029943a23a89cad8ccc7bed259235ba98a9fd"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"477b674af90841735a2b00617412647ce8deb9b7","unresolved":false,"context_lines":[{"line_number":102,"context_line":"def vif_jumps_present(vifs):"},{"line_number":103,"context_line":"    # returns a dict keyed by vif indicating whether or not each has a jump"},{"line_number":104,"context_line":"    output \u003d ebtables([\u0027-L\u0027, \u0027FORWARD\u0027]).splitlines()"},{"line_number":105,"context_line":"    resp \u003d {vif: vif_jump_present(vif, output) for vif in vifs}"},{"line_number":106,"context_line":"    return resp"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_8eb76af4","line":105,"updated":"2015-07-01 20:25:16.000000000","message":"this can be improved by parsing once the output but not sure it will be readable nor efficient as length(vifs) should be small?","commit_id":"c42029943a23a89cad8ccc7bed259235ba98a9fd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1dd9efba3f0d88a823126c7c61409482864cea1f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"def vif_jumps_present(vifs):"},{"line_number":103,"context_line":"    # returns a dict keyed by vif indicating whether or not each has a jump"},{"line_number":104,"context_line":"    output \u003d ebtables([\u0027-L\u0027, \u0027FORWARD\u0027]).splitlines()"},{"line_number":105,"context_line":"    resp \u003d {vif: vif_jump_present(vif, output) for vif in vifs}"},{"line_number":106,"context_line":"    return resp"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_6fe3cbd9","line":105,"in_reply_to":"ba3cc151_8eb76af4","updated":"2015-07-02 19:29:27.000000000","message":"yeah, most of the time it will only be a small amount of vifs. we can revisit this later if it turns out we are frequently doing large amounts at once.","commit_id":"c42029943a23a89cad8ccc7bed259235ba98a9fd"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"477b674af90841735a2b00617412647ce8deb9b7","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"def ebtables(comm, may_exist\u003dTrue):"},{"line_number":122,"context_line":"    if NAMESPACE:"},{"line_number":123,"context_line":"        execute \u003d ip_lib.IPWrapper(NAMESPACE).netns.execute"},{"line_number":124,"context_line":"    else:"},{"line_number":125,"context_line":"        execute \u003d utils.execute"},{"line_number":126,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_8e5a0a29","line":123,"updated":"2015-07-01 20:25:16.000000000","message":"execute \u003d ip_lib.IPWrapper(NAMESPACE).netns.execute works also when NAMESPACE is NONE?","commit_id":"c42029943a23a89cad8ccc7bed259235ba98a9fd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1dd9efba3f0d88a823126c7c61409482864cea1f","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"def ebtables(comm, may_exist\u003dTrue):"},{"line_number":122,"context_line":"    if NAMESPACE:"},{"line_number":123,"context_line":"        execute \u003d ip_lib.IPWrapper(NAMESPACE).netns.execute"},{"line_number":124,"context_line":"    else:"},{"line_number":125,"context_line":"        execute \u003d utils.execute"},{"line_number":126,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_6f318b59","line":123,"in_reply_to":"ba3cc151_8e5a0a29","updated":"2015-07-02 19:29:27.000000000","message":"oh cool. thanks for the pointer.","commit_id":"c42029943a23a89cad8ccc7bed259235ba98a9fd"}],"neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1f7e4df704e000d0cce84576971485230aa99647","unresolved":false,"context_lines":[{"line_number":938,"context_line":"        return False"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    @staticmethod"},{"line_number":941,"context_line":"    def setup_arp_spoofing_protection(vif, port_details):"},{"line_number":942,"context_line":"        if not port_details.get(\u0027port_security_enabled\u0027, True):"},{"line_number":943,"context_line":"            # clear any previous entries related to this port"},{"line_number":944,"context_line":"            delete_arp_spoofing_protection(vif)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_9e134eb8","line":941,"updated":"2015-06-30 23:04:26.000000000","message":"setup_arp_spoofing is only called when an interface is added so ebtable rules are never deleted when a port is deleted? Am i missing something?","commit_id":"daa526e61574678dceca946131887cc44aca4a47"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"3a6ca10b59477feed36e6b6cef4be71db6320c4b","unresolved":false,"context_lines":[{"line_number":938,"context_line":"        return False"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    @staticmethod"},{"line_number":941,"context_line":"    def setup_arp_spoofing_protection(vif, port_details):"},{"line_number":942,"context_line":"        if not port_details.get(\u0027port_security_enabled\u0027, True):"},{"line_number":943,"context_line":"            # clear any previous entries related to this port"},{"line_number":944,"context_line":"            delete_arp_spoofing_protection(vif)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_af64d748","line":941,"in_reply_to":"ba3cc151_9e134eb8","updated":"2015-07-01 05:48:01.000000000","message":"Not implemented yet. :)","commit_id":"daa526e61574678dceca946131887cc44aca4a47"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1f7e4df704e000d0cce84576971485230aa99647","unresolved":false,"context_lines":[{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"@lockutils.synchronized(\u0027ebtables\u0027)"},{"line_number":1079,"context_line":"def install_arp_spoofing_protection(vif, addresses):"},{"line_number":1080,"context_line":"    # make a VIF-specific ARP chain so we don\u0027t conflict with other rules"},{"line_number":1081,"context_line":"    ebtables([\u0027-N\u0027, vif, \u0027-P\u0027, \u0027DROP\u0027])"},{"line_number":1082,"context_line":"    # flush the chain to clear previous accepts. this will cause dropped ARP"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_fe54da21","line":1079,"updated":"2015-06-30 23:04:26.000000000","message":"On port create, this method performs 5+ system call to ebtables ... is it scalable?","commit_id":"daa526e61574678dceca946131887cc44aca4a47"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"3a6ca10b59477feed36e6b6cef4be71db6320c4b","unresolved":false,"context_lines":[{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"@lockutils.synchronized(\u0027ebtables\u0027)"},{"line_number":1079,"context_line":"def install_arp_spoofing_protection(vif, addresses):"},{"line_number":1080,"context_line":"    # make a VIF-specific ARP chain so we don\u0027t conflict with other rules"},{"line_number":1081,"context_line":"    ebtables([\u0027-N\u0027, vif, \u0027-P\u0027, \u0027DROP\u0027])"},{"line_number":1082,"context_line":"    # flush the chain to clear previous accepts. this will cause dropped ARP"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_4f366b53","line":1079,"in_reply_to":"ba3cc151_fe54da21","updated":"2015-07-01 05:48:01.000000000","message":"In local testing, it can setup 200 ports in about 9 seconds.","commit_id":"daa526e61574678dceca946131887cc44aca4a47"},{"author":{"_account_id":3031,"name":"Sam Morrison","email":"sorrison@gmail.com","username":"sorrison"},"change_message_id":"bb43f47b8b1b02971c7c9366e294ea3a82db574c","unresolved":false,"context_lines":[{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"@lockutils.synchronized(\u0027ebtables\u0027)"},{"line_number":1079,"context_line":"def install_arp_spoofing_protection(vif, addresses):"},{"line_number":1080,"context_line":"    # make a VIF-specific ARP chain so we don\u0027t conflict with other rules"},{"line_number":1081,"context_line":"    ebtables([\u0027-N\u0027, vif, \u0027-P\u0027, \u0027DROP\u0027])"},{"line_number":1082,"context_line":"    # flush the chain to clear previous accepts. this will cause dropped ARP"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_31a03390","line":1079,"in_reply_to":"ba3cc151_fe54da21","updated":"2015-06-30 23:25:03.000000000","message":"This is how it works in nova-network. See nova/network/linux_net.py","commit_id":"daa526e61574678dceca946131887cc44aca4a47"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1f7e4df704e000d0cce84576971485230aa99647","unresolved":false,"context_lines":[{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def vif_jump_present(vif):"},{"line_number":1095,"context_line":"    for line in ebtables([\u0027-L\u0027, \u0027FORWARD\u0027]).splitlines():"},{"line_number":1096,"context_line":"        if all([(\u0027-i %s\u0027 % vif) in line,"},{"line_number":1097,"context_line":"                (\u0027-j %s\u0027 % vif) in line,"},{"line_number":1098,"context_line":"                (\u0027-p ARP\u0027) in line]):"},{"line_number":1099,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_7ee1aafd","line":1096,"updated":"2015-06-30 23:04:26.000000000","message":"imo, x and y and z is really clearer than all([x, y, z])\n\nalso x, y are computed for every line until you find the winner, this seems clearer and more efficient:\n\n  searchs \u003d (\u0027-i %s\u0027 % vif, \u0027-j %s\u0027 % vif, \u0027-p ARP\u0027)\n  for line in ...:\n    if all(s in line for s in searchs):\n      return True\n  return False\n\nor\n\n  return any(\n     all(s in line for s in searchs)\n     for line in ...)","commit_id":"daa526e61574678dceca946131887cc44aca4a47"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"3a6ca10b59477feed36e6b6cef4be71db6320c4b","unresolved":false,"context_lines":[{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def vif_jump_present(vif):"},{"line_number":1095,"context_line":"    for line in ebtables([\u0027-L\u0027, \u0027FORWARD\u0027]).splitlines():"},{"line_number":1096,"context_line":"        if all([(\u0027-i %s\u0027 % vif) in line,"},{"line_number":1097,"context_line":"                (\u0027-j %s\u0027 % vif) in line,"},{"line_number":1098,"context_line":"                (\u0027-p ARP\u0027) in line]):"},{"line_number":1099,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_0f2863e1","line":1096,"in_reply_to":"ba3cc151_7ee1aafd","updated":"2015-07-01 05:48:01.000000000","message":"Done","commit_id":"daa526e61574678dceca946131887cc44aca4a47"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"2f4e5661bdb4b53318b98f602d000d8253440247","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"    return False"},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"def ebtables(comm, may_exist\u003dTrue):"},{"line_number":1104,"context_line":"    try:"},{"line_number":1105,"context_line":"        return utils.execute([\u0027ebtables\u0027] + comm, run_as_root\u003dTrue)"},{"line_number":1106,"context_line":"    except RuntimeError as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_e9cbc91c","line":1103,"updated":"2015-06-30 22:08:02.000000000","message":"#TODO: retry mechanism on lock error","commit_id":"daa526e61574678dceca946131887cc44aca4a47"}],"neutron/tests/functional/agent/linux/test_linuxbridge_arp_protect.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"477b674af90841735a2b00617412647ce8deb9b7","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def setUp(self):"},{"line_number":29,"context_line":"        super(LinuxBridgeARPSpoofTestCase, self).setUp()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        self.addCleanup(setattr, machine_fixtures.PeerMachines, \u0027AMOUNT\u0027,"},{"line_number":32,"context_line":"                        machine_fixtures.PeerMachines.AMOUNT)"},{"line_number":33,"context_line":"        machine_fixtures.PeerMachines.AMOUNT \u003d 3"},{"line_number":34,"context_line":"        lbfixture \u003d self.useFixture(net_helpers.LinuxBridgeFixture())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_0ea91a7b","line":31,"updated":"2015-07-01 20:25:16.000000000","message":"i would prefer you update PeerMachines to allow custom amount","commit_id":"c42029943a23a89cad8ccc7bed259235ba98a9fd"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8703c6049c192250c845e1e276929edbe448d328","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def setUp(self):"},{"line_number":29,"context_line":"        super(LinuxBridgeARPSpoofTestCase, self).setUp()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        self.addCleanup(setattr, machine_fixtures.PeerMachines, \u0027AMOUNT\u0027,"},{"line_number":32,"context_line":"                        machine_fixtures.PeerMachines.AMOUNT)"},{"line_number":33,"context_line":"        machine_fixtures.PeerMachines.AMOUNT \u003d 3"},{"line_number":34,"context_line":"        lbfixture \u003d self.useFixture(net_helpers.LinuxBridgeFixture())"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_fb0e538b","line":31,"updated":"2015-07-06 21:22:12.000000000","message":"machine_fixtures has been merged in liberty, will we remove functional tests in stable/kilo?\n\ni would also prefer we allow to set PeerMachines amount instead of monkey patching PeerMachines","commit_id":"c6560952cdd7f962f5e5f8208d9d1c5e2d51c935"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5315aca4eead4576989ffbe5d0514e5a9f40b272","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def setUp(self):"},{"line_number":29,"context_line":"        super(LinuxBridgeARPSpoofTestCase, self).setUp()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        self.addCleanup(setattr, machine_fixtures.PeerMachines, \u0027AMOUNT\u0027,"},{"line_number":32,"context_line":"                        machine_fixtures.PeerMachines.AMOUNT)"},{"line_number":33,"context_line":"        machine_fixtures.PeerMachines.AMOUNT \u003d 3"},{"line_number":34,"context_line":"        lbfixture \u003d self.useFixture(net_helpers.LinuxBridgeFixture())"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_e15784c8","line":31,"in_reply_to":"ba3cc151_fb0e538b","updated":"2015-07-06 22:09:55.000000000","message":"yes, I think I will just have to pull out the functional tests.\n\nI will update PeerMachines to take \u0027amount\u0027 in the constructor.","commit_id":"c6560952cdd7f962f5e5f8208d9d1c5e2d51c935"}]}
