)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"44cf007b55a8c0aa821c09141a65654c1dd41e99","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Assign local VLANs before port filters"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Assign local VLANs ahead of establishing port filters so that"},{"line_number":10,"context_line":"actions for OVS flows for security group rules can be appropriately"},{"line_number":11,"context_line":"determined."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I18f585afc4a342ce97033021a3c3dfb1776695ba"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAUH%2F%2BI7k%3D","line":10,"updated":"2014-01-29 20:18:55.000000000","message":"A little more description about how this change enables determining security group rules could be helpful here.","commit_id":"9c573158bebc39c377300df29e9ca2d7b9481996"}],"neutron/plugins/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"44cf007b55a8c0aa821c09141a65654c1dd41e99","unresolved":false,"context_lines":[{"line_number":60,"context_line":"# attributes set)."},{"line_number":61,"context_line":"class LocalVLANMapping:"},{"line_number":62,"context_line":"    def __init__(self, vlan, network_type, physical_network, segmentation_id,"},{"line_number":63,"context_line":"                 vif_ports\u003dNone, provisioned\u003dFalse):"},{"line_number":64,"context_line":"        if vif_ports is None:"},{"line_number":65,"context_line":"            vif_ports \u003d {}"},{"line_number":66,"context_line":"        self.vlan \u003d vlan"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2BIsM%3D","line":63,"updated":"2014-01-29 20:18:55.000000000","message":"No one passes this argument.  I\u0027d remove it until a need to add an option surfaces.","commit_id":"9c573158bebc39c377300df29e9ca2d7b9481996"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"44cf007b55a8c0aa821c09141a65654c1dd41e99","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.vif_ports \u003d vif_ports"},{"line_number":71,"context_line":"        # set of tunnel ports on which packets should be flooded"},{"line_number":72,"context_line":"        self.tun_ofports \u003d set()"},{"line_number":73,"context_line":"        self.provisioned \u003d provisioned"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def __str__(self):"},{"line_number":76,"context_line":"        return (\"lv-id \u003d %s type \u003d %s phys-net \u003d %s phys-id \u003d %s\" %"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2BIsU%3D","line":73,"updated":"2014-01-29 20:18:55.000000000","message":"Just initialize to False.","commit_id":"9c573158bebc39c377300df29e9ca2d7b9481996"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"81480fa70fa3fd4718a1a3e81fb348f04442d592","unresolved":false,"context_lines":[{"line_number":603,"context_line":"        \u0027\u0027\u0027"},{"line_number":604,"context_line":"        lvm \u003d self.local_vlan_map[net_uuid]"},{"line_number":605,"context_line":"        if not lvm.provisioned:"},{"line_number":606,"context_line":"            self.provision_local_vlan(net_uuid, network_type, physical_network,"},{"line_number":607,"context_line":"                                      segmentation_id)"},{"line_number":608,"context_line":"            lvm.provisioned \u003d True"},{"line_number":609,"context_line":"        lvm.vif_ports[port.vif_id] \u003d port"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FTww%3D","line":606,"updated":"2014-01-15 07:44:23.000000000","message":"isn\u0027t this done eagerly. see the comment blow.","commit_id":"9c573158bebc39c377300df29e9ca2d7b9481996"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"change_message_id":"81480fa70fa3fd4718a1a3e81fb348f04442d592","unresolved":false,"context_lines":[{"line_number":952,"context_line":"                port and"},{"line_number":953,"context_line":"                details[\u0027admin_state_up\u0027] and"},{"line_number":954,"context_line":"                details[\u0027network_id\u0027] not in self.local_vlan_map):"},{"line_number":955,"context_line":"                self.assign_local_vlan(details[\u0027network_id\u0027],"},{"line_number":956,"context_line":"                                       details[\u0027network_type\u0027],"},{"line_number":957,"context_line":"                                       details[\u0027physical_network\u0027],"},{"line_number":958,"context_line":"                                       details[\u0027segmentation_id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FTw0%3D","line":955,"updated":"2014-01-15 07:44:23.000000000","message":"Instead of spliting it into assign/provision, can we do it once here?\nThen, LocalVlanMapping.provisioned will be unncessary.","commit_id":"9c573158bebc39c377300df29e9ca2d7b9481996"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"44cf007b55a8c0aa821c09141a65654c1dd41e99","unresolved":false,"context_lines":[{"line_number":952,"context_line":"                port and"},{"line_number":953,"context_line":"                details[\u0027admin_state_up\u0027] and"},{"line_number":954,"context_line":"                details[\u0027network_id\u0027] not in self.local_vlan_map):"},{"line_number":955,"context_line":"                self.assign_local_vlan(details[\u0027network_id\u0027],"},{"line_number":956,"context_line":"                                       details[\u0027network_type\u0027],"},{"line_number":957,"context_line":"                                       details[\u0027physical_network\u0027],"},{"line_number":958,"context_line":"                                       details[\u0027segmentation_id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2BI5w%3D","line":955,"in_reply_to":"AAAAUH%2F%2FSBs%3D","updated":"2014-01-29 20:18:55.000000000","message":"Amir, your explanation here in your gerrit comment would go well in the commit message.  It was helpful for me to understand the motivation behind the patch.","commit_id":"9c573158bebc39c377300df29e9ca2d7b9481996"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"fb92bb06e5dedd4834da65ad010f0aaf74f3cde8","unresolved":false,"context_lines":[{"line_number":952,"context_line":"                port and"},{"line_number":953,"context_line":"                details[\u0027admin_state_up\u0027] and"},{"line_number":954,"context_line":"                details[\u0027network_id\u0027] not in self.local_vlan_map):"},{"line_number":955,"context_line":"                self.assign_local_vlan(details[\u0027network_id\u0027],"},{"line_number":956,"context_line":"                                       details[\u0027network_type\u0027],"},{"line_number":957,"context_line":"                                       details[\u0027physical_network\u0027],"},{"line_number":958,"context_line":"                                       details[\u0027segmentation_id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FSBs%3D","line":955,"in_reply_to":"AAAAUH%2F%2FSEs%3D","updated":"2014-01-15 14:39:16.000000000","message":"I agree with Amir\u0027s comments here and the approach he\u0027s taken.","commit_id":"9c573158bebc39c377300df29e9ca2d7b9481996"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"166c82bea24f23dcdf3fa4743f4989dfd08ff53e","unresolved":false,"context_lines":[{"line_number":952,"context_line":"                port and"},{"line_number":953,"context_line":"                details[\u0027admin_state_up\u0027] and"},{"line_number":954,"context_line":"                details[\u0027network_id\u0027] not in self.local_vlan_map):"},{"line_number":955,"context_line":"                self.assign_local_vlan(details[\u0027network_id\u0027],"},{"line_number":956,"context_line":"                                       details[\u0027network_type\u0027],"},{"line_number":957,"context_line":"                                       details[\u0027physical_network\u0027],"},{"line_number":958,"context_line":"                                       details[\u0027segmentation_id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FSEs%3D","line":955,"in_reply_to":"AAAAUH%2F%2FTw0%3D","updated":"2014-01-15 14:32:37.000000000","message":"Provisioning cannot occur before security group port filters are in place (connectivity would be established without security!). Also, assignment must occur before security group port filters are in place (firewall has to use the local vlan to forward the packet). Thus, the correct order is to assign, secure, and then provision.","commit_id":"9c573158bebc39c377300df29e9ca2d7b9481996"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"906df6025a3e7a08ee7082aed74ccd85fd4c1e08","unresolved":false,"context_lines":[{"line_number":601,"context_line":"        if not lvm.provisioned:"},{"line_number":602,"context_line":"            self.provision_local_vlan(net_uuid, network_type, physical_network,"},{"line_number":603,"context_line":"                                      segmentation_id)"},{"line_number":604,"context_line":"            lvm.provisioned \u003d True"},{"line_number":605,"context_line":"        lvm.vif_ports[port.vif_id] \u003d port"},{"line_number":606,"context_line":"        # Do not bind a port if it\u0027s already bound"},{"line_number":607,"context_line":"        cur_tag \u003d self.int_br.db_get_val(\"Port\", port.port_name, \"tag\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_d77de96f","line":604,"updated":"2014-06-03 11:23:59.000000000","message":"I agree with Carl","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"fc91835016e3b960b2e867e00783c9ffc6ffdf8a","unresolved":false,"context_lines":[{"line_number":601,"context_line":"        if not lvm.provisioned:"},{"line_number":602,"context_line":"            self.provision_local_vlan(net_uuid, network_type, physical_network,"},{"line_number":603,"context_line":"                                      segmentation_id)"},{"line_number":604,"context_line":"            lvm.provisioned \u003d True"},{"line_number":605,"context_line":"        lvm.vif_ports[port.vif_id] \u003d port"},{"line_number":606,"context_line":"        # Do not bind a port if it\u0027s already bound"},{"line_number":607,"context_line":"        cur_tag \u003d self.int_br.db_get_val(\"Port\", port.port_name, \"tag\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_c4c82077","line":604,"updated":"2014-05-09 04:20:52.000000000","message":"Nit:  This provisioned check might be more at home in the provision_local_vlan method.","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"fc91835016e3b960b2e867e00783c9ffc6ffdf8a","unresolved":false,"context_lines":[{"line_number":962,"context_line":"        vif_ports \u003d dict()"},{"line_number":963,"context_line":"        for device in devices:"},{"line_number":964,"context_line":"            vif_ports[device] \u003d self.int_br.get_vif_port_by_id(device)"},{"line_number":965,"context_line":"        return vif_ports"},{"line_number":966,"context_line":""},{"line_number":967,"context_line":"    def retrieve_devices_details(self, devices, vif_ports):"},{"line_number":968,"context_line":"        devices_details \u003d dict()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_449a5064","line":965,"updated":"2014-05-09 04:20:52.000000000","message":"Optional:  dict((d,self.int_br.get_vif_port_by_id(d)) for d in devices)","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"906df6025a3e7a08ee7082aed74ccd85fd4c1e08","unresolved":false,"context_lines":[{"line_number":967,"context_line":"    def retrieve_devices_details(self, devices, vif_ports):"},{"line_number":968,"context_line":"        devices_details \u003d dict()"},{"line_number":969,"context_line":"        for device in devices:"},{"line_number":970,"context_line":"            port \u003d vif_ports[device]"},{"line_number":971,"context_line":"            if not port:"},{"line_number":972,"context_line":"                # The port has disappeared and should not be processed"},{"line_number":973,"context_line":"                # There is no need to put the port DOWN in the plugin as"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_f7802548","line":970,"updated":"2014-06-03 11:23:59.000000000","message":"+1 This should be inlined.  Assignment does not provide value here","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"fc91835016e3b960b2e867e00783c9ffc6ffdf8a","unresolved":false,"context_lines":[{"line_number":967,"context_line":"    def retrieve_devices_details(self, devices, vif_ports):"},{"line_number":968,"context_line":"        devices_details \u003d dict()"},{"line_number":969,"context_line":"        for device in devices:"},{"line_number":970,"context_line":"            port \u003d vif_ports[device]"},{"line_number":971,"context_line":"            if not port:"},{"line_number":972,"context_line":"                # The port has disappeared and should not be processed"},{"line_number":973,"context_line":"                # There is no need to put the port DOWN in the plugin as"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_a43cf430","line":970,"updated":"2014-05-09 04:20:52.000000000","message":"Should this be vif_ports.get(...)?\n\nNit:  The variable port adds little value consider inlining.","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"da5f266fdc2fb748568d6898da69b086cfbbbecc","unresolved":false,"context_lines":[{"line_number":967,"context_line":"    def retrieve_devices_details(self, devices, vif_ports):"},{"line_number":968,"context_line":"        devices_details \u003d dict()"},{"line_number":969,"context_line":"        for device in devices:"},{"line_number":970,"context_line":"            port \u003d vif_ports[device]"},{"line_number":971,"context_line":"            if not port:"},{"line_number":972,"context_line":"                # The port has disappeared and should not be processed"},{"line_number":973,"context_line":"                # There is no need to put the port DOWN in the plugin as"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_5850bb31","line":970,"in_reply_to":"7adec928_1d916c52","updated":"2014-05-20 03:50:08.000000000","message":"I don\u0027t buy it.  These two methods -- retrieve_vif_ports and retrieve_devices_details -- are written independently.  Your guarantee comes from the context from which they are called (L1108).  A method should not depend on guarantees coming from the context where they happen to be called.  What happens when the context changes?  Are you prepared to guarantee this in to the future in the face of code refactoring and enhancements?","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"560bfd3b63cfa67c36bc1b3d343399b3006ef843","unresolved":false,"context_lines":[{"line_number":967,"context_line":"    def retrieve_devices_details(self, devices, vif_ports):"},{"line_number":968,"context_line":"        devices_details \u003d dict()"},{"line_number":969,"context_line":"        for device in devices:"},{"line_number":970,"context_line":"            port \u003d vif_ports[device]"},{"line_number":971,"context_line":"            if not port:"},{"line_number":972,"context_line":"                # The port has disappeared and should not be processed"},{"line_number":973,"context_line":"                # There is no need to put the port DOWN in the plugin as"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_1d916c52","line":970,"in_reply_to":"7adec928_a43cf430","updated":"2014-05-09 23:49:49.000000000","message":"No, vif_ports is guaranteed to have a value for all elements of the devices iterable as enumerated in retrieve_vif_ports.","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"906df6025a3e7a08ee7082aed74ccd85fd4c1e08","unresolved":false,"context_lines":[{"line_number":989,"context_line":"        return devices_details"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"    def ensure_local_vlans_are_assigned(self, devices_details, vif_ports):"},{"line_number":992,"context_line":"        for device in devices_details:"},{"line_number":993,"context_line":"            port \u003d vif_ports[device]"},{"line_number":994,"context_line":"            details \u003d devices_details[device]"},{"line_number":995,"context_line":"            if (\u0027port_id\u0027 in details and"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ae5cdf2_17975191","line":992,"updated":"2014-06-03 11:23:59.000000000","message":"+1 please use iteritems","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"fc91835016e3b960b2e867e00783c9ffc6ffdf8a","unresolved":false,"context_lines":[{"line_number":989,"context_line":"        return devices_details"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"    def ensure_local_vlans_are_assigned(self, devices_details, vif_ports):"},{"line_number":992,"context_line":"        for device in devices_details:"},{"line_number":993,"context_line":"            port \u003d vif_ports[device]"},{"line_number":994,"context_line":"            details \u003d devices_details[device]"},{"line_number":995,"context_line":"            if (\u0027port_id\u0027 in details and"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_84d1b8fd","line":992,"updated":"2014-05-09 04:20:52.000000000","message":"nit:  for device, details in device_details.iteritems():","commit_id":"38de7209b0e1ca0f93d20b05f4b17d27f35258af"}]}
