)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47175696c6f6088429e8afaed3580e402cd00c56","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The NeutronFixture is updated to implement the"},{"line_number":13,"context_line":"allocate_port_for_instance method so that the functional"},{"line_number":14,"context_line":"API samples tests for os-attach-interfaces do not have to"},{"line_number":15,"context_line":"rely so heavily on stubbing out the network API and instead"},{"line_number":16,"context_line":"let the NeutronFixture deal with state management of attached"},{"line_number":17,"context_line":"ports."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9fdfeff1_eb9d110a","line":14,"range":{"start_line":14,"start_character":22,"end_line":14,"end_character":42},"updated":"2019-01-30 22:36:44.000000000","message":"os-interface API","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1adcf7e9d421fadd100d12474502da8e0d4d066d","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The NeutronFixture is updated to implement the"},{"line_number":13,"context_line":"allocate_port_for_instance method so that the functional"},{"line_number":14,"context_line":"API samples tests for os-attach-interfaces do not have to"},{"line_number":15,"context_line":"rely so heavily on stubbing out the network API and instead"},{"line_number":16,"context_line":"let the NeutronFixture deal with state management of attached"},{"line_number":17,"context_line":"ports."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9fdfeff1_41f2e79b","line":14,"range":{"start_line":14,"start_character":22,"end_line":14,"end_character":42},"in_reply_to":"9fdfeff1_eb9d110a","updated":"2019-01-31 22:00:47.000000000","message":"Done","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"}],"api-ref/source/os-interface.inc":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3fc5b7c6e6373e274256bca70ae4ea8a9a8f3be2","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"**Example Create Tagged Interface (v2.68): JSON response**"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":".. literalinclude:: ../../doc/api_samples/os-attach-interfaces/v2.68/attach-interfaces-create-req.json"},{"line_number":122,"context_line":"   :language: javascript"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Show Port Interface Details"}],"source_content_type":"text/x-c++src","patch_set":4,"id":"9fdfeff1_39ca8a1a","line":121,"range":{"start_line":121,"start_character":69,"end_line":121,"end_character":102},"updated":"2019-01-31 08:23:37.000000000","message":"resp","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"240461b6e32b1c564bf8a0164a94954899508230","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"**Example Create Tagged Interface (v2.68): JSON response**"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":".. literalinclude:: ../../doc/api_samples/os-attach-interfaces/v2.68/attach-interfaces-create-req.json"},{"line_number":122,"context_line":"   :language: javascript"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Show Port Interface Details"}],"source_content_type":"text/x-c++src","patch_set":4,"id":"9fdfeff1_b2fe8c68","line":121,"range":{"start_line":121,"start_character":69,"end_line":121,"end_character":102},"in_reply_to":"9fdfeff1_39ca8a1a","updated":"2019-01-31 14:19:54.000000000","message":"Ah good catch, must have been a bad copy/paste.","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1adcf7e9d421fadd100d12474502da8e0d4d066d","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"**Example Create Tagged Interface (v2.68): JSON response**"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":".. literalinclude:: ../../doc/api_samples/os-attach-interfaces/v2.68/attach-interfaces-create-req.json"},{"line_number":122,"context_line":"   :language: javascript"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Show Port Interface Details"}],"source_content_type":"text/x-c++src","patch_set":4,"id":"9fdfeff1_61edabb5","line":121,"range":{"start_line":121,"start_character":69,"end_line":121,"end_character":102},"in_reply_to":"9fdfeff1_b2fe8c68","updated":"2019-01-31 22:00:47.000000000","message":"Done","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"}],"nova/api/openstack/compute/attach_interfaces.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47175696c6f6088429e8afaed3580e402cd00c56","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    :param port_info: dict of port details from the networking service"},{"line_number":38,"context_line":"    :param show_tag: If True, includes the \"tag\" key in the returned dict,"},{"line_number":39,"context_line":"        else the \"tag\" entry is omitted (default: False)"},{"line_number":40,"context_line":"    :returns: dict of a subset of details about the port and optionally the"},{"line_number":41,"context_line":"        associated with the VirtualInterface record in the nova database"},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":"    info \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_8bdec5d7","line":40,"range":{"start_line":40,"start_character":72,"end_line":40,"end_character":75},"updated":"2019-01-30 22:36:44.000000000","message":"the tag","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1adcf7e9d421fadd100d12474502da8e0d4d066d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    :param port_info: dict of port details from the networking service"},{"line_number":38,"context_line":"    :param show_tag: If True, includes the \"tag\" key in the returned dict,"},{"line_number":39,"context_line":"        else the \"tag\" entry is omitted (default: False)"},{"line_number":40,"context_line":"    :returns: dict of a subset of details about the port and optionally the"},{"line_number":41,"context_line":"        associated with the VirtualInterface record in the nova database"},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":"    info \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_414747bd","line":40,"range":{"start_line":40,"start_character":72,"end_line":40,"end_character":75},"in_reply_to":"9fdfeff1_8bdec5d7","updated":"2019-01-31 22:00:47.000000000","message":"Done","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"c2b06c4adc9550a9d83179a265510a873f2cc379","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    if show_tag:"},{"line_number":51,"context_line":"        # Get the VIF for this port (if one exists - VirtualInterface records"},{"line_number":52,"context_line":"        # did not exist for neutron ports until the Newton release)."},{"line_number":53,"context_line":"        vif \u003d objects.VirtualInterface.get_by_uuid(context, port_info[\u0027id\u0027])"},{"line_number":54,"context_line":"        info[\u0027tag\u0027] \u003d vif.tag if vif else None"},{"line_number":55,"context_line":"    return info"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_56e40f0d","line":53,"updated":"2019-02-14 01:26:42.000000000","message":"Note to self: this DB query is for interface show.","commit_id":"5c14429cb34bc6af77b0611c959f9c641e4f616a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"c2b06c4adc9550a9d83179a265510a873f2cc379","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        show_tag \u003d api_version_request.is_supported(req, \u00272.69\u0027)"},{"line_number":87,"context_line":"        tag_per_port_id \u003d {}"},{"line_number":88,"context_line":"        if show_tag:"},{"line_number":89,"context_line":"            vifs \u003d objects.VirtualInterfaceList.get_by_instance_uuid("},{"line_number":90,"context_line":"                context, server_id)"},{"line_number":91,"context_line":"            tag_per_port_id \u003d {vif.uuid: vif.tag for vif in vifs}"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_16ea07d7","line":89,"updated":"2019-02-14 01:26:42.000000000","message":"... and this is for interface list.","commit_id":"5c14429cb34bc6af77b0611c959f9c641e4f616a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d9ea14769831f0b94a3eb8fa33a6384241cd80e8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    if show_tag:"},{"line_number":51,"context_line":"        # Get the VIF for this port (if one exists - VirtualInterface records"},{"line_number":52,"context_line":"        # did not exist for neutron ports until the Newton release)."},{"line_number":53,"context_line":"        vif \u003d objects.VirtualInterface.get_by_uuid(context, port_info[\u0027id\u0027])"},{"line_number":54,"context_line":"        info[\u0027tag\u0027] \u003d vif.tag if vif else None"},{"line_number":55,"context_line":"    return info"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_a8b3d4e8","line":54,"range":{"start_line":53,"start_character":8,"end_line":54,"end_character":46},"updated":"2019-02-25 07:51:07.000000000","message":"we probably can add a unittest case ensure there is None value for vif?","commit_id":"1c6fdc9aecba310630b6e74e861d31a4c3be1bed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"baf0201ea633ac6ebc5254ea17b911301190fa12","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    if show_tag:"},{"line_number":51,"context_line":"        # Get the VIF for this port (if one exists - VirtualInterface records"},{"line_number":52,"context_line":"        # did not exist for neutron ports until the Newton release)."},{"line_number":53,"context_line":"        vif \u003d objects.VirtualInterface.get_by_uuid(context, port_info[\u0027id\u0027])"},{"line_number":54,"context_line":"        info[\u0027tag\u0027] \u003d vif.tag if vif else None"},{"line_number":55,"context_line":"    return info"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_d4090a2b","line":54,"range":{"start_line":53,"start_character":8,"end_line":54,"end_character":46},"in_reply_to":"9fdfeff1_a8b3d4e8","updated":"2019-02-25 15:12:52.000000000","message":"Sure I\u0027ll add unit tests in a follow up so I don\u0027t lose the +2.","commit_id":"1c6fdc9aecba310630b6e74e861d31a4c3be1bed"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d9ea14769831f0b94a3eb8fa33a6384241cd80e8","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        show_tag \u003d api_version_request.is_supported(req, \u00272.70\u0027)"},{"line_number":87,"context_line":"        tag_per_port_id \u003d {}"},{"line_number":88,"context_line":"        if show_tag:"},{"line_number":89,"context_line":"            vifs \u003d objects.VirtualInterfaceList.get_by_instance_uuid("},{"line_number":90,"context_line":"                context, server_id)"},{"line_number":91,"context_line":"            tag_per_port_id \u003d {vif.uuid: vif.tag for vif in vifs}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        results \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_68c5ec3c","line":90,"range":{"start_line":89,"start_character":12,"end_line":90,"end_character":35},"updated":"2019-02-25 07:51:07.000000000","message":"Also one more unittest case for no vifs.","commit_id":"1c6fdc9aecba310630b6e74e861d31a4c3be1bed"}],"nova/api/openstack/compute/volumes.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"db5ffc3e2ce0accdec1fd0edc31d5f0e46b72287","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    return d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def _translate_volume_summary_view(context, vol):"},{"line_number":51,"context_line":"    \"\"\"Maps keys for volumes summary view.\"\"\""},{"line_number":52,"context_line":"    d \u003d {}"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_2e00abab","line":50,"updated":"2019-02-19 20:00:27.000000000","message":"I guess this is for the old os-volumes API, which is deprecated and isn\u0027t going to change.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7845232ae4ae46eda7c83f491c59242c9b0869ea","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    return d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def _translate_volume_summary_view(context, vol):"},{"line_number":51,"context_line":"    \"\"\"Maps keys for volumes summary view.\"\"\""},{"line_number":52,"context_line":"    d \u003d {}"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_63ca3c1b","line":50,"in_reply_to":"9fdfeff1_2e00abab","updated":"2019-02-20 14:30:22.000000000","message":"Yes, this is for the old proxy APIs.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"db5ffc3e2ce0accdec1fd0edc31d5f0e46b72287","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        #                    }"},{"line_number":71,"context_line":"        #                }"},{"line_number":72,"context_line":"        attachment \u003d list(vol[\u0027attachments\u0027].items())[0]"},{"line_number":73,"context_line":"        d[\u0027attachments\u0027] \u003d [_translate_attachment_summary_view(vol[\u0027id\u0027],"},{"line_number":74,"context_line":"            attachment[0],"},{"line_number":75,"context_line":"            attachment[1].get(\u0027mountpoint\u0027))]"},{"line_number":76,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_ee2b8330","line":73,"updated":"2019-02-19 20:00:27.000000000","message":"Call summary because summary doesn\u0027t include tags.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"db5ffc3e2ce0accdec1fd0edc31d5f0e46b72287","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        return wsgi.ResponseObject(result, headers\u003ddict(location\u003dlocation))"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"def _translate_attachment_detail_view(bdm, show_tag\u003dFalse):"},{"line_number":213,"context_line":"    \"\"\"Maps keys for attachment details view."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    :param bdm: BlockDeviceMapping object for an attached volume"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_0ed60729","line":212,"updated":"2019-02-19 20:00:27.000000000","message":"Both list and show call this, which uses the summary view and then adds the tag.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"db5ffc3e2ce0accdec1fd0edc31d5f0e46b72287","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    return d"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"def _translate_attachment_summary_view(volume_id, instance_uuid, mountpoint):"},{"line_number":230,"context_line":"    \"\"\"Maps keys for attachment summary view.\"\"\""},{"line_number":231,"context_line":"    d \u003d {}"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_8e1c3714","line":229,"updated":"2019-02-19 20:00:27.000000000","message":"This is only called by detail view and for the old os-volumes API.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"db5ffc3e2ce0accdec1fd0edc31d5f0e46b72287","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            raise exc.HTTPForbidden(explanation\u003de.format_message())"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        # The attach is async"},{"line_number":362,"context_line":"        # NOTE(mriedem): It would be nice to use"},{"line_number":363,"context_line":"        # _translate_attachment_summary_view here but that does not include"},{"line_number":364,"context_line":"        # the \u0027device\u0027 key if device is None or the empty string which would"},{"line_number":365,"context_line":"        # be a backward incompatible change."}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_6ee4730f","line":362,"updated":"2019-02-19 20:00:27.000000000","message":"We could add a show_null_device kwarg that can default to False to preserve old behaviour, but that\u0027s a nit.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"09c4c393065679e830ba35264ec9f0959cb5aff4","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        return wsgi.ResponseObject(result, headers\u003ddict(location\u003dlocation))"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"def _translate_attachment_detail_view(volume_id, instance_uuid, mountpoint):"},{"line_number":213,"context_line":"    \"\"\"Maps keys for attachment details view.\"\"\""},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    d \u003d _translate_attachment_summary_view(volume_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_88d046f9","side":"PARENT","line":212,"updated":"2019-02-25 16:17:08.000000000","message":"weird that this even existed in the first place","commit_id":"a37a035c9d359b29fed6ea08bc99b93e51164e61"}],"nova/tests/fixtures.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"240461b6e32b1c564bf8a0164a94954899508230","unresolved":false,"context_lines":[{"line_number":1356,"context_line":""},{"line_number":1357,"context_line":"        def allocate_port_for_instance("},{"line_number":1358,"context_line":"                _self, ctxt, instance, port_id, *a, **kw):"},{"line_number":1359,"context_line":"            # This fixture currently only supports attaching an existing port."},{"line_number":1360,"context_line":"            if port_id is None:"},{"line_number":1361,"context_line":"                # We could probably support \"creating\" ports with network_id by"},{"line_number":1362,"context_line":"                # using the create_port method in this fixture."},{"line_number":1363,"context_line":"                raise exception.Invalid("},{"line_number":1364,"context_line":"                    \u0027NeutronFixture.allocate_port_for_instance currently only \u0027"},{"line_number":1365,"context_line":"                    \u0027supports attaching pre-existing ports.\u0027)"},{"line_number":1366,"context_line":""},{"line_number":1367,"context_line":"            # Find the pre-existing port and attach the instance by updating"},{"line_number":1368,"context_line":"            # the port\u0027s device_id to point at the instance."}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_92f7c88b","line":1365,"range":{"start_line":1359,"start_character":12,"end_line":1365,"end_character":61},"updated":"2019-01-31 14:19:54.000000000","message":"This is causing some other functional tests, which are using this fixture, to fail. I\u0027m not sure how they passed before if they weren\u0027t stubbing something out higher up the stack. Depending on what I need to change in the other tests I\u0027ll likely want to split this out into it\u0027s own change.","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"}],"nova/tests/functional/api_sample_tests/test_attach_interfaces.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47175696c6f6088429e8afaed3580e402cd00c56","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                              response, 200)"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"class AttachInterfacesSampleV268JsonTest(test_servers.ServersSampleBase):"},{"line_number":259,"context_line":"    \"\"\"Tests for the 2.68 microversion in the os-attach-interfaces API"},{"line_number":260,"context_line":"    which returns the \u0027tag\u0027 field in response bodies to GET and POST methods."},{"line_number":261,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_4b9bfd16","line":258,"range":{"start_line":258,"start_character":6,"end_line":258,"end_character":40},"updated":"2019-01-30 22:36:44.000000000","message":"I could have extended from AttachInterfacesSampleJsonTest here and just added the \u0027tag\u0027 sub in some override method, but I wanted to use the NeutronFixture since we should be using those anyway. Alternatively, I could retrofit AttachInterfacesSampleJsonTest to use the NeutronFixture in a separate patch and then extend it in this patch.","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47175696c6f6088429e8afaed3580e402cd00c56","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"class AttachInterfacesSampleV268JsonTest(test_servers.ServersSampleBase):"},{"line_number":259,"context_line":"    \"\"\"Tests for the 2.68 microversion in the os-attach-interfaces API"},{"line_number":260,"context_line":"    which returns the \u0027tag\u0027 field in response bodies to GET and POST methods."},{"line_number":261,"context_line":"    \"\"\""},{"line_number":262,"context_line":"    # Tell the parent test where the samples are located."}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_cb012d3a","line":259,"range":{"start_line":259,"start_character":46,"end_line":259,"end_character":66},"updated":"2019-01-30 22:36:44.000000000","message":"os-interface","commit_id":"97bb8f1f12631404ea214279ae41bb45905c0e26"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0ab29dc09421ab1aad511b80d93525dbaa6671c0","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.assertEqual(\u0027\u0027, response.text)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"class AttachInterfacesSampleV249JsonTest(test_servers.ServersSampleBase):"},{"line_number":171,"context_line":"    sample_dir \u003d \u0027os-attach-interfaces\u0027"},{"line_number":172,"context_line":"    microversion \u003d \u00272.49\u0027"},{"line_number":173,"context_line":"    scenarios \u003d [(\u0027v2_49\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_c181f7c4","line":170,"range":{"start_line":170,"start_character":6,"end_line":170,"end_character":40},"updated":"2019-01-31 22:02:49.000000000","message":"Arguably this could extend AttachInterfacesSampleJsonTest and remove the duplicated stubs, but I\u0027d have to split that out. It could be cleaned up separately later.","commit_id":"88471fd8f07dfcfbbfb37dfc5ffdb972d24e75ea"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"db5ffc3e2ce0accdec1fd0edc31d5f0e46b72287","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    def test_create_interfaces(self, instance_uuid\u003dNone):"},{"line_number":223,"context_line":"        if instance_uuid is None:"},{"line_number":224,"context_line":"            instance_uuid \u003d self._post_server()"},{"line_number":225,"context_line":"        subs \u003d {"},{"line_number":226,"context_line":"            \u0027net_id\u0027: \u00273cb9bc59-5699-4588-a4b1-b87f96708bc6\u0027,"},{"line_number":227,"context_line":"            \u0027port_id\u0027: \u0027ce531f90-199f-48c0-816c-13e38010b442\u0027,"},{"line_number":228,"context_line":"            \u0027subnet_id\u0027: \u0027f8a6e8f8-c2ec-497c-9f23-da9616de54ef\u0027,"},{"line_number":229,"context_line":"            \u0027ip_address\u0027: \u0027192.168.1.3\u0027,"},{"line_number":230,"context_line":"            \u0027port_state\u0027: \u0027ACTIVE\u0027,"},{"line_number":231,"context_line":"            \u0027mac_addr\u0027: \u0027fa:16:3e:4c:2c:30\u0027,"},{"line_number":232,"context_line":"        }"},{"line_number":233,"context_line":"        self._stub_show_for_instance(instance_uuid, subs[\u0027port_id\u0027])"},{"line_number":234,"context_line":"        response \u003d self._do_post(\u0027servers/%s/os-interface\u0027"},{"line_number":235,"context_line":"                                 % instance_uuid,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_eeb5c3d1","line":232,"range":{"start_line":225,"start_character":0,"end_line":232,"end_character":9},"updated":"2019-02-19 20:00:27.000000000","message":"Should this be replaced by _get_subs()?","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7845232ae4ae46eda7c83f491c59242c9b0869ea","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    def test_create_interfaces(self, instance_uuid\u003dNone):"},{"line_number":223,"context_line":"        if instance_uuid is None:"},{"line_number":224,"context_line":"            instance_uuid \u003d self._post_server()"},{"line_number":225,"context_line":"        subs \u003d {"},{"line_number":226,"context_line":"            \u0027net_id\u0027: \u00273cb9bc59-5699-4588-a4b1-b87f96708bc6\u0027,"},{"line_number":227,"context_line":"            \u0027port_id\u0027: \u0027ce531f90-199f-48c0-816c-13e38010b442\u0027,"},{"line_number":228,"context_line":"            \u0027subnet_id\u0027: \u0027f8a6e8f8-c2ec-497c-9f23-da9616de54ef\u0027,"},{"line_number":229,"context_line":"            \u0027ip_address\u0027: \u0027192.168.1.3\u0027,"},{"line_number":230,"context_line":"            \u0027port_state\u0027: \u0027ACTIVE\u0027,"},{"line_number":231,"context_line":"            \u0027mac_addr\u0027: \u0027fa:16:3e:4c:2c:30\u0027,"},{"line_number":232,"context_line":"        }"},{"line_number":233,"context_line":"        self._stub_show_for_instance(instance_uuid, subs[\u0027port_id\u0027])"},{"line_number":234,"context_line":"        response \u003d self._do_post(\u0027servers/%s/os-interface\u0027"},{"line_number":235,"context_line":"                                 % instance_uuid,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_83a96025","line":232,"range":{"start_line":225,"start_character":0,"end_line":232,"end_character":9},"in_reply_to":"9fdfeff1_eeb5c3d1","updated":"2019-02-20 14:30:22.000000000","message":"No because this class doesn\u0027t extend AttachInterfacesSampleJsonTest.\n\nI made a comment about that earlier (to myself I guess):\n\nhttps://review.openstack.org/#/c/631948/5/nova/tests/functional/api_sample_tests/test_attach_interfaces.py@170\n\ntl;dr we can refactor this test class as well but I\u0027d rather not deal with that in this change.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"}],"nova/tests/functional/api_sample_tests/test_volumes.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75094914c53393877f81e7b6f0b1865e735b31f4","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        self.assertEqual(\u0027\u0027, response.text)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"class VolumeAttachmentsSampleV249(VolumeAttachmentsSample):"},{"line_number":387,"context_line":"    sample_dir \u003d \"os-volumes\""},{"line_number":388,"context_line":"    microversion \u003d \u00272.49\u0027"},{"line_number":389,"context_line":"    scenarios \u003d [(\u0027v2_49\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_10822b01","line":386,"updated":"2019-01-28 21:44:04.000000000","message":"I\u0027m going to split this out.","commit_id":"d185821d4d64e443d4d14e27339ffc6f46a6aa9f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"db5ffc3e2ce0accdec1fd0edc31d5f0e46b72287","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        response \u003d self._do_get(\u0027servers/%s/os-volume_attachments\u0027"},{"line_number":334,"context_line":"                                % server_id)"},{"line_number":335,"context_line":"        subs \u003d self._get_vol_attachment_subs({})"},{"line_number":336,"context_line":"        self._verify_response(\u0027list-volume-attachments-resp\u0027, subs,"},{"line_number":337,"context_line":"                              response, 200)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_volume_attachment_detail(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_ce5ebf75","line":336,"range":{"start_line":336,"start_character":62,"end_line":336,"end_character":66},"updated":"2019-02-19 20:00:27.000000000","message":"I have to admit that this lost me.\n\nAt first I thought \"Ah, he\u0027ll override _get_vol_attachment_subs() in his class and add tags that way\" but you aren\u0027t.\n\nAlso, how did this ever work before? VolumeAttachmentsSampleV249 does override _get_vol_attachment_subs, but before you changed this that method was never called, it was just hardcoded to {}.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"1b8463c4803cc71ed6bced10e84f430f358da38c","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        response \u003d self._do_get(\u0027servers/%s/os-volume_attachments\u0027"},{"line_number":334,"context_line":"                                % server_id)"},{"line_number":335,"context_line":"        subs \u003d self._get_vol_attachment_subs({})"},{"line_number":336,"context_line":"        self._verify_response(\u0027list-volume-attachments-resp\u0027, subs,"},{"line_number":337,"context_line":"                              response, 200)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_volume_attachment_detail(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_b8cfb955","line":336,"range":{"start_line":336,"start_character":62,"end_line":336,"end_character":66},"in_reply_to":"9fdfeff1_c32208bb","updated":"2019-02-22 17:13:25.000000000","message":"Ah, so my problem was that thinking empty subs \u003d empty response. No, empty subs just means keep the hardcoded defaults.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7845232ae4ae46eda7c83f491c59242c9b0869ea","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        response \u003d self._do_get(\u0027servers/%s/os-volume_attachments\u0027"},{"line_number":334,"context_line":"                                % server_id)"},{"line_number":335,"context_line":"        subs \u003d self._get_vol_attachment_subs({})"},{"line_number":336,"context_line":"        self._verify_response(\u0027list-volume-attachments-resp\u0027, subs,"},{"line_number":337,"context_line":"                              response, 200)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_volume_attachment_detail(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_c32208bb","line":336,"range":{"start_line":336,"start_character":62,"end_line":336,"end_character":66},"in_reply_to":"9fdfeff1_ce5ebf75","updated":"2019-02-20 14:30:22.000000000","message":"\u003e At first I thought \"Ah, he\u0027ll override _get_vol_attachment_subs() in his class and add tags that way\" but you aren\u0027t.\n\nThat happens in VolumeAttachmentsSampleV249 which was refactored earlier in the series:\n\nhttps://review.openstack.org/#/c/633621/\n\n\u003e Also, how did this ever work before? VolumeAttachmentsSampleV249 does override _get_vol_attachment_subs, but before you changed this that method was never called, it was just hardcoded to {}.\n\nBecause there was nothing to substitute in the 2.49 response since it doesn\u0027t expose the tag field:\n\nhttps://review.openstack.org/#/c/633621/3/nova/tests/functional/api_sample_tests/api_samples/os-volumes/v2.49/list-volume-attachments-resp.json.tpl\n\nThat\u0027s what the new microversion is for.","commit_id":"bf24d9e3a92aaa23757eed66fd27d572a61f38bb"}],"tox.ini":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75094914c53393877f81e7b6f0b1865e735b31f4","unresolved":false,"context_lines":[{"line_number":138,"context_line":"  {[testenv]setenv}"},{"line_number":139,"context_line":"  GENERATE_SAMPLES\u003dTrue"},{"line_number":140,"context_line":"  PYTHONHASHSEED\u003d0"},{"line_number":141,"context_line":"deps \u003d {[testenv:functional]deps}"},{"line_number":142,"context_line":"commands \u003d"},{"line_number":143,"context_line":"  {[testenv]commands}"},{"line_number":144,"context_line":"  stestr --test-path\u003d./nova/tests/functional/api_sample_tests run {posargs}"}],"source_content_type":"text/x-properties","patch_set":2,"id":"9fdfeff1_b099df79","line":141,"updated":"2019-01-28 21:44:04.000000000","message":"Going to split this out as a separate fix.","commit_id":"d185821d4d64e443d4d14e27339ffc6f46a6aa9f"}]}
