)]}'
{"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"76672140c30bb94ba3dfb9d2fe6e5f78aacb5f79","unresolved":false,"context_lines":[{"line_number":1731,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic(\u0027baremetal:node:vif:attach\u0027)"},{"line_number":1732,"context_line":"        if \u0027port_uuid\u0027 in vif and \u0027portgroup_uuid\u0027 in vif:"},{"line_number":1733,"context_line":"            msg \u003d _(\"Cannot specify both port_uuid and portgroup_uuid\")"},{"line_number":1734,"context_line":"            raise exception.Invalid(msg)"},{"line_number":1735,"context_line":"        api.request.rpcapi.vif_attach(api.request.context, rpc_node.uuid,"},{"line_number":1736,"context_line":"                                      vif_info\u003dvif, topic\u003dtopic)"},{"line_number":1737,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_ee68cb21","line":1734,"updated":"2020-06-04 18:20:41.000000000","message":"So often what we would do is if the client is not speaking version xyz, reject the newer mechanism field values using the microversion\u0027s presence or absence.","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"004c203f0501a83a025fd22990f56ba5d75f0298","unresolved":false,"context_lines":[{"line_number":1731,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic(\u0027baremetal:node:vif:attach\u0027)"},{"line_number":1732,"context_line":"        if \u0027port_uuid\u0027 in vif and \u0027portgroup_uuid\u0027 in vif:"},{"line_number":1733,"context_line":"            msg \u003d _(\"Cannot specify both port_uuid and portgroup_uuid\")"},{"line_number":1734,"context_line":"            raise exception.Invalid(msg)"},{"line_number":1735,"context_line":"        api.request.rpcapi.vif_attach(api.request.context, rpc_node.uuid,"},{"line_number":1736,"context_line":"                                      vif_info\u003dvif, topic\u003dtopic)"},{"line_number":1737,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_8e64af23","line":1734,"in_reply_to":"ff570b3c_ee68cb21","updated":"2020-06-04 18:26:13.000000000","message":"Ah, thanks! One question: currently, the vif_info field actually accepts arbitrary key/value pairs with no issue; it just ignores everything other than vif_id (you can see that capability in the CLI - https://docs.openstack.org/python-ironicclient/latest/cli/osc/v1/index.html#baremetal-node-vif-attach).\n\nThat being the case, would I just add the microversion check in drivers/modules/network/common.py, only checking for the port/portgroup uuids if the version check passes?","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"c2701012f3fa8cca2ae1ff0ff59f074b19e86289","unresolved":false,"context_lines":[{"line_number":1731,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic(\u0027baremetal:node:vif:attach\u0027)"},{"line_number":1732,"context_line":"        if \u0027port_uuid\u0027 in vif and \u0027portgroup_uuid\u0027 in vif:"},{"line_number":1733,"context_line":"            msg \u003d _(\"Cannot specify both port_uuid and portgroup_uuid\")"},{"line_number":1734,"context_line":"            raise exception.Invalid(msg)"},{"line_number":1735,"context_line":"        api.request.rpcapi.vif_attach(api.request.context, rpc_node.uuid,"},{"line_number":1736,"context_line":"                                      vif_info\u003dvif, topic\u003dtopic)"},{"line_number":1737,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_dfaa9dd0","line":1734,"in_reply_to":"ff570b3c_ee68cb21","updated":"2020-06-15 21:00:47.000000000","message":"I\u0027ve added a microversion check. However, if it doesn\u0027t pass the only thing that happens is that the port_uuid-and-portgroup_uuid check is skipped, as right now vif_attach accepts arbitrary key/value pairs (but only does something with the `id`).","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"}],"ironic/drivers/modules/network/common.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"5b47d2455efcfb39139bd22888e2957ca39a7bec","unresolved":false,"context_lines":[{"line_number":563,"context_line":"                        node\u003dtask.node.uuid, vif\u003dvif_id, reason\u003dreason)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        port_like_obj \u003d get_free_port_like_object("},{"line_number":566,"context_line":"            task, vif_id, physnets, vif_info.get(\u0027port_like_obj_id\u0027))"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        # Address is optional for portgroups"},{"line_number":569,"context_line":"        if port_like_obj.address:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff570b3c_94c20ee8","line":566,"updated":"2020-06-04 09:18:54.000000000","message":"Does this vif_info come directly from the API? If so we need\n\n1) to microversion it on the API level.\n\n2) a more user-friendly name, I think (this is more of a nit). Likely separate \"port\" and \"port_group\" to be more explicit.\n\n3) a release note","commit_id":"98b8400c9c5a672e04f055b4ac1e694085db49c5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7330dfbdcb1c9e8a31c123e945e5404cb22650bd","unresolved":false,"context_lines":[{"line_number":563,"context_line":"                        node\u003dtask.node.uuid, vif\u003dvif_id, reason\u003dreason)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        port_like_obj \u003d get_free_port_like_object("},{"line_number":566,"context_line":"            task, vif_id, physnets, vif_info.get(\u0027port_like_obj_id\u0027))"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        # Address is optional for portgroups"},{"line_number":569,"context_line":"        if port_like_obj.address:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff570b3c_7dd3da01","line":566,"in_reply_to":"ff570b3c_1d973e3c","updated":"2020-06-04 13:41:59.000000000","message":"Yep, any user-visible API change does (we have a few exceptions, vif_info is not one of them).","commit_id":"98b8400c9c5a672e04f055b4ac1e694085db49c5"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"45ad093a18406d00bdc3454e4583d4a4c7ea00f8","unresolved":false,"context_lines":[{"line_number":563,"context_line":"                        node\u003dtask.node.uuid, vif\u003dvif_id, reason\u003dreason)"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        port_like_obj \u003d get_free_port_like_object("},{"line_number":566,"context_line":"            task, vif_id, physnets, vif_info.get(\u0027port_like_obj_id\u0027))"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        # Address is optional for portgroups"},{"line_number":569,"context_line":"        if port_like_obj.address:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff570b3c_1d973e3c","line":566,"in_reply_to":"ff570b3c_94c20ee8","updated":"2020-06-04 13:39:29.000000000","message":"Hi! vif_info already exists, so I wasn\u0027t sure if allowing for additional contents in vif_info required a microversion. Just to clarify, you\u0027re saying that it does, correct?","commit_id":"98b8400c9c5a672e04f055b4ac1e694085db49c5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"884d9335b57e276ccaeefd22b330f279cf7f873f","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    for p in task.ports:"},{"line_number":122,"context_line":"        # If port_uuid is specified in vif_info, check id"},{"line_number":123,"context_line":"        # Validate that port has needed information"},{"line_number":124,"context_line":"        if ((port_uuid and port_uuid !\u003d p.uuid) or"},{"line_number":125,"context_line":"            not neutron.validate_port_info(task.node, p)):"},{"line_number":126,"context_line":"            continue"},{"line_number":127,"context_line":"        if _vif_attached(p, vif_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_34b17445","line":124,"updated":"2020-06-04 19:26:41.000000000","message":"pep8: W504 line break after binary operator","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"884d9335b57e276ccaeefd22b330f279cf7f873f","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    if not port_uuid:"},{"line_number":140,"context_line":"        for pg in task.portgroups:"},{"line_number":141,"context_line":"            # if portgroup_uuid is specified in vif_info, check id"},{"line_number":142,"context_line":"            if ((portgroup_uuid and portgroup_uuid !\u003d pg.uuid) or"},{"line_number":143,"context_line":"                _vif_attached(pg, vif_id)):"},{"line_number":144,"context_line":"                continue"},{"line_number":145,"context_line":"            if pg.id in non_usable_portgroups:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_9485e05c","line":142,"updated":"2020-06-04 19:26:41.000000000","message":"pep8: W504 line break after binary operator","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"}],"ironic/tests/unit/api/controllers/v1/test_node.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"884d9335b57e276ccaeefd22b330f279cf7f873f","unresolved":false,"context_lines":[{"line_number":6178,"context_line":""},{"line_number":6179,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_uuid\u0027)"},{"line_number":6180,"context_line":"    @mock.patch.object(rpcapi.ConductorAPI, \u0027vif_attach\u0027)"},{"line_number":6181,"context_line":"    def test_vif_attach_port_uuid_and_portgroup_uuid(self, mock_attach, mock_get):"},{"line_number":6182,"context_line":"        vif_id \u003d uuidutils.generate_uuid()"},{"line_number":6183,"context_line":"        request_body \u003d {"},{"line_number":6184,"context_line":"            \u0027id\u0027: vif_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_74880c70","line":6181,"updated":"2020-06-04 19:26:41.000000000","message":"pep8: E501 line too long (82 \u003e 79 characters)","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"76672140c30bb94ba3dfb9d2fe6e5f78aacb5f79","unresolved":false,"context_lines":[{"line_number":6194,"context_line":"                                      self.vif_version})"},{"line_number":6195,"context_line":""},{"line_number":6196,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_int)"},{"line_number":6197,"context_line":"        self.assertTrue(ret.json[\u0027error_message\u0027])"},{"line_number":6198,"context_line":""},{"line_number":6199,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_uuid\u0027)"},{"line_number":6200,"context_line":"    @mock.patch.object(rpcapi.ConductorAPI, \u0027vif_detach\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_6e7ddbe5","line":6197,"updated":"2020-06-04 18:20:41.000000000","message":"So typically we go ahead and test the map through., but given what we\u0027re testing here is the conditional this is okay. I guess what I\u0027m lacking is a test of the microversion\u0027s enforcement of behavior, if we feel we need it.","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"c2701012f3fa8cca2ae1ff0ff59f074b19e86289","unresolved":false,"context_lines":[{"line_number":6194,"context_line":"                                      self.vif_version})"},{"line_number":6195,"context_line":""},{"line_number":6196,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_int)"},{"line_number":6197,"context_line":"        self.assertTrue(ret.json[\u0027error_message\u0027])"},{"line_number":6198,"context_line":""},{"line_number":6199,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_uuid\u0027)"},{"line_number":6200,"context_line":"    @mock.patch.object(rpcapi.ConductorAPI, \u0027vif_detach\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_7f4b9186","line":6197,"in_reply_to":"ff570b3c_6e7ddbe5","updated":"2020-06-15 21:00:47.000000000","message":"I\u0027ve added a test to ensure that this call actually passes if both parameters are specified, but an older version of the API is used.","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"}],"releasenotes/notes/vif-port-attach-17a9993bf5c21d69.yaml":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"76672140c30bb94ba3dfb9d2fe6e5f78aacb5f79","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Update the node vif_attach API action to accept port_uuid and"},{"line_number":5,"context_line":"    portgroup_uuid keys within vif_info. If one is specified, then Ironic will"},{"line_number":6,"context_line":"    attempt to attach to the specified port/portgroup. Specifying both returns"},{"line_number":7,"context_line":"    an error."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"ff570b3c_6e667b53","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":19},"updated":"2020-06-04 18:20:41.000000000","message":"FYI, Typically we format features as \"Adds xyz feature to do abc...\" We also indicate the new microversion if applicable.","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"c2701012f3fa8cca2ae1ff0ff59f074b19e86289","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Update the node vif_attach API action to accept port_uuid and"},{"line_number":5,"context_line":"    portgroup_uuid keys within vif_info. If one is specified, then Ironic will"},{"line_number":6,"context_line":"    attempt to attach to the specified port/portgroup. Specifying both returns"},{"line_number":7,"context_line":"    an error."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"bf51134e_5f032d0e","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":19},"in_reply_to":"ff570b3c_6e667b53","updated":"2020-06-15 21:00:47.000000000","message":"Ah, good to know - thanks!","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"76672140c30bb94ba3dfb9d2fe6e5f78aacb5f79","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Update the node vif_attach API action to accept port_uuid and"},{"line_number":5,"context_line":"    portgroup_uuid keys within vif_info. If one is specified, then Ironic will"},{"line_number":6,"context_line":"    attempt to attach to the specified port/portgroup. Specifying both returns"},{"line_number":7,"context_line":"    an error."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"ff570b3c_ae5c137d","line":7,"range":{"start_line":5,"start_character":41,"end_line":7,"end_character":13},"updated":"2020-06-04 18:20:41.000000000","message":"this is lgtm!","commit_id":"7d97bb8a2a800f96b062d0f34832fe716ff678f2"}]}
