)]}'
{"neutron/db/ipam_backend_mixin.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"cf0007fc4d3aac557e79e2c9938e5b4313113612","unresolved":false,"context_lines":[{"line_number":545,"context_line":"        # Note:  This seems redundant, but its not because it has to cover"},{"line_number":546,"context_line":"        # cases where host is None, ATTR_NOT_SPECIFIED, or \u0027\u0027 due to"},{"line_number":547,"context_line":"        # differences in host binding implementations."},{"line_number":548,"context_line":"        if not validators.is_attr_set(host) or not host:"},{"line_number":549,"context_line":"            query \u003d query.filter(Subnet.segment_id.is_(None))"},{"line_number":550,"context_line":"            return [self._make_subnet_dict(c, context\u003dcontext) for c in query]"},{"line_number":551,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_8e1b17ca","line":548,"updated":"2016-06-07 22:32:05.000000000","message":"This was a problem when the unit test did a port create followed by a port update.  Neither had host binding information.\n\nWith the generic plugin, using the common port binding implementation, host is None here in the port update.\n\nWith ML2, using its own port binding implementation, host is \u0027\u0027 (empty string) here in the port update.  :(  I wish ML2 had used null to record no host binding instead of an empty string.","commit_id":"3a1c7aa4112eb0bd35e565ea73a9647090f744f1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"4a37e9b3afb96ea7ce64033c009503b8feac3af9","unresolved":false,"context_lines":[{"line_number":545,"context_line":"        # Note:  This seems redundant, but its not because it has to cover"},{"line_number":546,"context_line":"        # cases where host is None, ATTR_NOT_SPECIFIED, or \u0027\u0027 due to"},{"line_number":547,"context_line":"        # differences in host binding implementations."},{"line_number":548,"context_line":"        if not validators.is_attr_set(host) or not host:"},{"line_number":549,"context_line":"            query \u003d query.filter(Subnet.segment_id.is_(None))"},{"line_number":550,"context_line":"            return [self._make_subnet_dict(c, context\u003dcontext) for c in query]"},{"line_number":551,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_739e76b9","line":548,"in_reply_to":"7aa08908_512f19f6","updated":"2016-06-10 19:38:05.000000000","message":"It might be worth bringing up in the ML2 meeting.  I wouldn\u0027t hold up this patch for it though.  I\u0027ll put it on the agenda and they can comment here.","commit_id":"3a1c7aa4112eb0bd35e565ea73a9647090f744f1"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"00ef5cdbbe63a4381f31c7e1dd3b7d85bf456bd2","unresolved":false,"context_lines":[{"line_number":545,"context_line":"        # Note:  This seems redundant, but its not because it has to cover"},{"line_number":546,"context_line":"        # cases where host is None, ATTR_NOT_SPECIFIED, or \u0027\u0027 due to"},{"line_number":547,"context_line":"        # differences in host binding implementations."},{"line_number":548,"context_line":"        if not validators.is_attr_set(host) or not host:"},{"line_number":549,"context_line":"            query \u003d query.filter(Subnet.segment_id.is_(None))"},{"line_number":550,"context_line":"            return [self._make_subnet_dict(c, context\u003dcontext) for c in query]"},{"line_number":551,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_512f19f6","line":548,"in_reply_to":"bab6814e_8e1b17ca","updated":"2016-06-10 08:24:59.000000000","message":"ouch that\u0027s annoying...I wonder if we should fix this in ml2. This would require a migration for the port binding table. Probably in the ml2 code the assumption in many places is that host cannot be None so we might need to modify code here and there. What do you think?","commit_id":"3a1c7aa4112eb0bd35e565ea73a9647090f744f1"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"6f54065b7a0d15b31a5e45652421a2fe12429e54","unresolved":false,"context_lines":[{"line_number":542,"context_line":""},{"line_number":543,"context_line":"        query \u003d self._get_collection_query(context, Subnet)"},{"line_number":544,"context_line":"        query \u003d query.filter(Subnet.network_id \u003d\u003d network_id)"},{"line_number":545,"context_line":"        # Note:  This seems redundant, but its not.  It has to cover cases"},{"line_number":546,"context_line":"        # where host is None, ATTR_NOT_SPECIFIED, or \u0027\u0027 due to differences in"},{"line_number":547,"context_line":"        # host binding implementations."},{"line_number":548,"context_line":"        if not validators.is_attr_set(host) or not host:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_f16c4538","line":545,"updated":"2016-06-10 08:28:41.000000000","message":"please see my comment in PS1","commit_id":"f2411974ef7b3fa8a9f3aa30e1164a2a3300bc04"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"20760ed4f329435b51c169b1a0b3624f17e0ecef","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                    # Now, the port and its binding state should be committed."},{"line_number":352,"context_line":"                    # TODO(Carl) Figure out why fixed_ips are lost here"},{"line_number":353,"context_line":"                    context, need_notify, try_again \u003d ("},{"line_number":354,"context_line":"                        self._commit_port_binding(context, bind_context,"},{"line_number":355,"context_line":"                                                  need_notify, try_again))"},{"line_number":356,"context_line":"                else:"},{"line_number":357,"context_line":"                    context \u003d bind_context"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_51354ed9","line":354,"range":{"start_line":354,"start_character":50,"end_line":354,"end_character":57},"updated":"2016-05-24 21:04:23.000000000","message":"In the two failed UTs, context goes in to this method with the newly allocated IPs on fixed_ips.  When it comes back out, the fixed_ips are gone.","commit_id":"7a9bc75a52e6f93de094e9433f9fb52bc93063c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"20760ed4f329435b51c169b1a0b3624f17e0ecef","unresolved":false,"context_lines":[{"line_number":424,"context_line":"            # Get the current port state and build a new PortContext"},{"line_number":425,"context_line":"            # reflecting this state as original state for subsequent"},{"line_number":426,"context_line":"            # mechanism driver update_port_*commit() calls."},{"line_number":427,"context_line":"            port_db, cur_binding \u003d db.get_locked_port_and_binding(session,"},{"line_number":428,"context_line":"                                                                  port_id)"},{"line_number":429,"context_line":"            # Since the mechanism driver bind_port() calls must be made"},{"line_number":430,"context_line":"            # outside a DB transaction locking the port state, it is"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_115aa62a","line":427,"range":{"start_line":427,"start_character":38,"end_line":427,"end_character":65},"updated":"2016-05-24 21:04:23.000000000","message":"This call refetches the port from the DB and doesn\u0027t find the fixed_ips.","commit_id":"7a9bc75a52e6f93de094e9433f9fb52bc93063c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"20760ed4f329435b51c169b1a0b3624f17e0ecef","unresolved":false,"context_lines":[{"line_number":442,"context_line":"                LOG.debug(\"Port %s has been deleted concurrently\", port_id)"},{"line_number":443,"context_line":"                return orig_context, False, False"},{"line_number":444,"context_line":"            oport \u003d self._make_port_dict(port_db)"},{"line_number":445,"context_line":"            port \u003d self._make_port_dict(port_db)"},{"line_number":446,"context_line":"            network \u003d bind_context.network.current"},{"line_number":447,"context_line":"            if port[\u0027device_owner\u0027] \u003d\u003d const.DEVICE_OWNER_DVR_INTERFACE:"},{"line_number":448,"context_line":"                # REVISIT(rkukura): The PortBinding instance from the"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_71ddf26f","line":445,"range":{"start_line":445,"start_character":24,"end_line":445,"end_character":39},"updated":"2016-05-24 21:04:23.000000000","message":"This is the port dict that ends up getting sent back in the response to the port update.  Since port_db here doesn\u0027t have the fixed_ips data, it isn\u0027t returned.","commit_id":"7a9bc75a52e6f93de094e9433f9fb52bc93063c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"20760ed4f329435b51c169b1a0b3624f17e0ecef","unresolved":false,"context_lines":[{"line_number":1351,"context_line":"        # at certain times, we just pass the port-context and return it, so"},{"line_number":1352,"context_line":"        # that we don\u0027t disturb other methods that are expecting a return"},{"line_number":1353,"context_line":"        # value."},{"line_number":1354,"context_line":"        bound_context \u003d self._bind_port_if_needed("},{"line_number":1355,"context_line":"            mech_context,"},{"line_number":1356,"context_line":"            allow_notify\u003dTrue,"},{"line_number":1357,"context_line":"            need_notify\u003dneed_port_update_notify)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_f13602b3","line":1354,"range":{"start_line":1354,"start_character":8,"end_line":1354,"end_character":21},"updated":"2016-05-24 21:04:23.000000000","message":"This bound_context is missing the fixed_ips.  See above for why.","commit_id":"7a9bc75a52e6f93de094e9433f9fb52bc93063c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"20760ed4f329435b51c169b1a0b3624f17e0ecef","unresolved":false,"context_lines":[{"line_number":1352,"context_line":"        # that we don\u0027t disturb other methods that are expecting a return"},{"line_number":1353,"context_line":"        # value."},{"line_number":1354,"context_line":"        bound_context \u003d self._bind_port_if_needed("},{"line_number":1355,"context_line":"            mech_context,"},{"line_number":1356,"context_line":"            allow_notify\u003dTrue,"},{"line_number":1357,"context_line":"            need_notify\u003dneed_port_update_notify)"},{"line_number":1358,"context_line":"        return bound_context.current"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_b1be3afd","line":1355,"range":{"start_line":1355,"start_character":12,"end_line":1355,"end_character":24},"updated":"2016-05-24 21:04:23.000000000","message":"This mech_context has the fixed_ips.","commit_id":"7a9bc75a52e6f93de094e9433f9fb52bc93063c9"}],"neutron/tests/unit/extensions/test_segment.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"20760ed4f329435b51c169b1a0b3624f17e0ecef","unresolved":false,"context_lines":[{"line_number":573,"context_line":"            data \u003d {\u0027port\u0027: {"},{"line_number":574,"context_line":"                \u0027fixed_ips\u0027: [{\u0027subnet_id\u0027: subnet[\u0027subnet\u0027][\u0027id\u0027]}]}}"},{"line_number":575,"context_line":"            port_id \u003d port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":576,"context_line":"            port_req \u003d self.new_update_request(\u0027ports\u0027, data, port_id)"},{"line_number":577,"context_line":"            response \u003d port_req.get_response(self.api)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"        # Gets bad request because there are no eligible subnets."}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_7113325d","line":576,"range":{"start_line":576,"start_character":28,"end_line":576,"end_character":46},"updated":"2016-05-24 21:04:23.000000000","message":"This is the update request that is linked with the fix in neutron/db/ipam_backend_mixin.py.  This port update request doesn\u0027t supply host binding and so ML2 loads \u0027\u0027 (empty string) from the DB.  :(","commit_id":"7a9bc75a52e6f93de094e9433f9fb52bc93063c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"20760ed4f329435b51c169b1a0b3624f17e0ecef","unresolved":false,"context_lines":[{"line_number":610,"context_line":""},{"line_number":611,"context_line":"        # Since port is bound and there is a mapping to segment, it succeeds."},{"line_number":612,"context_line":"        self.assertEqual(webob.exc.HTTPOk.code, response.status_int)"},{"line_number":613,"context_line":"        ip \u003d res[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":614,"context_line":"        ip_net \u003d netaddr.IPNetwork(subnet[\u0027subnet\u0027][\u0027cidr\u0027])"},{"line_number":615,"context_line":"        self.assertIn(ip, ip_net)"},{"line_number":616,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_3109aa2d","line":613,"range":{"start_line":613,"start_character":13,"end_line":613,"end_character":40},"updated":"2016-05-24 21:04:23.000000000","message":"So, I think there is a bug in ML2 that causes fixed_ips to be empty.  From what I can tell, the IP allocation gets recorded, and would show up on a subsequent port show request.  The problem is that the update response doesn\u0027t contain them and we need this to work.","commit_id":"7a9bc75a52e6f93de094e9433f9fb52bc93063c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"20760ed4f329435b51c169b1a0b3624f17e0ecef","unresolved":false,"context_lines":[{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        # Gets bad request because there are no eligible subnets."},{"line_number":643,"context_line":"        self.assertEqual(webob.exc.HTTPOk.code, response.status_int)"},{"line_number":644,"context_line":"        ip \u003d res[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":645,"context_line":"        ip_net \u003d netaddr.IPNetwork(subnet[\u0027subnet\u0027][\u0027cidr\u0027])"},{"line_number":646,"context_line":"        self.assertIn(ip, ip_net)"},{"line_number":647,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_d1013e06","line":644,"range":{"start_line":644,"start_character":13,"end_line":644,"end_character":40},"updated":"2016-05-24 21:04:23.000000000","message":"ditto","commit_id":"7a9bc75a52e6f93de094e9433f9fb52bc93063c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b5d3022e274f9192baf5b28fe45e7f6d590d30d3","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        # Gets bad request because there are no eligible subnets."},{"line_number":580,"context_line":"        self.assertEqual(webob.exc.HTTPBadRequest.code, response.status_int)"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"    def test_port_update_allocate_no_segments(self):"},{"line_number":583,"context_line":"        \"\"\"Binding information is provided, subnet created after port\"\"\""},{"line_number":584,"context_line":"        with self.network() as network:"},{"line_number":585,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_71a5b902","line":582,"updated":"2016-05-25 18:01:57.000000000","message":"To show that this is a problem on master, I\u0027ve moved this test to a new patch and posted it against master [1].\n\n [1] https://review.openstack.org/321152","commit_id":"1c6a90d6bd0e191c66f7022571043a925ce865b2"}]}
