)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a62885a93cab23a49cb54d79c83805980dbcc8be","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Change-Id: I4d70423ca978885a982c7eb5bd1efcc024d2b777"},{"line_number":18,"context_line":"Depends-on: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":19,"context_line":"Depends-on: I801c5633d72e3eb392e5a04362306c44f6100764"},{"line_number":20,"context_line":"Partial-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da4df55a_a4c1ef30","line":20,"updated":"2016-12-22 03:14:26.000000000","message":"Please also track this against blueprint ironic-plug-unplug-vifs-update by adding:\n\nImplements blueprint ironic-plug-unplug-vifs-update","commit_id":"bc5efc3bc9a576614f72d1dd785afc399685e392"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"8e389a055c247e1cb3de875ac67968adecddca1e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Change-Id: I4d70423ca978885a982c7eb5bd1efcc024d2b777"},{"line_number":18,"context_line":"Depends-on: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":19,"context_line":"Depends-on: I801c5633d72e3eb392e5a04362306c44f6100764"},{"line_number":20,"context_line":"Partial-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da4df55a_392b6132","line":20,"in_reply_to":"da4df55a_a4c1ef30","updated":"2016-12-22 08:13:37.000000000","message":"Done","commit_id":"bc5efc3bc9a576614f72d1dd785afc399685e392"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21f268e1de0dc6704c50b6283534cd6d3e04cb2b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Implements: blueprint ironic-plug-unplug-vifs-update"},{"line_number":18,"context_line":"Change-Id: I4d70423ca978885a982c7eb5bd1efcc024d2b777"},{"line_number":19,"context_line":"Depends-on: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":20,"context_line":"Depends-on: I801c5633d72e3eb392e5a04362306c44f6100764"},{"line_number":21,"context_line":"Partial-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"da4df55a_52278ec9","line":20,"updated":"2016-12-27 21:16:46.000000000","message":"This ultimately needs to be a global-requirements change to bump the minimum required version of python-ironicclient which has the new capability that the Nova Ironic virt driver is going to use from the client, and then this Nova change can bump the minimum required ironicclient in it\u0027s requirements.txt too.","commit_id":"c9b95e5ec5fbcf84ac892f7d7fa84031cd092b57"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"70c4e35d0ae2ca293cd3e2ac74eed52a2b1241b0","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Implements: blueprint ironic-plug-unplug-vifs-update"},{"line_number":18,"context_line":"Change-Id: I4d70423ca978885a982c7eb5bd1efcc024d2b777"},{"line_number":19,"context_line":"Depends-on: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":20,"context_line":"Depends-on: I801c5633d72e3eb392e5a04362306c44f6100764"},{"line_number":21,"context_line":"Partial-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"ba5201f7_4d86aeba","line":20,"in_reply_to":"da4df55a_52278ec9","updated":"2016-12-29 13:42:34.000000000","message":"Will add Depends-On: to patch that bump global-requirements ironicclient version.","commit_id":"c9b95e5ec5fbcf84ac892f7d7fa84031cd092b57"}],"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"88be7a97ade946b85eea856ae34b458abe12dce4","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"                detach_block_devices\u003dNone, attach_block_devices\u003dNone)"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    @mock.patch.object(FAKE_CLIENT.node, \u0027get\u0027)"},{"line_number":1642,"context_line":"    def _test_network_binding_host_id(self, network_interface, mock_get):"},{"line_number":1643,"context_line":"        node_uuid \u003d uuidutils.generate_uuid()"},{"line_number":1644,"context_line":"        hostname \u003d \u0027ironic-compute\u0027"},{"line_number":1645,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx,"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_1a8b7d69","line":1642,"updated":"2017-01-11 16:01:41.000000000","message":"Need to remove the _ at the beginning of this method for the test runner to pick it up.","commit_id":"079bd62be9ebc4601d210641ad0cccf4925c5577"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"30d542947a74e15676db7211c59b238b4c28ac79","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"                detach_block_devices\u003dNone, attach_block_devices\u003dNone)"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    @mock.patch.object(FAKE_CLIENT.node, \u0027get\u0027)"},{"line_number":1642,"context_line":"    def _test_network_binding_host_id(self, network_interface, mock_get):"},{"line_number":1643,"context_line":"        node_uuid \u003d uuidutils.generate_uuid()"},{"line_number":1644,"context_line":"        hostname \u003d \u0027ironic-compute\u0027"},{"line_number":1645,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx,"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_c7590e37","line":1642,"in_reply_to":"ba5201f7_1a8b7d69","updated":"2017-01-11 21:24:18.000000000","message":"Done","commit_id":"079bd62be9ebc4601d210641ad0cccf4925c5577"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1475,"context_line":"    def test_unplug_vifs(self, mock_node):"},{"line_number":1476,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":1477,"context_line":"        node \u003d ironic_utils.get_test_node(uuid\u003dnode_uuid)"},{"line_number":1478,"context_line":"        port \u003d ironic_utils.get_test_port(extra\u003d{\u0027vif_port_id\u0027: \u0027fake-vif\u0027})"},{"line_number":1479,"context_line":""},{"line_number":1480,"context_line":"        mock_node.get.return_value \u003d node"},{"line_number":1481,"context_line":"        mock_node.list_ports.return_value \u003d [port]"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_3df51b83","line":1478,"updated":"2017-01-12 23:04:18.000000000","message":"I could be wrong, but I don\u0027t think we need this","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1475,"context_line":"    def test_unplug_vifs(self, mock_node):"},{"line_number":1476,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":1477,"context_line":"        node \u003d ironic_utils.get_test_node(uuid\u003dnode_uuid)"},{"line_number":1478,"context_line":"        port \u003d ironic_utils.get_test_port(extra\u003d{\u0027vif_port_id\u0027: \u0027fake-vif\u0027})"},{"line_number":1479,"context_line":""},{"line_number":1480,"context_line":"        mock_node.get.return_value \u003d node"},{"line_number":1481,"context_line":"        mock_node.list_ports.return_value \u003d [port]"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_0509d695","line":1478,"in_reply_to":"7a3c09a3_3df51b83","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1478,"context_line":"        port \u003d ironic_utils.get_test_port(extra\u003d{\u0027vif_port_id\u0027: \u0027fake-vif\u0027})"},{"line_number":1479,"context_line":""},{"line_number":1480,"context_line":"        mock_node.get.return_value \u003d node"},{"line_number":1481,"context_line":"        mock_node.list_ports.return_value \u003d [port]"},{"line_number":1482,"context_line":""},{"line_number":1483,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx,"},{"line_number":1484,"context_line":"                                                   node\u003dnode_uuid)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_fd02b36e","line":1481,"updated":"2017-01-12 23:04:18.000000000","message":"don\u0027t need this","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1478,"context_line":"        port \u003d ironic_utils.get_test_port(extra\u003d{\u0027vif_port_id\u0027: \u0027fake-vif\u0027})"},{"line_number":1479,"context_line":""},{"line_number":1480,"context_line":"        mock_node.get.return_value \u003d node"},{"line_number":1481,"context_line":"        mock_node.list_ports.return_value \u003d [port]"},{"line_number":1482,"context_line":""},{"line_number":1483,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx,"},{"line_number":1484,"context_line":"                                                   node\u003dnode_uuid)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_25fed26b","line":1481,"in_reply_to":"7a3c09a3_fd02b36e","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"    def test_unplug_vifs_port_not_associated(self, mock_node):"},{"line_number":1496,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":1497,"context_line":"        node \u003d ironic_utils.get_test_node(uuid\u003dnode_uuid)"},{"line_number":1498,"context_line":"        port \u003d ironic_utils.get_test_port(extra\u003d{})"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"        mock_node.get.return_value \u003d node"},{"line_number":1501,"context_line":"        mock_node.list_ports.return_value \u003d [port]"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_1d021f3f","line":1498,"updated":"2017-01-12 23:04:18.000000000","message":"don\u0027t need this?","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"    def test_unplug_vifs_port_not_associated(self, mock_node):"},{"line_number":1496,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":1497,"context_line":"        node \u003d ironic_utils.get_test_node(uuid\u003dnode_uuid)"},{"line_number":1498,"context_line":"        port \u003d ironic_utils.get_test_port(extra\u003d{})"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"        mock_node.get.return_value \u003d node"},{"line_number":1501,"context_line":"        mock_node.list_ports.return_value \u003d [port]"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_85f5c684","line":1498,"in_reply_to":"7a3c09a3_1d021f3f","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1498,"context_line":"        port \u003d ironic_utils.get_test_port(extra\u003d{})"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"        mock_node.get.return_value \u003d node"},{"line_number":1501,"context_line":"        mock_node.list_ports.return_value \u003d [port]"},{"line_number":1502,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx, node\u003dnode_uuid)"},{"line_number":1503,"context_line":"        network_info \u003d utils.get_test_network_info()"},{"line_number":1504,"context_line":"        self.driver.unplug_vifs(instance, network_info)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_5dfca73e","line":1501,"updated":"2017-01-12 23:04:18.000000000","message":"don\u0027t need this","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1498,"context_line":"        port \u003d ironic_utils.get_test_port(extra\u003d{})"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"        mock_node.get.return_value \u003d node"},{"line_number":1501,"context_line":"        mock_node.list_ports.return_value \u003d [port]"},{"line_number":1502,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx, node\u003dnode_uuid)"},{"line_number":1503,"context_line":"        network_info \u003d utils.get_test_network_info()"},{"line_number":1504,"context_line":"        self.driver.unplug_vifs(instance, network_info)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_c5efceae","line":1501,"in_reply_to":"7a3c09a3_5dfca73e","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":955,"context_line":"                          {\u0027path\u0027: \u0027/instance_info/local_gb\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":956,"context_line":"                           \u0027value\u0027: str(node.properties.get(\u0027local_gb\u0027, 0))},"},{"line_number":957,"context_line":"                          {\u0027path\u0027: \u0027/instance_uuid\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":958,"context_line":"                           \u0027value\u0027: instance.uuid},"},{"line_number":959,"context_line":"                          ]"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"        if mock_call is not None:"},{"line_number":962,"context_line":"            # assert call() is invoked with retry_on_conflict False to"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_02fd8fb3","line":959,"range":{"start_line":958,"start_character":50,"end_line":959,"end_character":27},"updated":"2017-01-18 02:44:05.000000000","message":"nit: unrelated","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":955,"context_line":"                          {\u0027path\u0027: \u0027/instance_info/local_gb\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":956,"context_line":"                           \u0027value\u0027: str(node.properties.get(\u0027local_gb\u0027, 0))},"},{"line_number":957,"context_line":"                          {\u0027path\u0027: \u0027/instance_uuid\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":958,"context_line":"                           \u0027value\u0027: instance.uuid},"},{"line_number":959,"context_line":"                          ]"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"        if mock_call is not None:"},{"line_number":962,"context_line":"            # assert call() is invoked with retry_on_conflict False to"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_2401ad06","line":959,"range":{"start_line":958,"start_character":50,"end_line":959,"end_character":27},"in_reply_to":"7a3c09a3_02fd8fb3","updated":"2017-01-18 09:50:59.000000000","message":"Done","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1426,"context_line":"        mock_vatt.assert_has_calls(calls, any_order\u003dTrue)"},{"line_number":1427,"context_line":""},{"line_number":1428,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"},{"line_number":1429,"context_line":"    def test_plug_vifs_count_mismatch(self, mock_node):"},{"line_number":1430,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":1431,"context_line":"        node \u003d ironic_utils.get_test_node(uuid\u003dnode_uuid)"},{"line_number":1432,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_02ebcfdf","line":1429,"range":{"start_line":1429,"start_character":8,"end_line":1429,"end_character":37},"updated":"2017-01-18 02:44:05.000000000","message":"We could have a better name for this test now right? The code isn\u0027t checking for a vif / ports number mismatch anymore.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1426,"context_line":"        mock_vatt.assert_has_calls(calls, any_order\u003dTrue)"},{"line_number":1427,"context_line":""},{"line_number":1428,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"},{"line_number":1429,"context_line":"    def test_plug_vifs_count_mismatch(self, mock_node):"},{"line_number":1430,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":1431,"context_line":"        node \u003d ironic_utils.get_test_node(uuid\u003dnode_uuid)"},{"line_number":1432,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_bf75aa64","line":1429,"range":{"start_line":1429,"start_character":8,"end_line":1429,"end_character":37},"in_reply_to":"7a3c09a3_02ebcfdf","updated":"2017-01-18 09:50:59.000000000","message":"Actually ironic will raise BadRequest when there is no free ports left on the node, but indeed we do not check number of nics in Nova driver evidently.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1439,"context_line":"                                               id\u003dsecond_vif_id)"},{"line_number":1440,"context_line":"        mock_node.vif_attach.side_effect \u003d [None,"},{"line_number":1441,"context_line":"                                            ironic_exception.BadRequest()]"},{"line_number":1442,"context_line":"        # len(network_info) \u003e len(ports)"},{"line_number":1443,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1444,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":1445,"context_line":"                          self.driver._plug_vifs, node, instance,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_82bdffd9","line":1442,"range":{"start_line":1442,"start_character":8,"end_line":1442,"end_character":40},"updated":"2017-01-18 02:44:05.000000000","message":"This isn\u0027t part of the code being tested anymore.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1439,"context_line":"                                               id\u003dsecond_vif_id)"},{"line_number":1440,"context_line":"        mock_node.vif_attach.side_effect \u003d [None,"},{"line_number":1441,"context_line":"                                            ironic_exception.BadRequest()]"},{"line_number":1442,"context_line":"        # len(network_info) \u003e len(ports)"},{"line_number":1443,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1444,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":1445,"context_line":"                          self.driver._plug_vifs, node, instance,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_3f08dad9","line":1442,"range":{"start_line":1442,"start_character":8,"end_line":1442,"end_character":40},"in_reply_to":"7a3c09a3_82bdffd9","updated":"2017-01-18 09:50:59.000000000","message":"Done","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1441,"context_line":"                                            ironic_exception.BadRequest()]"},{"line_number":1442,"context_line":"        # len(network_info) \u003e len(ports)"},{"line_number":1443,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1444,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":1445,"context_line":"                          self.driver._plug_vifs, node, instance,"},{"line_number":1446,"context_line":"                          network_info)"},{"line_number":1447,"context_line":"        self.assertFalse(mock_node.vif_detach.called)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_02d2ef27","line":1444,"range":{"start_line":1444,"start_character":36,"end_line":1444,"end_character":49},"updated":"2017-01-18 02:44:05.000000000","message":"Let\u0027s be more specific here.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1441,"context_line":"                                            ironic_exception.BadRequest()]"},{"line_number":1442,"context_line":"        # len(network_info) \u003e len(ports)"},{"line_number":1443,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1444,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":1445,"context_line":"                          self.driver._plug_vifs, node, instance,"},{"line_number":1446,"context_line":"                          network_info)"},{"line_number":1447,"context_line":"        self.assertFalse(mock_node.vif_detach.called)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_1f679eb7","line":1444,"range":{"start_line":1444,"start_character":36,"end_line":1444,"end_character":49},"in_reply_to":"7a3c09a3_02d2ef27","updated":"2017-01-18 09:50:59.000000000","message":"Done","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15a5f19ff7ba583a72130e8f7eaf03e235c16472","unresolved":false,"context_lines":[{"line_number":1442,"context_line":"        self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":1443,"context_line":"                          self.driver._plug_vifs, node, instance,"},{"line_number":1444,"context_line":"                          network_info)"},{"line_number":1445,"context_line":"        self.assertFalse(mock_node.vif_detach.called)"},{"line_number":1446,"context_line":""},{"line_number":1447,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"},{"line_number":1448,"context_line":"    def test_plug_vifs_already_attached(self, mock_node):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_0e25995a","line":1445,"updated":"2017-01-18 15:25:33.000000000","message":"This will be True. BUT... I must be missing something. I don\u0027t see node.vif_detach() called via the driver\u0027s _plug_vifs() method? (Is this here because there was an older version where _plug_vifs() called _unplug_vifs()?","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"429714affc948fe9e49b0f4f3b8fcc817a839f95","unresolved":false,"context_lines":[{"line_number":1442,"context_line":"        self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":1443,"context_line":"                          self.driver._plug_vifs, node, instance,"},{"line_number":1444,"context_line":"                          network_info)"},{"line_number":1445,"context_line":"        self.assertFalse(mock_node.vif_detach.called)"},{"line_number":1446,"context_line":""},{"line_number":1447,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"},{"line_number":1448,"context_line":"    def test_plug_vifs_already_attached(self, mock_node):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_912e0ca3","line":1445,"in_reply_to":"7a3c09a3_0e25995a","updated":"2017-01-18 16:04:20.000000000","message":"exactly.","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15a5f19ff7ba583a72130e8f7eaf03e235c16472","unresolved":false,"context_lines":[{"line_number":1460,"context_line":"                                            None]"},{"line_number":1461,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1462,"context_line":"        self.driver._plug_vifs(node, instance, network_info)"},{"line_number":1463,"context_line":"        self.assertTrue(2, mock_node.vif_detach.call_count)"},{"line_number":1464,"context_line":""},{"line_number":1465,"context_line":"    @mock.patch.object(FAKE_CLIENT.node, \u0027vif_attach\u0027)"},{"line_number":1466,"context_line":"    def test_plug_vifs_no_network_info(self, mock_vatt):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_6e245d0c","line":1463,"updated":"2017-01-18 15:25:33.000000000","message":"I am lost here too :-(","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15a5f19ff7ba583a72130e8f7eaf03e235c16472","unresolved":false,"context_lines":[{"line_number":1460,"context_line":"                                            None]"},{"line_number":1461,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1462,"context_line":"        self.driver._plug_vifs(node, instance, network_info)"},{"line_number":1463,"context_line":"        self.assertTrue(2, mock_node.vif_detach.call_count)"},{"line_number":1464,"context_line":""},{"line_number":1465,"context_line":"    @mock.patch.object(FAKE_CLIENT.node, \u0027vif_attach\u0027)"},{"line_number":1466,"context_line":"    def test_plug_vifs_no_network_info(self, mock_vatt):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_51982478","line":1463,"updated":"2017-01-18 15:25:33.000000000","message":"I have no idea how this is True. Was vif_detach called? Maybe it has to do with the mock \u0027weirdness\u0027...","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"429714affc948fe9e49b0f4f3b8fcc817a839f95","unresolved":false,"context_lines":[{"line_number":1460,"context_line":"                                            None]"},{"line_number":1461,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1462,"context_line":"        self.driver._plug_vifs(node, instance, network_info)"},{"line_number":1463,"context_line":"        self.assertTrue(2, mock_node.vif_detach.call_count)"},{"line_number":1464,"context_line":""},{"line_number":1465,"context_line":"    @mock.patch.object(FAKE_CLIENT.node, \u0027vif_attach\u0027)"},{"line_number":1466,"context_line":"    def test_plug_vifs_no_network_info(self, mock_vatt):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_bcbcbfdc","line":1463,"in_reply_to":"7a3c09a3_6e245d0c","updated":"2017-01-18 16:04:20.000000000","message":"should be assertEqual not assertTrue.","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"429714affc948fe9e49b0f4f3b8fcc817a839f95","unresolved":false,"context_lines":[{"line_number":1504,"context_line":""},{"line_number":1505,"context_line":"        mock_node.get.assert_called_once_with("},{"line_number":1506,"context_line":"            node_uuid, fields\u003dironic_driver._NODE_FIELDS)"},{"line_number":1507,"context_line":"        self.assertTrue(len(network_info), mock_node.vif_detach.call_count)"},{"line_number":1508,"context_line":""},{"line_number":1509,"context_line":"    @mock.patch.object(FAKE_CLIENT.node, \u0027vif_detach\u0027)"},{"line_number":1510,"context_line":"    def test_unplug_vifs_no_network_info(self, mock_vdet):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_dc30ab58","line":1507,"updated":"2017-01-18 16:04:20.000000000","message":"ditto about assertEqual","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8a30925e10272920b475f98c565e002b7374729b","unresolved":false,"context_lines":[{"line_number":1441,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1442,"context_line":"        self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":1443,"context_line":"                          self.driver._plug_vifs, node, instance,"},{"line_number":1444,"context_line":"                          network_info)"},{"line_number":1445,"context_line":""},{"line_number":1446,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"},{"line_number":1447,"context_line":"    def test_plug_vifs_already_attached(self, mock_node):"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_9d437dae","line":1444,"updated":"2017-01-18 16:21:11.000000000","message":"nit: you could check that mock_node.vif_attach was called twice, since that assert should happen after the 2nd call, not the first, right?","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"bce47d25510dd5f452911f2eefdbaa9236110ac9","unresolved":false,"context_lines":[{"line_number":1441,"context_line":"        network_info \u003d [first_vif, second_vif]"},{"line_number":1442,"context_line":"        self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":1443,"context_line":"                          self.driver._plug_vifs, node, instance,"},{"line_number":1444,"context_line":"                          network_info)"},{"line_number":1445,"context_line":""},{"line_number":1446,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"},{"line_number":1447,"context_line":"    def test_plug_vifs_already_attached(self, mock_node):"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_6f0294b5","line":1444,"in_reply_to":"7a3c09a3_9d437dae","updated":"2017-01-18 18:03:37.000000000","message":"right, it should be called twice, and when vif_attach() called second time it throwing exception.","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"}],"nova/tests/unit/virt/ironic/test_patcher.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"             \u0027value\u0027: str(self.node.properties.get(\u0027local_gb\u0027, 0)),"},{"line_number":62,"context_line":"             \u0027op\u0027: \u0027add\u0027},"},{"line_number":63,"context_line":"            {\u0027op\u0027: \u0027add\u0027, \u0027path\u0027: \u0027/instance_info/nova_host_id\u0027,"},{"line_number":64,"context_line":"             \u0027value\u0027: u\u0027fake-host\u0027}"},{"line_number":65,"context_line":"        ]"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def assertPatchEqual(self, expected, observed):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_2295f63f","line":64,"updated":"2017-01-12 23:04:18.000000000","message":"nit: why isn\u0027t this in the same format/order as the above (path, value, op)? Would have made it easier for me to review :)","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"             \u0027value\u0027: str(self.node.properties.get(\u0027local_gb\u0027, 0)),"},{"line_number":62,"context_line":"             \u0027op\u0027: \u0027add\u0027},"},{"line_number":63,"context_line":"            {\u0027op\u0027: \u0027add\u0027, \u0027path\u0027: \u0027/instance_info/nova_host_id\u0027,"},{"line_number":64,"context_line":"             \u0027value\u0027: u\u0027fake-host\u0027}"},{"line_number":65,"context_line":"        ]"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def assertPatchEqual(self, expected, observed):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_c546eebe","line":64,"in_reply_to":"7a3c09a3_2295f63f","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"9caa6e9bb1e01da15066526f6d3c9e157f6fcbbf","unresolved":false,"context_lines":[{"line_number":61,"context_line":"             \u0027value\u0027: str(self.node.properties.get(\u0027local_gb\u0027, 0)),"},{"line_number":62,"context_line":"             \u0027op\u0027: \u0027add\u0027},"},{"line_number":63,"context_line":"            {\u0027path\u0027: \u0027/instance_info/nova_host_id\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":64,"context_line":"             \u0027value\u0027: u\u0027fake-host\u0027}"},{"line_number":65,"context_line":"        ]"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def assertPatchEqual(self, expected, observed):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_604c2cc8","line":64,"updated":"2017-01-13 18:18:03.000000000","message":"nit: still isn\u0027t the same format. If we want it to be the same, it would be:\n\n            {\u0027path\u0027: \u0027/instance_info/nova_host_id\u0027,\n             \u0027value\u0027: u\u0027fake-host\u0027,\n             \u0027op\u0027: \u0027add\u0027},","commit_id":"acdc65bb363b07712ea9a50b282531d19a6bc2ae"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"1cf41c317e9cf426b07a2a6d2d9dd5925c5673dd","unresolved":false,"context_lines":[{"line_number":61,"context_line":"             \u0027value\u0027: str(self.node.properties.get(\u0027local_gb\u0027, 0)),"},{"line_number":62,"context_line":"             \u0027op\u0027: \u0027add\u0027},"},{"line_number":63,"context_line":"            {\u0027path\u0027: \u0027/instance_info/nova_host_id\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":64,"context_line":"             \u0027value\u0027: u\u0027fake-host\u0027}"},{"line_number":65,"context_line":"        ]"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def assertPatchEqual(self, expected, observed):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_6a777e3a","line":64,"in_reply_to":"7a3c09a3_604c2cc8","updated":"2017-01-16 08:36:08.000000000","message":"I need to be more attentive next time","commit_id":"acdc65bb363b07712ea9a50b282531d19a6bc2ae"}],"nova/tests/unit/virt/ironic/utils.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def get_by_instance_uuid(self, instance_uuid, fields\u003dNone):"},{"line_number":121,"context_line":"        pass"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def list_ports(self, node_uuid):"},{"line_number":124,"context_line":"        pass"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def set_power_state(self, node_uuid, target):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_7dbb230f","line":123,"updated":"2017-01-12 23:04:18.000000000","message":"don\u0027t need this any more?","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def get_by_instance_uuid(self, instance_uuid, fields\u003dNone):"},{"line_number":121,"context_line":"        pass"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def list_ports(self, node_uuid):"},{"line_number":124,"context_line":"        pass"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def set_power_state(self, node_uuid, target):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_f09f2ab2","line":123,"in_reply_to":"7a3c09a3_7dbb230f","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"}],"nova/virt/driver.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"    # NOTE(vsaienko) This method is deprecated, don\u0027t use it!"},{"line_number":1246,"context_line":"    # TODO(vsaienko) Remove this function after ocata-eol."},{"line_number":1247,"context_line":"    def macs_for_instance(self, instance):"},{"line_number":1248,"context_line":"        \"\"\"What MAC addresses must this instance have?"},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":"        Some hypervisors (such as bare metal) cannot do freeform virtualization"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_a2c64614","line":1247,"updated":"2017-01-12 23:04:18.000000000","message":"Dumb question. Was this only used for ironic? What if some out-of-tree driver used it? (Although I don\u0027t think this is considered a nova api so it is fine to deprecate?)\n\nAlso, what about this call [1]. Is it this method that is being called, and if so, what\u0027s the plan for changing it?\n\n[1] https://github.com/openstack/nova/blob/5081ff90b802544eb5e5b7f39c05a2a65b8da63b/nova/compute/manager.py#L1446","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"377d437add02faf40f6cf4514008a89bdba7004a","unresolved":false,"context_lines":[{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"    # NOTE(vsaienko) This method is deprecated, don\u0027t use it!"},{"line_number":1246,"context_line":"    # TODO(vsaienko) Remove this function after ocata-eol."},{"line_number":1247,"context_line":"    def macs_for_instance(self, instance):"},{"line_number":1248,"context_line":"        \"\"\"What MAC addresses must this instance have?"},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":"        Some hypervisors (such as bare metal) cannot do freeform virtualization"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_c8d7f321","line":1247,"in_reply_to":"7a3c09a3_a2c64614","updated":"2017-01-12 23:09:26.000000000","message":"Sorry, just saw the comment from Matt: https://review.openstack.org/#/c/364413/10/nova/virt/ironic/driver.py\n\nMaybe we should add more to this NOTE, can\u0027t just delete it before the clean up mentioned by Matt.","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1242,"context_line":"        \"\"\"Does the driver want networks deallocated on reschedule?\"\"\""},{"line_number":1243,"context_line":"        return False"},{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"    # NOTE(vsaienko) This method is deprecated, don\u0027t use it!"},{"line_number":1246,"context_line":"    # TODO(vsaienko) Remove this function after ocata-eol."},{"line_number":1247,"context_line":"    # Removing this at a later date would allow us to clean up some technical"},{"line_number":1248,"context_line":"    # debt in the network allocation flows where we\u0027re passing this around."},{"line_number":1249,"context_line":"    def macs_for_instance(self, instance):"},{"line_number":1250,"context_line":"        \"\"\"What MAC addresses must this instance have?"},{"line_number":1251,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_a7d68d4c","line":1248,"range":{"start_line":1245,"start_character":4,"end_line":1248,"end_character":75},"updated":"2017-01-18 02:44:05.000000000","message":"I\u0027m not even sure if we can\u0027t just remove this in Ocata since the only thing using it is the compute manager:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/compute/manager.py#n1446\n\nAnd it\u0027s just going to always pass None into the network API. I\u0027m not sure what I was thinking with n-1 support for this since nothing in the Pike API would be calling this in the Ocata compute, but regardless, we/I/someone can clean this thing out in a follow on patch so as to not clutter up this change.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1242,"context_line":"        \"\"\"Does the driver want networks deallocated on reschedule?\"\"\""},{"line_number":1243,"context_line":"        return False"},{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"    # NOTE(vsaienko) This method is deprecated, don\u0027t use it!"},{"line_number":1246,"context_line":"    # TODO(vsaienko) Remove this function after ocata-eol."},{"line_number":1247,"context_line":"    # Removing this at a later date would allow us to clean up some technical"},{"line_number":1248,"context_line":"    # debt in the network allocation flows where we\u0027re passing this around."},{"line_number":1249,"context_line":"    def macs_for_instance(self, instance):"},{"line_number":1250,"context_line":"        \"\"\"What MAC addresses must this instance have?"},{"line_number":1251,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_4e4dfa98","line":1248,"range":{"start_line":1245,"start_character":4,"end_line":1248,"end_character":75},"in_reply_to":"7a3c09a3_a7d68d4c","updated":"2017-01-18 09:50:59.000000000","message":"Removed mention about removing it after ocata-eol.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"818eb129afd94c74db6cc51be808b22f2ead448a","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"        return False"},{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"    # NOTE(vsaienko) This method is deprecated, don\u0027t use it!"},{"line_number":1246,"context_line":"    # TODO(vsaienko) Remove this function in Ocata."},{"line_number":1247,"context_line":"    def macs_for_instance(self, instance):"},{"line_number":1248,"context_line":"        \"\"\"What MAC addresses must this instance have?"},{"line_number":1249,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_b9f3e671","line":1246,"range":{"start_line":1246,"start_character":4,"end_line":1246,"end_character":51},"updated":"2017-01-18 17:46:25.000000000","message":"nit: we could probably just omit this for now until we figure out when the best time to remove it is, but whatever.","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"afc34d6c84d0c6fde0ab0dad897b2f5a737df64e","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"        return False"},{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"    # NOTE(vsaienko) This method is deprecated, don\u0027t use it!"},{"line_number":1246,"context_line":"    # TODO(vsaienko) Remove this function in Ocata."},{"line_number":1247,"context_line":"    def macs_for_instance(self, instance):"},{"line_number":1248,"context_line":"        \"\"\"What MAC addresses must this instance have?"},{"line_number":1249,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_d55f7e73","line":1246,"range":{"start_line":1246,"start_character":4,"end_line":1246,"end_character":51},"in_reply_to":"7a3c09a3_b9f3e671","updated":"2017-01-19 12:12:32.000000000","message":"Yeah, feels like we can remove this now, but lets not bog down on that.","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21f268e1de0dc6704c50b6283534cd6d3e04cb2b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The API version required by the Ironic driver"},{"line_number":37,"context_line":"IRONIC_API_VERSION \u003d (1, 27)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_46398fd6","line":37,"updated":"2016-12-27 21:16:46.000000000","message":"We should have a release note for this.","commit_id":"c9b95e5ec5fbcf84ac892f7d7fa84031cd092b57"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"70c4e35d0ae2ca293cd3e2ac74eed52a2b1241b0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The API version required by the Ironic driver"},{"line_number":37,"context_line":"IRONIC_API_VERSION \u003d (1, 27)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_6d9372fb","line":37,"in_reply_to":"da4df55a_46398fd6","updated":"2016-12-29 13:42:34.000000000","message":"Done","commit_id":"c9b95e5ec5fbcf84ac892f7d7fa84031cd092b57"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21f268e1de0dc6704c50b6283534cd6d3e04cb2b","unresolved":false,"context_lines":[{"line_number":669,"context_line":"        \"\"\""},{"line_number":670,"context_line":"        return True"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"    def macs_for_instance(self, instance):"},{"line_number":673,"context_line":"        \"\"\"List the MAC addresses of an instance."},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        List of MAC addresses for the node which this instance is"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_66493360","side":"PARENT","line":672,"range":{"start_line":672,"start_character":8,"end_line":672,"end_character":25},"updated":"2016-12-27 21:16:46.000000000","message":"This method is only implemented by the Ironic virt driver. We should probably add a TODO in the base class method to remove it after ocata-eol. We might even be able to remove it after n-1, so after we release Pike (Nova 16.0.0) since nova only supports n-1 on computes for rolling upgrades. But removing this at a later date would allow us to clean up some technical debt in the network allocation flows where we\u0027re passing this around.","commit_id":"357df87ff386b8f71969ed16d49f25b7aabe4fd7"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"70c4e35d0ae2ca293cd3e2ac74eed52a2b1241b0","unresolved":false,"context_lines":[{"line_number":669,"context_line":"        \"\"\""},{"line_number":670,"context_line":"        return True"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"    def macs_for_instance(self, instance):"},{"line_number":673,"context_line":"        \"\"\"List the MAC addresses of an instance."},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        List of MAC addresses for the node which this instance is"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_4dadce30","side":"PARENT","line":672,"range":{"start_line":672,"start_character":8,"end_line":672,"end_character":25},"in_reply_to":"da4df55a_66493360","updated":"2016-12-29 13:42:34.000000000","message":"Done","commit_id":"357df87ff386b8f71969ed16d49f25b7aabe4fd7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dad8458e2ea64f336198357ad98f90d88ffd6171","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"            port_id \u003d six.text_type(vif[\u0027id\u0027])"},{"line_number":1042,"context_line":"            try:"},{"line_number":1043,"context_line":"                self.ironicclient.call(\"node.vif_attach\", node.uuid, port_id)"},{"line_number":1044,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1045,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to a node %(node)s due to \""},{"line_number":1046,"context_line":"                         \"error: %(err)s\") % {\u0027vif\u0027: vif, \u0027node\u0027: node.uuid,"},{"line_number":1047,"context_line":"                                              \u0027err\u0027: e})"},{"line_number":1048,"context_line":"                LOG.error(msg)"},{"line_number":1049,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1050,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1051,"context_line":"                # NOTE (vsaienko) Pass if VIF already attached."},{"line_number":1052,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_26b1eb47","line":1049,"range":{"start_line":1044,"start_character":12,"end_line":1049,"end_character":66},"updated":"2016-12-27 21:23:15.000000000","message":"If something fails here, should we unplug anything that was previously plugged in this operation before we raise the exception up to the caller?","commit_id":"c9b95e5ec5fbcf84ac892f7d7fa84031cd092b57"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"70c4e35d0ae2ca293cd3e2ac74eed52a2b1241b0","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"            port_id \u003d six.text_type(vif[\u0027id\u0027])"},{"line_number":1042,"context_line":"            try:"},{"line_number":1043,"context_line":"                self.ironicclient.call(\"node.vif_attach\", node.uuid, port_id)"},{"line_number":1044,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1045,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to a node %(node)s due to \""},{"line_number":1046,"context_line":"                         \"error: %(err)s\") % {\u0027vif\u0027: vif, \u0027node\u0027: node.uuid,"},{"line_number":1047,"context_line":"                                              \u0027err\u0027: e})"},{"line_number":1048,"context_line":"                LOG.error(msg)"},{"line_number":1049,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1050,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1051,"context_line":"                # NOTE (vsaienko) Pass if VIF already attached."},{"line_number":1052,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_0d72e6e5","line":1049,"range":{"start_line":1044,"start_character":12,"end_line":1049,"end_character":66},"in_reply_to":"da4df55a_26b1eb47","updated":"2016-12-29 13:42:34.000000000","message":"Done","commit_id":"c9b95e5ec5fbcf84ac892f7d7fa84031cd092b57"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21f268e1de0dc6704c50b6283534cd6d3e04cb2b","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"                         ports will be associated with"},{"line_number":1190,"context_line":"        :returns: Always None"},{"line_number":1191,"context_line":"        \"\"\""},{"line_number":1192,"context_line":"        return None"},{"line_number":1193,"context_line":""},{"line_number":1194,"context_line":"    def _get_node_console_with_reset(self, instance):"},{"line_number":1195,"context_line":"        \"\"\"Acquire console information for an instance."}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_e61d2363","line":1192,"updated":"2016-12-27 21:16:46.000000000","message":"Given the massive docstring on this method, it\u0027d probably be worthwhile to have a comment in here about why this is always None.","commit_id":"c9b95e5ec5fbcf84ac892f7d7fa84031cd092b57"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"70c4e35d0ae2ca293cd3e2ac74eed52a2b1241b0","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"                         ports will be associated with"},{"line_number":1190,"context_line":"        :returns: Always None"},{"line_number":1191,"context_line":"        \"\"\""},{"line_number":1192,"context_line":"        return None"},{"line_number":1193,"context_line":""},{"line_number":1194,"context_line":"    def _get_node_console_with_reset(self, instance):"},{"line_number":1195,"context_line":"        \"\"\"Acquire console information for an instance."}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_cdc0dee3","line":1192,"in_reply_to":"da4df55a_e61d2363","updated":"2016-12-29 13:42:34.000000000","message":"Done","commit_id":"c9b95e5ec5fbcf84ac892f7d7fa84031cd092b57"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"81ec954860cf24a5ee0c64da5045111b4b8720c6","unresolved":false,"context_lines":[{"line_number":1044,"context_line":"                self.ironicclient.call(\"node.vif_attach\", node.uuid, port_id)"},{"line_number":1045,"context_line":"                attached_vifs.append(vif)"},{"line_number":1046,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1047,"context_line":"                self._unplug_vifs(node, instance, attached_vifs)"},{"line_number":1048,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to a node %(node)s due to \""},{"line_number":1049,"context_line":"                         \"error: %(err)s\") % {\u0027vif\u0027: vif, \u0027node\u0027: node.uuid,"},{"line_number":1050,"context_line":"                                              \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_312534ab","line":1047,"updated":"2017-01-13 10:01:59.000000000","message":"If I remember correctly we shouldn\u0027t need to put this code here, nova already handles calling the right functions to tear down a deploy when a failure is raised, so unplug vifs will be called by Nova automatically","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1044,"context_line":"                self.ironicclient.call(\"node.vif_attach\", node.uuid, port_id)"},{"line_number":1045,"context_line":"                attached_vifs.append(vif)"},{"line_number":1046,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1047,"context_line":"                self._unplug_vifs(node, instance, attached_vifs)"},{"line_number":1048,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to a node %(node)s due to \""},{"line_number":1049,"context_line":"                         \"error: %(err)s\") % {\u0027vif\u0027: vif, \u0027node\u0027: node.uuid,"},{"line_number":1050,"context_line":"                                              \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_5c401457","line":1047,"in_reply_to":"7a3c09a3_312534ab","updated":"2017-01-13 12:56:10.000000000","message":"If something goes wrong instance will be moved to an error state. And _unplug_vifs() will be called at _cleanup_deploy() [0] \n\nso indeed, no need to call it here.\n\n[0] https://github.com/openstack/nova/blob/master/nova/virt/ironic/driver.py#L797\n\n[1] https://github.com/openstack/nova/blob/master/nova/virt/ironic/driver.py#L396","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"                attached_vifs.append(vif)"},{"line_number":1046,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1047,"context_line":"                self._unplug_vifs(node, instance, attached_vifs)"},{"line_number":1048,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to a node %(node)s due to \""},{"line_number":1049,"context_line":"                         \"error: %(err)s\") % {\u0027vif\u0027: vif, \u0027node\u0027: node.uuid,"},{"line_number":1050,"context_line":"                                              \u0027err\u0027: e})"},{"line_number":1051,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_7d3163ec","line":1048,"updated":"2017-01-12 23:04:18.000000000","message":"nit s/to a/to the/","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"                attached_vifs.append(vif)"},{"line_number":1046,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1047,"context_line":"                self._unplug_vifs(node, instance, attached_vifs)"},{"line_number":1048,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to a node %(node)s due to \""},{"line_number":1049,"context_line":"                         \"error: %(err)s\") % {\u0027vif\u0027: vif, \u0027node\u0027: node.uuid,"},{"line_number":1050,"context_line":"                                              \u0027err\u0027: e})"},{"line_number":1051,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_f0ed6a26","line":1048,"in_reply_to":"7a3c09a3_7d3163ec","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                LOG.error(msg)"},{"line_number":1052,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1053,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1054,"context_line":"                # NOTE (vsaienko) Pass if VIF already attached."},{"line_number":1055,"context_line":"                pass"},{"line_number":1056,"context_line":""},{"line_number":1057,"context_line":"    def _unplug_vifs(self, node, instance, network_info):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_5de74740","line":1054,"updated":"2017-01-12 23:04:18.000000000","message":"What do you mean by this comment. That this Conflict exception was raised because this VIF is already attached to the node? In that case, maybe this will be clearer: s/if/since/. (I was expecting an \u0027if\u0027 statement to follow this comment.)","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"81ec954860cf24a5ee0c64da5045111b4b8720c6","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                LOG.error(msg)"},{"line_number":1052,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1053,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1054,"context_line":"                # NOTE (vsaienko) Pass if VIF already attached."},{"line_number":1055,"context_line":"                pass"},{"line_number":1056,"context_line":""},{"line_number":1057,"context_line":"    def _unplug_vifs(self, node, instance, network_info):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_71c17c80","line":1054,"in_reply_to":"7a3c09a3_5de74740","updated":"2017-01-13 10:01:59.000000000","message":"It seems like in the current implementations, Conflict is only raised in the case when a vif is already attached, however I am unsure about ignoring this error, IMO the vif shouldn\u0027t already be attached, that means the node wasn\u0027t cleaned up properly after the last deployment, and also in some third party network implementations it might be that certain vif attachments might be incompatible, so I wouldn\u0027t rule out conflict\u0027s meaning something different than vif already attached.","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                LOG.error(msg)"},{"line_number":1052,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1053,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1054,"context_line":"                # NOTE (vsaienko) Pass if VIF already attached."},{"line_number":1055,"context_line":"                pass"},{"line_number":1056,"context_line":""},{"line_number":1057,"context_line":"    def _unplug_vifs(self, node, instance, network_info):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_d773fd4b","line":1054,"in_reply_to":"7a3c09a3_71c17c80","updated":"2017-01-13 12:56:10.000000000","message":"I\u0027m not sure that out of tree network driver implementations should raise Conflict for other cases that VIF is attached, propper exception is Invalid. Furthermore Nova works only with Neutron, why used need to have custom network driver that works with neutron when Ironic already provides it?","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"                                       port_id)"},{"line_number":1072,"context_line":"            except ironic.exc.BadRequest:"},{"line_number":1073,"context_line":"                LOG.debug(\"VIF %(vif)s isn\u0027t attached to Ironic node %(node)s\","},{"line_number":1074,"context_line":"                          {\u0027vif\u0027: vif.uuid, \u0027node\u0027: node.uuid})"},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":1077,"context_line":"        \"\"\"Plug VIFs into networks."}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_5d93c7fa","line":1074,"updated":"2017-01-12 23:04:18.000000000","message":"I\u0027m not sure we want vif.uuid. Maybe port_id or vif[\u0027id\u0027] or vif?","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"                                       port_id)"},{"line_number":1072,"context_line":"            except ironic.exc.BadRequest:"},{"line_number":1073,"context_line":"                LOG.debug(\"VIF %(vif)s isn\u0027t attached to Ironic node %(node)s\","},{"line_number":1074,"context_line":"                          {\u0027vif\u0027: vif.uuid, \u0027node\u0027: node.uuid})"},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":1077,"context_line":"        \"\"\"Plug VIFs into networks."}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_579e2d57","line":1074,"in_reply_to":"7a3c09a3_5d93c7fa","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"223eab584d310e285b3f6638a002cd94f9af94d9","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"        :param context:  request context"},{"line_number":1190,"context_line":"        :param instance: nova.objects.instance.Instance that the network"},{"line_number":1191,"context_line":"                         ports will be associated with"},{"line_number":1192,"context_line":"        :returns: Always None"},{"line_number":1193,"context_line":"        \"\"\""},{"line_number":1194,"context_line":"        # NOTE(vsaienko) Ironic will set binding:host_id later with port-update"},{"line_number":1195,"context_line":"        # call when updating mac address or setting binding:profile"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_2813175e","line":1192,"updated":"2017-01-12 23:04:18.000000000","message":"I think it is sufficient to s/Always //","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"73acb21b72012fd7e3a1d0c884e9330ca0887b0e","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"        :param context:  request context"},{"line_number":1190,"context_line":"        :param instance: nova.objects.instance.Instance that the network"},{"line_number":1191,"context_line":"                         ports will be associated with"},{"line_number":1192,"context_line":"        :returns: Always None"},{"line_number":1193,"context_line":"        \"\"\""},{"line_number":1194,"context_line":"        # NOTE(vsaienko) Ironic will set binding:host_id later with port-update"},{"line_number":1195,"context_line":"        # call when updating mac address or setting binding:profile"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_d21a2b6e","line":1192,"in_reply_to":"7a3c09a3_2813175e","updated":"2017-01-13 12:56:10.000000000","message":"Done","commit_id":"30ca91aad717948a0cc004924fc7857b4a536dc8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"11478d0c3f24b28d69964b4139eb2bbcbfec4631","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"        for vif in network_info:"},{"line_number":1041,"context_line":"            port_id \u003d six.text_type(vif[\u0027id\u0027])"},{"line_number":1042,"context_line":"            try:"},{"line_number":1043,"context_line":"                self.ironicclient.call(\"node.vif_attach\", node.uuid, port_id,"},{"line_number":1044,"context_line":"                                       retry_on_conflict\u003dFalse)"},{"line_number":1045,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1046,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to the node %(node)s due \""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a3c09a3_15757af8","line":1043,"updated":"2017-01-13 13:19:07.000000000","message":"Since we are updating mac_address at ironic side, we need to sync/update it here in nova network_info to generate config drive data with correct value.","commit_id":"f76a3ebfb515eaddad66ae305bc4dc9ccd6e7074"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"bc3e7e32ef9bc7071fe16eb68132456beeee2f96","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        \"\"\""},{"line_number":671,"context_line":"        return True"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"    def _get_network_metadata(self, node, network_info):"},{"line_number":674,"context_line":"        base_metadata \u003d netutils.get_network_metadata(network_info)"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","}],"source_content_type":"text/x-python","patch_set":21,"id":"7a3c09a3_02e40539","line":673,"updated":"2017-01-16 16:51:15.000000000","message":"nit: we aren\u0027t consistent here, but might be worth adding a docstring here to indicate what this is doing. (L691 explains it but ...)","commit_id":"bf2133ece12354e4732e4e1a1e2118ca6de86d0a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3c6ed1bac1b171aa552f58e27a8ca656ad294b5b","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        \"\"\""},{"line_number":671,"context_line":"        return True"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"    def _get_network_metadata(self, node, network_info):"},{"line_number":674,"context_line":"        base_metadata \u003d netutils.get_network_metadata(network_info)"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","}],"source_content_type":"text/x-python","patch_set":21,"id":"7a3c09a3_4119a4d6","line":673,"in_reply_to":"7a3c09a3_02e40539","updated":"2017-01-16 19:29:20.000000000","message":"Agreed, even a minor docstring would be useful.","commit_id":"bf2133ece12354e4732e4e1a1e2118ca6de86d0a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"bc3e7e32ef9bc7071fe16eb68132456beeee2f96","unresolved":false,"context_lines":[{"line_number":676,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","},{"line_number":677,"context_line":"                                       node.uuid, detail\u003dTrue)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        # TODO(vsaienko) add support of portgroups"},{"line_number":680,"context_line":"        vif_id_to_objects \u003d {\u0027ports\u0027: {}}"},{"line_number":681,"context_line":"        for p in ports:"},{"line_number":682,"context_line":"            vif_id \u003d (p.internal_info.get(\u0027tenant_vif_port_id\u0027) or"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a3c09a3_7feba6b0","line":679,"updated":"2017-01-16 16:51:15.000000000","message":"why don\u0027t you code this now?","commit_id":"bf2133ece12354e4732e4e1a1e2118ca6de86d0a"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e61429b47ddb7c3c479efe8bf505f97102d6cc74","unresolved":false,"context_lines":[{"line_number":676,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","},{"line_number":677,"context_line":"                                       node.uuid, detail\u003dTrue)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        # TODO(vsaienko) add support of portgroups"},{"line_number":680,"context_line":"        vif_id_to_objects \u003d {\u0027ports\u0027: {}}"},{"line_number":681,"context_line":"        for p in ports:"},{"line_number":682,"context_line":"            vif_id \u003d (p.internal_info.get(\u0027tenant_vif_port_id\u0027) or"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a3c09a3_e221b9fc","line":679,"in_reply_to":"7a3c09a3_7feba6b0","updated":"2017-01-16 16:54:47.000000000","message":"It\u0027s added in consequent patch - https://review.openstack.org/#/c/388756/14 :) and depends on the portgroup attach patch in ironic. Apart from that, portgroup configdrive stuff was a separate blueprint, hence the separation here.","commit_id":"bf2133ece12354e4732e4e1a1e2118ca6de86d0a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ae26f466ab8609ff70cc355abf4683b02b8c6c02","unresolved":false,"context_lines":[{"line_number":676,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","},{"line_number":677,"context_line":"                                       node.uuid, detail\u003dTrue)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        # TODO(vsaienko) add support of portgroups"},{"line_number":680,"context_line":"        vif_id_to_objects \u003d {\u0027ports\u0027: {}}"},{"line_number":681,"context_line":"        for p in ports:"},{"line_number":682,"context_line":"            vif_id \u003d (p.internal_info.get(\u0027tenant_vif_port_id\u0027) or"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a3c09a3_a25fb13f","line":679,"in_reply_to":"7a3c09a3_e221b9fc","updated":"2017-01-16 16:57:32.000000000","message":"Thx for explaining. (I\u0027m not sure it needs a TODO then since it is a separate \u0027feature\u0027, but maybe someone else might want to see this :)","commit_id":"bf2133ece12354e4732e4e1a1e2118ca6de86d0a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"bc3e7e32ef9bc7071fe16eb68132456beeee2f96","unresolved":false,"context_lines":[{"line_number":1073,"context_line":"                         \"to error: %(err)s\") % {\u0027vif\u0027: port_id,"},{"line_number":1074,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1075,"context_line":"                LOG.error(msg)"},{"line_number":1076,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1077,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1078,"context_line":"                # NOTE (vsaienko) Pass since VIF already attached."},{"line_number":1079,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a3c09a3_ffd796ea","line":1076,"updated":"2017-01-16 16:51:15.000000000","message":"nit: wondering if it would be useful to add Vasyl\u0027s comment from patch set  14. eg, \"No need to clean up vifs here. If something goes wrong, the instance will be moved to an error state and _unplug_vifs() will be called at _cleanup_deploy()\".","commit_id":"bf2133ece12354e4732e4e1a1e2118ca6de86d0a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"        LOG.debug(\"plug: instance_uuid\u003d%(uuid)s vif\u003d%(network_info)s\","},{"line_number":1069,"context_line":"                  {\u0027uuid\u0027: instance.uuid,"},{"line_number":1070,"context_line":"                   \u0027network_info\u0027: network_info_str})"},{"line_number":1071,"context_line":"        # start by ensuring the ports are clear"},{"line_number":1072,"context_line":"        self._unplug_vifs(node, instance, network_info)"},{"line_number":1073,"context_line":""},{"line_number":1074,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\", node.uuid)"},{"line_number":1075,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_023e6fc0","side":"PARENT","line":1072,"range":{"start_line":1071,"start_character":8,"end_line":1072,"end_character":55},"updated":"2017-01-18 02:44:05.000000000","message":"So this is something we don\u0027t have to care about anymore? What about instances created in Newton, can we have issues when upgrading to Ocata and using this code?","commit_id":"098c4e8ca67179089eb0813784f191702df4f3f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1072,"context_line":"        # NOTE(PhilDay): Accessing network_info will block if the thread"},{"line_number":1073,"context_line":"        # it wraps hasn\u0027t finished, so do this ahead of time so that we"},{"line_number":1074,"context_line":"        # don\u0027t block while holding the logging lock."},{"line_number":1075,"context_line":"        network_info_str \u003d str(network_info)"},{"line_number":1076,"context_line":"        LOG.debug(\"plug: instance_uuid\u003d%(uuid)s vif\u003d%(network_info)s\","},{"line_number":1077,"context_line":"                  {\u0027uuid\u0027: instance.uuid,"},{"line_number":1078,"context_line":"                   \u0027network_info\u0027: network_info_str})"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_274a9d26","line":1075,"updated":"2017-01-18 02:44:05.000000000","message":"Totally unrelated to this change, but I could have sworn that at one point I had to fix a security bug where we were leaking credentials into the logs from network_info and/or there are potential issues with i18n unicode encode/decode issues and casting this to str. But that\u0027s a concern for a separate change.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"                self.ironicclient.call(\"node.vif_attach\", node.uuid, port_id,"},{"line_number":1083,"context_line":"                                       retry_on_conflict\u003dFalse)"},{"line_number":1084,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1085,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to the node %(node)s due \""},{"line_number":1086,"context_line":"                         \"to error: %(err)s\") % {\u0027vif\u0027: port_id,"},{"line_number":1087,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1088,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_4706c920","line":1085,"range":{"start_line":1085,"start_character":26,"end_line":1085,"end_character":31},"updated":"2017-01-18 02:44:05.000000000","message":"nit: normally I don\u0027t think we want contractions in translated messages, so I\u0027d use \u0027Cannot\u0027 if you respin.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"                self.ironicclient.call(\"node.vif_attach\", node.uuid, port_id,"},{"line_number":1083,"context_line":"                                       retry_on_conflict\u003dFalse)"},{"line_number":1084,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":1085,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to the node %(node)s due \""},{"line_number":1086,"context_line":"                         \"to error: %(err)s\") % {\u0027vif\u0027: port_id,"},{"line_number":1087,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1088,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_8e11a25f","line":1085,"range":{"start_line":1085,"start_character":26,"end_line":1085,"end_character":31},"in_reply_to":"7a3c09a3_4706c920","updated":"2017-01-18 09:50:59.000000000","message":"Done","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to the node %(node)s due \""},{"line_number":1086,"context_line":"                         \"to error: %(err)s\") % {\u0027vif\u0027: port_id,"},{"line_number":1087,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1088,"context_line":"                LOG.error(msg)"},{"line_number":1089,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1090,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1091,"context_line":"                # NOTE (vsaienko) Pass since VIF already attached."}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_672ae591","line":1088,"updated":"2017-01-18 02:44:05.000000000","message":"I\u0027m not entirely sure this needs to be logged at ERROR level, is this something that should cause an operator to get paged in the middle of the night?","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to the node %(node)s due \""},{"line_number":1086,"context_line":"                         \"to error: %(err)s\") % {\u0027vif\u0027: port_id,"},{"line_number":1087,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1088,"context_line":"                LOG.error(msg)"},{"line_number":1089,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1090,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1091,"context_line":"                # NOTE (vsaienko) Pass since VIF already attached."}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_a1b2efe2","line":1088,"in_reply_to":"7a3c09a3_672ae591","updated":"2017-01-18 09:50:59.000000000","message":"Throwing this exception will anyway raise log exception on compute manager [0], but it will not contain specific error message for the failure.\n\n[0] https://github.com/openstack/nova/blob/5081ff90b802544eb5e5b7f39c05a2a65b8da63b/nova/compute/manager.py#L963","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eb4cebae24de88de444a74491b8548321b1bc99b","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to the node %(node)s due \""},{"line_number":1086,"context_line":"                         \"to error: %(err)s\") % {\u0027vif\u0027: port_id,"},{"line_number":1087,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1088,"context_line":"                LOG.error(msg)"},{"line_number":1089,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1090,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1091,"context_line":"                # NOTE (vsaienko) Pass since VIF already attached."}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_bec10ce6","line":1088,"in_reply_to":"7a3c09a3_a1b2efe2","updated":"2017-01-18 17:36:00.000000000","message":"The LOG.exception will include the traceback, it doesn\u0027t also include the original error message used here?","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"a13e082cabfedefedb0ba09cf7ddf3cdd5b1e5b2","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"                msg \u003d (_(\"Can\u0027t attach VIF %(vif)s to the node %(node)s due \""},{"line_number":1086,"context_line":"                         \"to error: %(err)s\") % {\u0027vif\u0027: port_id,"},{"line_number":1087,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1088,"context_line":"                LOG.error(msg)"},{"line_number":1089,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1090,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1091,"context_line":"                # NOTE (vsaienko) Pass since VIF already attached."}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_54572725","line":1088,"in_reply_to":"7a3c09a3_bec10ce6","updated":"2017-01-18 18:03:24.000000000","message":"It will be there :) will fix if reupload or in a follow-up","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1087,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1088,"context_line":"                LOG.error(msg)"},{"line_number":1089,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1090,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1091,"context_line":"                # NOTE (vsaienko) Pass since VIF already attached."},{"line_number":1092,"context_line":"                pass"},{"line_number":1093,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_c281c7fc","line":1090,"range":{"start_line":1090,"start_character":30,"end_line":1090,"end_character":38},"updated":"2017-01-18 02:44:05.000000000","message":"I don\u0027t see a test for this case, I might be just missing it though.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1087,"context_line":"                                                 \u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":1088,"context_line":"                LOG.error(msg)"},{"line_number":1089,"context_line":"                raise exception.VirtualInterfacePlugException(msg)"},{"line_number":1090,"context_line":"            except ironic.exc.Conflict:"},{"line_number":1091,"context_line":"                # NOTE (vsaienko) Pass since VIF already attached."},{"line_number":1092,"context_line":"                pass"},{"line_number":1093,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_bf7f6a13","line":1090,"range":{"start_line":1090,"start_character":30,"end_line":1090,"end_character":38},"in_reply_to":"7a3c09a3_c281c7fc","updated":"2017-01-18 09:50:59.000000000","message":"Done","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15a5f19ff7ba583a72130e8f7eaf03e235c16472","unresolved":false,"context_lines":[{"line_number":683,"context_line":"        \"\"\""},{"line_number":684,"context_line":"        return True"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"    def _get_network_metadata(self, node, network_info):"},{"line_number":687,"context_line":"        base_metadata \u003d netutils.get_network_metadata(network_info)"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_8e9269f4","line":686,"updated":"2017-01-18 15:25:33.000000000","message":"nit: we aren\u0027t consistent here, but might be worth adding a docstring here to indicate what this is doing. (L691 explains it but ...)","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"429714affc948fe9e49b0f4f3b8fcc817a839f95","unresolved":false,"context_lines":[{"line_number":683,"context_line":"        \"\"\""},{"line_number":684,"context_line":"        return True"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"    def _get_network_metadata(self, node, network_info):"},{"line_number":687,"context_line":"        base_metadata \u003d netutils.get_network_metadata(network_info)"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_37238857","line":686,"in_reply_to":"7a3c09a3_8e9269f4","updated":"2017-01-18 16:04:20.000000000","message":"Done","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aee5aa5a5ff36433323f89d500108a35c1db904c","unresolved":false,"context_lines":[{"line_number":697,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","},{"line_number":698,"context_line":"                                       node.uuid, detail\u003dTrue)"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        # TODO(vsaienko) add support of portgroups"},{"line_number":701,"context_line":"        vif_id_to_objects \u003d {\u0027ports\u0027: {}}"},{"line_number":702,"context_line":"        for p in ports:"},{"line_number":703,"context_line":"            vif_id \u003d (p.internal_info.get(\u0027tenant_vif_port_id\u0027) or"},{"line_number":704,"context_line":"                      p.extra.get(\u0027vif_port_id\u0027))"},{"line_number":705,"context_line":"            if vif_id:"},{"line_number":706,"context_line":"                vif_id_to_objects[\u0027ports\u0027][vif_id] \u003d p"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        for link in base_metadata[\u0027links\u0027]:"},{"line_number":709,"context_line":"            vif_id \u003d link[\u0027vif_id\u0027]"},{"line_number":710,"context_line":"            if vif_id in vif_id_to_objects[\u0027ports\u0027]:"},{"line_number":711,"context_line":"                p \u003d vif_id_to_objects[\u0027ports\u0027][vif_id]"},{"line_number":712,"context_line":"                # Ironic updates neutron port\u0027s address during attachment"},{"line_number":713,"context_line":"                link.update({\u0027ethernet_mac_address\u0027: p.address,"},{"line_number":714,"context_line":"                             \u0027type\u0027: \u0027phy\u0027})"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        return base_metadata"},{"line_number":717,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_3449bb31","line":714,"range":{"start_line":700,"start_character":8,"end_line":714,"end_character":44},"updated":"2017-01-18 17:52:09.000000000","message":"Does this ultimately behave any different from what it was doing before?","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"afc34d6c84d0c6fde0ab0dad897b2f5a737df64e","unresolved":false,"context_lines":[{"line_number":697,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","},{"line_number":698,"context_line":"                                       node.uuid, detail\u003dTrue)"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        # TODO(vsaienko) add support of portgroups"},{"line_number":701,"context_line":"        vif_id_to_objects \u003d {\u0027ports\u0027: {}}"},{"line_number":702,"context_line":"        for p in ports:"},{"line_number":703,"context_line":"            vif_id \u003d (p.internal_info.get(\u0027tenant_vif_port_id\u0027) or"},{"line_number":704,"context_line":"                      p.extra.get(\u0027vif_port_id\u0027))"},{"line_number":705,"context_line":"            if vif_id:"},{"line_number":706,"context_line":"                vif_id_to_objects[\u0027ports\u0027][vif_id] \u003d p"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        for link in base_metadata[\u0027links\u0027]:"},{"line_number":709,"context_line":"            vif_id \u003d link[\u0027vif_id\u0027]"},{"line_number":710,"context_line":"            if vif_id in vif_id_to_objects[\u0027ports\u0027]:"},{"line_number":711,"context_line":"                p \u003d vif_id_to_objects[\u0027ports\u0027][vif_id]"},{"line_number":712,"context_line":"                # Ironic updates neutron port\u0027s address during attachment"},{"line_number":713,"context_line":"                link.update({\u0027ethernet_mac_address\u0027: p.address,"},{"line_number":714,"context_line":"                             \u0027type\u0027: \u0027phy\u0027})"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        return base_metadata"},{"line_number":717,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_50dd5c6f","line":714,"range":{"start_line":700,"start_character":8,"end_line":714,"end_character":44},"in_reply_to":"7a3c09a3_14059f44","updated":"2017-01-19 12:12:32.000000000","message":"Honestly, I find this harder to read than the previous single loop method, but I guess its setting us up for the portgroup stuff. Certainly seems to be updating the type and mac_address stuff, just keying off the vif_id instead.","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"bce47d25510dd5f452911f2eefdbaa9236110ac9","unresolved":false,"context_lines":[{"line_number":697,"context_line":"        ports \u003d self.ironicclient.call(\"node.list_ports\","},{"line_number":698,"context_line":"                                       node.uuid, detail\u003dTrue)"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        # TODO(vsaienko) add support of portgroups"},{"line_number":701,"context_line":"        vif_id_to_objects \u003d {\u0027ports\u0027: {}}"},{"line_number":702,"context_line":"        for p in ports:"},{"line_number":703,"context_line":"            vif_id \u003d (p.internal_info.get(\u0027tenant_vif_port_id\u0027) or"},{"line_number":704,"context_line":"                      p.extra.get(\u0027vif_port_id\u0027))"},{"line_number":705,"context_line":"            if vif_id:"},{"line_number":706,"context_line":"                vif_id_to_objects[\u0027ports\u0027][vif_id] \u003d p"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        for link in base_metadata[\u0027links\u0027]:"},{"line_number":709,"context_line":"            vif_id \u003d link[\u0027vif_id\u0027]"},{"line_number":710,"context_line":"            if vif_id in vif_id_to_objects[\u0027ports\u0027]:"},{"line_number":711,"context_line":"                p \u003d vif_id_to_objects[\u0027ports\u0027][vif_id]"},{"line_number":712,"context_line":"                # Ironic updates neutron port\u0027s address during attachment"},{"line_number":713,"context_line":"                link.update({\u0027ethernet_mac_address\u0027: p.address,"},{"line_number":714,"context_line":"                             \u0027type\u0027: \u0027phy\u0027})"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        return base_metadata"},{"line_number":717,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_14059f44","line":714,"range":{"start_line":700,"start_character":8,"end_line":714,"end_character":44},"in_reply_to":"7a3c09a3_3449bb31","updated":"2017-01-18 18:03:37.000000000","message":"No, all that this part is doing - updates mac address in network metadata with actual mac address from Ironic. By using ironic VIF attach Nova no longer knows correct mac at this point (configdrive generation) as we do not use macs_for_instance() and update mac address on neutron port from Ironic directly.\n\nUpdate port type to \u0027phy\u0027 is a bugfix https://review.openstack.org/#/c/422068/ that is not related to attach/detach implementation.","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"afc34d6c84d0c6fde0ab0dad897b2f5a737df64e","unresolved":false,"context_lines":[{"line_number":1239,"context_line":"        # NOTE(vsaienko) Ironic will set binding:host_id later with port-update"},{"line_number":1240,"context_line":"        # call when updating mac address or setting binding:profile"},{"line_number":1241,"context_line":"        # to tell Neutron to bind the port."},{"line_number":1242,"context_line":"        return None"},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"    def _get_node_console_with_reset(self, instance):"},{"line_number":1245,"context_line":"        \"\"\"Acquire console information for an instance."}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_24097196","line":1242,"updated":"2017-01-19 12:12:32.000000000","message":"Oh.... so thats how you stop Nova doing the binding.\n\nI have a feeling this works a little bit by accident right now: https://github.com/openstack/nova/blob/ecc8de8d6cccb06d7f4c8ecc144d37612ae1e9cc/nova/network/neutronv2/api.py#L1091\n\nIdeally that line above would be:\n\n  if has_port_binding_extension and bind_host_id:\n\nThat way we don\u0027t send None to neutron for no good reason. The above behaviour is a bit dangerous, as it will actually steal a port from another user without having any errors, but only in extreme racy edge cases.","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"75ba87ec434fdfaf2d6d1a4c675a4a3d1fc351a9","unresolved":false,"context_lines":[{"line_number":1239,"context_line":"        # NOTE(vsaienko) Ironic will set binding:host_id later with port-update"},{"line_number":1240,"context_line":"        # call when updating mac address or setting binding:profile"},{"line_number":1241,"context_line":"        # to tell Neutron to bind the port."},{"line_number":1242,"context_line":"        return None"},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"    def _get_node_console_with_reset(self, instance):"},{"line_number":1245,"context_line":"        \"\"\"Acquire console information for an instance."}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_aef1b8cf","line":1242,"in_reply_to":"5a3905b3_24097196","updated":"2017-01-19 13:50:36.000000000","message":"hmm... how it is possible? When user boot instance with neutron port uuid owned by another user?","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f51bcda5c153f4037fd26904064ba9f3f9a9aafa","unresolved":false,"context_lines":[{"line_number":1239,"context_line":"        # NOTE(vsaienko) Ironic will set binding:host_id later with port-update"},{"line_number":1240,"context_line":"        # call when updating mac address or setting binding:profile"},{"line_number":1241,"context_line":"        # to tell Neutron to bind the port."},{"line_number":1242,"context_line":"        return None"},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"    def _get_node_console_with_reset(self, instance):"},{"line_number":1245,"context_line":"        \"\"\"Acquire console information for an instance."}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_c9b6fe3c","line":1242,"in_reply_to":"5a3905b3_aef1b8cf","updated":"2017-01-19 14:00:49.000000000","message":"Its two users, booting too instances at the same time.\n\nWe have a neutron API change to allow atomic updates of the device_id to fix that, but its probably next cycle at this point.\n\nSo my problem here was more I saw no semantic value in setting the binding host to None. But on discussion in IRC, there is a point to this here, we *need* that to be None in this case. Its not just trying to \"not\" set it, as I first thought. Its a case of making sure its reset from any previous value when we assign the device_id so its assigned to this instance.\n\nI think ironic can leave the race bug to Nova to fix, as we can gate the port ownership on device_id, we are just delegating the binding details to ironic. I quite like the separation of those two activities, and I need to think about that for our neutron refactoring efforts.\n\nFrom a correctness point of view, in unbind port we set the host_id to None, in the same way this is doing it here.\n\nWith all that clear in my head now, I am good with this approach. Not setting it None is probably worse.\n\nThese rambling notes are more for myself than anything.","commit_id":"c08f81280cad5cb494773ed2106c7441afa1f710"}],"nova/virt/ironic/patcher.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                      \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: instance.display_name})"},{"line_number":66,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/vcpus\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":67,"context_line":"                      \u0027value\u0027: str(instance.flavor.vcpus)})"},{"line_number":68,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/nova_host_id\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":69,"context_line":"                      \u0027value\u0027: instance.get(\u0027host\u0027)})"},{"line_number":70,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/memory_mb\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":71,"context_line":"                      \u0027value\u0027: str(instance.flavor.memory_mb)})"},{"line_number":72,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/local_gb\u0027, \u0027op\u0027: \u0027add\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_02766f6f","line":69,"range":{"start_line":68,"start_character":8,"end_line":69,"end_character":53},"updated":"2017-01-18 02:44:05.000000000","message":"I have 0 idea why this is needed in this change. I\u0027m assuming this is for the change to network_binding_host_id but doesn\u0027t that just return None now? instance.get(\u0027host\u0027) is the default implementation of network_binding_host_id in the ComputeDriver base class but the Ironic driver overrides that.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                      \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: instance.display_name})"},{"line_number":66,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/vcpus\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":67,"context_line":"                      \u0027value\u0027: str(instance.flavor.vcpus)})"},{"line_number":68,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/nova_host_id\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":69,"context_line":"                      \u0027value\u0027: instance.get(\u0027host\u0027)})"},{"line_number":70,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/memory_mb\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":71,"context_line":"                      \u0027value\u0027: str(instance.flavor.memory_mb)})"},{"line_number":72,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/local_gb\u0027, \u0027op\u0027: \u0027add\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_44631942","line":69,"range":{"start_line":68,"start_character":8,"end_line":69,"end_character":53},"in_reply_to":"7a3c09a3_02766f6f","updated":"2017-01-18 09:50:59.000000000","message":"network_binding_host_id has the default to instance.get(\u0027host\u0027). However instance.host is the ID of the compute [0]. We return None in network_binding_host_id() to avoid fast tenant port binding, the detailed description why it is needed is in the docstring [1].\n\nBut we still need the ID of compute_host in ironic to plug Neutron port (node) to tenant network.\n\nWe do not use ironic node.uuid for ironic nodes with \u0027flat\u0027 network driver (note: for nodes with \u0027neutron\u0027 network driver use ironic node.uuid as binding_host_id) as some Neutron ML2 drivers may rely on the value of host_id. And we want to keep this behaviour, might be in future we may use ironic node.uuid instead of nova compute ID and cleanup this, but it is better to do it as separate change.\n\n \n[0] https://github.com/openstack/nova/blob/5081ff90b802544eb5e5b7f39c05a2a65b8da63b/nova/compute/manager.py#L2779\n\n[1] https://github.com/openstack/nova/blob/5081ff90b802544eb5e5b7f39c05a2a65b8da63b/nova/virt/ironic/driver.py#L1223","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f18d5b5b405e40b5a58e1e2b5f734469990baec","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                      \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: instance.display_name})"},{"line_number":66,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/vcpus\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":67,"context_line":"                      \u0027value\u0027: str(instance.flavor.vcpus)})"},{"line_number":68,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/nova_host_id\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":69,"context_line":"                      \u0027value\u0027: instance.get(\u0027host\u0027)})"},{"line_number":70,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/memory_mb\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":71,"context_line":"                      \u0027value\u0027: str(instance.flavor.memory_mb)})"},{"line_number":72,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/local_gb\u0027, \u0027op\u0027: \u0027add\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_d9243261","line":69,"range":{"start_line":68,"start_character":8,"end_line":69,"end_character":53},"in_reply_to":"7a3c09a3_19b23a4c","updated":"2017-01-18 17:38:37.000000000","message":"jroll pointed this out:\n\nhttps://github.com/openstack/ironic/blob/e72e68eb38c4325bb868a504106be097251c3b5e/ironic/drivers/modules/network/flat.py#L68\n\nWhich is needed on the Ironic side for binding the host and the port for the node. I think I\u0027m cleared up now.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eb4cebae24de88de444a74491b8548321b1bc99b","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                      \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: instance.display_name})"},{"line_number":66,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/vcpus\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":67,"context_line":"                      \u0027value\u0027: str(instance.flavor.vcpus)})"},{"line_number":68,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/nova_host_id\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":69,"context_line":"                      \u0027value\u0027: instance.get(\u0027host\u0027)})"},{"line_number":70,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/memory_mb\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":71,"context_line":"                      \u0027value\u0027: str(instance.flavor.memory_mb)})"},{"line_number":72,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/local_gb\u0027, \u0027op\u0027: \u0027add\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a3c09a3_19b23a4c","line":69,"range":{"start_line":68,"start_character":8,"end_line":69,"end_character":53},"in_reply_to":"7a3c09a3_44631942","updated":"2017-01-18 17:36:00.000000000","message":"Sorry but I still don\u0027t really see how this ties into *this* change, i.e. I don\u0027t see \"nova_host_id\" used anywhere.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15a5f19ff7ba583a72130e8f7eaf03e235c16472","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/vcpus\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":67,"context_line":"                      \u0027value\u0027: str(instance.flavor.vcpus)})"},{"line_number":68,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/nova_host_id\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":69,"context_line":"                      \u0027value\u0027: instance.get(\u0027host\u0027)})"},{"line_number":70,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/memory_mb\u0027, \u0027op\u0027: \u0027add\u0027,"},{"line_number":71,"context_line":"                      \u0027value\u0027: str(instance.flavor.memory_mb)})"},{"line_number":72,"context_line":"        patch.append({\u0027path\u0027: \u0027/instance_info/local_gb\u0027, \u0027op\u0027: \u0027add\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_117bfc7b","line":69,"updated":"2017-01-18 15:25:33.000000000","message":"we haven\u0027t done this, but after seeing Matt\u0027s comment in the previous revision, it seems to me that it would be a good idea to add comments to all/most of these lines, to explain why ironic wants them. (Now that I think about it, I\u0027m not sure I like ironic coded so explicitly to know about nova, seems like we should be able to generalize it, but that is a discussion for another day.)","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"}],"releasenotes/notes/ironic-virt-driver-switch-to-vif-attach-detach-cc8583c604510f95.yaml":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"88be7a97ade946b85eea856ae34b458abe12dce4","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    smooth upgrade process."},{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - The macs_for_instance() from nova.virt.driver is deprecated and will be"},{"line_number":9,"context_line":"    removed after ocata-eol."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"ba5201f7_4fd9c956","line":9,"updated":"2017-01-11 16:01:41.000000000","message":"I don\u0027t know nova\u0027s policies around virt driver methods, but why not in Pike? The virt driver API isn\u0027t meant to be stable.","commit_id":"079bd62be9ebc4601d210641ad0cccf4925c5577"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1d0a14940f230bee90cea5518e6dd9f5c5f60026","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    smooth upgrade process."},{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - The macs_for_instance() from nova.virt.driver is deprecated and will be"},{"line_number":9,"context_line":"    removed after ocata-eol."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7a3c09a3_3dc7db46","line":9,"in_reply_to":"ba5201f7_278e5a79","updated":"2017-01-12 22:50:03.000000000","message":"Okay, he would know better than me :)","commit_id":"079bd62be9ebc4601d210641ad0cccf4925c5577"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"30d542947a74e15676db7211c59b238b4c28ac79","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    smooth upgrade process."},{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - The macs_for_instance() from nova.virt.driver is deprecated and will be"},{"line_number":9,"context_line":"    removed after ocata-eol."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"ba5201f7_278e5a79","line":9,"in_reply_to":"ba5201f7_4fd9c956","updated":"2017-01-11 21:24:18.000000000","message":"It was suggested by Matt, unfortunately  I don\u0027t have deep knowledge in Nova deprecation policies.","commit_id":"079bd62be9ebc4601d210641ad0cccf4925c5577"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The ironic driver now requires python-ironicclient\u003e\u003d1.9.0 (previously"},{"line_number":4,"context_line":"    \u003e\u003d1.5.0), and requires ironic service to support API version 1.28 or"},{"line_number":5,"context_line":"    higher. As usual, ironic should be upgraded before nova for a"},{"line_number":6,"context_line":"    smooth upgrade process."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a3c09a3_625013d5","line":3,"range":{"start_line":3,"start_character":8,"end_line":3,"end_character":14},"updated":"2017-01-18 02:44:05.000000000","message":"nit: Please capitalize Ironic throughout.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The ironic driver now requires python-ironicclient\u003e\u003d1.9.0 (previously"},{"line_number":4,"context_line":"    \u003e\u003d1.5.0), and requires ironic service to support API version 1.28 or"},{"line_number":5,"context_line":"    higher. As usual, ironic should be upgraded before nova for a"},{"line_number":6,"context_line":"    smooth upgrade process."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a3c09a3_044e71c0","line":3,"range":{"start_line":3,"start_character":8,"end_line":3,"end_character":14},"in_reply_to":"7a3c09a3_625013d5","updated":"2017-01-18 09:50:59.000000000","message":"Done","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The ironic driver now requires python-ironicclient\u003e\u003d1.9.0 (previously"},{"line_number":4,"context_line":"    \u003e\u003d1.5.0), and requires ironic service to support API version 1.28 or"},{"line_number":5,"context_line":"    higher. As usual, ironic should be upgraded before nova for a"},{"line_number":6,"context_line":"    smooth upgrade process."},{"line_number":7,"context_line":"deprecations:"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a3c09a3_024f4f37","line":4,"range":{"start_line":4,"start_character":6,"end_line":4,"end_character":11},"updated":"2017-01-18 02:44:05.000000000","message":"Is this supposed to be for newton? Because if so it was 1.6.0:\n\nhttps://github.com/openstack/requirements/blob/stable/newton/global-requirements.txt#L199\n\nI\u0027d probably just remove the \"(previously \u003e\u003d1.5.0)\" thing as it doesn\u0027t really matter.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The ironic driver now requires python-ironicclient\u003e\u003d1.9.0 (previously"},{"line_number":4,"context_line":"    \u003e\u003d1.5.0), and requires ironic service to support API version 1.28 or"},{"line_number":5,"context_line":"    higher. As usual, ironic should be upgraded before nova for a"},{"line_number":6,"context_line":"    smooth upgrade process."},{"line_number":7,"context_line":"deprecations:"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a3c09a3_e4d965f4","line":4,"range":{"start_line":4,"start_character":6,"end_line":4,"end_character":11},"in_reply_to":"7a3c09a3_024f4f37","updated":"2017-01-18 09:50:59.000000000","message":"Done","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"743e5bb4f8d103b085539921775fe64a7f0be8cb","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \u003e\u003d1.5.0), and requires ironic service to support API version 1.28 or"},{"line_number":5,"context_line":"    higher. As usual, ironic should be upgraded before nova for a"},{"line_number":6,"context_line":"    smooth upgrade process."},{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - The macs_for_instance() from nova.virt.driver is deprecated and will be"},{"line_number":9,"context_line":"    removed after ocata-eol."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a3c09a3_c25707c8","line":9,"range":{"start_line":7,"start_character":0,"end_line":9,"end_character":28},"updated":"2017-01-18 02:44:05.000000000","message":"This is all internal details to nova so we don\u0027t need to have this in the release notes, operators won\u0027t care about it and worst case it just confuses them.","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"241c196b66197cccf1206ea041a980143bfa6b90","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \u003e\u003d1.5.0), and requires ironic service to support API version 1.28 or"},{"line_number":5,"context_line":"    higher. As usual, ironic should be upgraded before nova for a"},{"line_number":6,"context_line":"    smooth upgrade process."},{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - The macs_for_instance() from nova.virt.driver is deprecated and will be"},{"line_number":9,"context_line":"    removed after ocata-eol."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a3c09a3_64f4955a","line":9,"range":{"start_line":7,"start_character":0,"end_line":9,"end_character":28},"in_reply_to":"7a3c09a3_c25707c8","updated":"2017-01-18 09:50:59.000000000","message":"Done","commit_id":"01db2d899a68ba6c415cb9c6cce3e8668296c978"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"15a5f19ff7ba583a72130e8f7eaf03e235c16472","unresolved":false,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The Ironic driver now requires python-ironicclient\u003e\u003d1.9.0, and requires"},{"line_number":4,"context_line":"    Ironic service to support API version 1.28 or"},{"line_number":5,"context_line":"    higher. As usual, ironic should be upgraded before nova for a"},{"line_number":6,"context_line":"    smooth upgrade process."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"7a3c09a3_7149a030","line":5,"updated":"2017-01-18 15:25:33.000000000","message":"so I think Matt wants s/ironic/Ironic/. Although that would make it inconsistent with \u0027nova\u0027.\n\neven though the docs folks say it should be \u0027ironic\u0027.\n\nMaybe we should use the doc folk\u0027s suggestion, \u0027the Bare Metal service\u0027.\n\n(Don\u0027t listen to everything I say here, I\u0027m just rambling. Listen to Matt!)","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"429714affc948fe9e49b0f4f3b8fcc817a839f95","unresolved":false,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The Ironic driver now requires python-ironicclient\u003e\u003d1.9.0, and requires"},{"line_number":4,"context_line":"    Ironic service to support API version 1.28 or"},{"line_number":5,"context_line":"    higher. As usual, ironic should be upgraded before nova for a"},{"line_number":6,"context_line":"    smooth upgrade process."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"7a3c09a3_779ef063","line":5,"in_reply_to":"7a3c09a3_7149a030","updated":"2017-01-18 16:04:20.000000000","message":"Done","commit_id":"6ccbc963e16c9fd70af26df4c9b784ed37b5f7da"}]}
