)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"92e66b8945936afb20e4a6c7b441dcd518a5d929","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Andrey Shestakov \u003cashestakov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-08-08 15:46:45 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support of detach interface for ironic"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change implements support of detach specified interface of baremetal node."},{"line_number":10,"context_line":"For proper detach, interface should be unplugged by ironic."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9ad45d7e_43e3a705","line":7,"updated":"2016-08-09 16:55:31.000000000","message":"s/support of detach interface for/support for detaching interfaces in/","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"8a6f1c267752e6810fba065e78e2f869c4a01fb7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Andrey Shestakov \u003cashestakov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-08-08 15:46:45 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support of detach interface for ironic"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change implements support of detach specified interface of baremetal node."},{"line_number":10,"context_line":"For proper detach, interface should be unplugged by ironic."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9ad45d7e_42cfc128","line":7,"in_reply_to":"9ad45d7e_43e3a705","updated":"2016-08-11 09:13:56.000000000","message":"Done","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"92e66b8945936afb20e4a6c7b441dcd518a5d929","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support of detach interface for ironic"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change implements support of detach specified interface of baremetal node."},{"line_number":10,"context_line":"For proper detach, interface should be unplugged by ironic."},{"line_number":11,"context_line":"Also uplug required for deletion port from neutron."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9ad45d7e_a3f263d0","line":9,"updated":"2016-08-09 16:55:31.000000000","message":"s/support of detach/support for detaching/","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"8a6f1c267752e6810fba065e78e2f869c4a01fb7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support of detach interface for ironic"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change implements support of detach specified interface of baremetal node."},{"line_number":10,"context_line":"For proper detach, interface should be unplugged by ironic."},{"line_number":11,"context_line":"Also uplug required for deletion port from neutron."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9ad45d7e_22d44dbb","line":9,"in_reply_to":"9ad45d7e_a3f263d0","updated":"2016-08-11 09:13:56.000000000","message":"Done","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"92e66b8945936afb20e4a6c7b441dcd518a5d929","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change implements support of detach specified interface of baremetal node."},{"line_number":10,"context_line":"For proper detach, interface should be unplugged by ironic."},{"line_number":11,"context_line":"Also uplug required for deletion port from neutron."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partial-bug: 1609097"},{"line_number":14,"context_line":"Change-Id: I1cd6cac590392c6f813fd5679f9e0f254b735ee5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9ad45d7e_83ed9ff1","line":11,"updated":"2016-08-09 16:55:31.000000000","message":"s/for deletion port/for deleting port/","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"8a6f1c267752e6810fba065e78e2f869c4a01fb7","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change implements support of detach specified interface of baremetal node."},{"line_number":10,"context_line":"For proper detach, interface should be unplugged by ironic."},{"line_number":11,"context_line":"Also uplug required for deletion port from neutron."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partial-bug: 1609097"},{"line_number":14,"context_line":"Change-Id: I1cd6cac590392c6f813fd5679f9e0f254b735ee5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9ad45d7e_82dd39e2","line":11,"in_reply_to":"9ad45d7e_83ed9ff1","updated":"2016-08-11 09:13:56.000000000","message":"Done","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1f0f1644a1b32fdd8db5b30c01b6e979161e5a78","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change implements support for detaching specified interface of baremetal node."},{"line_number":10,"context_line":"For proper detach, interface should be unplugged by ironic."},{"line_number":11,"context_line":"Also uplug required for deleting port from neutron."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partial-bug: 1609097"},{"line_number":14,"context_line":"Change-Id: I1cd6cac590392c6f813fd5679f9e0f254b735ee5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9ad45d7e_1e24f45b","line":11,"updated":"2016-08-11 12:54:14.000000000","message":"femto-nit: please wrap your commit message at 79 chars","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"40c5c064f28a794dcccd736c41da4b66cbc0100c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change implements support for detaching specified interface of baremetal node."},{"line_number":10,"context_line":"For proper detach, interface should be unplugged by ironic."},{"line_number":11,"context_line":"Also uplug required for deleting port from neutron."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partial-bug: 1609097"},{"line_number":14,"context_line":"Change-Id: I1cd6cac590392c6f813fd5679f9e0f254b735ee5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9ad45d7e_22bb5177","line":11,"in_reply_to":"9ad45d7e_1e24f45b","updated":"2016-08-12 15:16:41.000000000","message":"Done","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2603d14a420bcef199318f523eb132f2ce7a5b70","unresolved":false,"context_lines":[{"line_number":11,"context_line":"For proper detach, interface should be unplugged by ironic."},{"line_number":12,"context_line":"Also uplug required for deleting port from neutron."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partial-bug: 1609097"},{"line_number":15,"context_line":"Change-Id: I1cd6cac590392c6f813fd5679f9e0f254b735ee5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3ac371cc_01b324ea","line":14,"updated":"2016-08-17 13:42:53.000000000","message":"How is this related?","commit_id":"a1e7e00a9776bfcace1d327eeb3b376ff5b8292d"}],"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"815fb93ee24bf4c069e2b9b468ff9f2699076f7d","unresolved":false,"context_lines":[{"line_number":1509,"context_line":"    @mock.patch.object(ironic_driver.IronicDriver, \u0027unplug_vifs\u0027)"},{"line_number":1510,"context_line":"    def test_detach_interface(self, mock_uvifs):"},{"line_number":1511,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx)"},{"line_number":1512,"context_line":"        network_info \u003d utils.get_test_network_info()"},{"line_number":1513,"context_line":"        self.driver.detach_interface(instance, network_info[0])"},{"line_number":1514,"context_line":"        mock_uvifs.assert_called_once_with(instance, network_info)"},{"line_number":1515,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_29ace4ec","line":1512,"updated":"2016-08-08 12:17:14.000000000","message":"nit: it would probably be beneficial to pass the count value \u003e 1 to get_test_network_info() helper functon, so that we would assert on the fact unplug_vifs() would only be called once, although an instance would actually have a few VIFs","commit_id":"ebe6416d2c0a101aab924387e2713c1646ec81c5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"a540122b13af39ad8525acabf657f994c3d69a2d","unresolved":false,"context_lines":[{"line_number":1509,"context_line":"    @mock.patch.object(ironic_driver.IronicDriver, \u0027unplug_vifs\u0027)"},{"line_number":1510,"context_line":"    def test_detach_interface(self, mock_uvifs):"},{"line_number":1511,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx)"},{"line_number":1512,"context_line":"        network_info \u003d utils.get_test_network_info()"},{"line_number":1513,"context_line":"        self.driver.detach_interface(instance, network_info[0])"},{"line_number":1514,"context_line":"        mock_uvifs.assert_called_once_with(instance, network_info)"},{"line_number":1515,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_7f8dea7a","line":1512,"in_reply_to":"9ad45d7e_29ace4ec","updated":"2016-08-08 12:47:27.000000000","message":"Done","commit_id":"ebe6416d2c0a101aab924387e2713c1646ec81c5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"92e66b8945936afb20e4a6c7b441dcd518a5d929","unresolved":false,"context_lines":[{"line_number":1477,"context_line":"        mock_node.get.assert_called_once_with("},{"line_number":1478,"context_line":"            node_uuid, fields\u003dironic_driver._NODE_FIELDS)"},{"line_number":1479,"context_line":"        mock_node.list_ports.assert_called_once_with(node_uuid, detail\u003dTrue)"},{"line_number":1480,"context_line":"        mock_update.assert_called_once_with(port.uuid, expected_patch)"},{"line_number":1481,"context_line":""},{"line_number":1482,"context_line":"    @mock.patch.object(FAKE_CLIENT.port, \u0027update\u0027)"},{"line_number":1483,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_e3ba9be0","line":1480,"updated":"2016-08-09 16:55:31.000000000","message":"Did you want to assert anything different about this particular unit test since you changed the return value of list_ports() above?","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"a0fed0bbf1f2b5fbc3bbfe78559903bea40c4cb0","unresolved":false,"context_lines":[{"line_number":1477,"context_line":"        mock_node.get.assert_called_once_with("},{"line_number":1478,"context_line":"            node_uuid, fields\u003dironic_driver._NODE_FIELDS)"},{"line_number":1479,"context_line":"        mock_node.list_ports.assert_called_once_with(node_uuid, detail\u003dTrue)"},{"line_number":1480,"context_line":"        mock_update.assert_called_once_with(port.uuid, expected_patch)"},{"line_number":1481,"context_line":""},{"line_number":1482,"context_line":"    @mock.patch.object(FAKE_CLIENT.port, \u0027update\u0027)"},{"line_number":1483,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_1719c4d7","line":1480,"in_reply_to":"9ad45d7e_e3ba9be0","updated":"2016-08-10 09:47:14.000000000","message":"Need to assert that port update is not called with another_port.uuid, because it is not specified in network info. But method assert_called_once_with(...) asserts that mock_update calls once with given parameters, and not with another. looks like it covers two cases.","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1f0f1644a1b32fdd8db5b30c01b6e979161e5a78","unresolved":false,"context_lines":[{"line_number":1509,"context_line":"    @mock.patch.object(ironic_driver.IronicDriver, \u0027unplug_vifs\u0027)"},{"line_number":1510,"context_line":"    def test_detach_interface(self, mock_uvifs):"},{"line_number":1511,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx)"},{"line_number":1512,"context_line":"        network_info \u003d utils.get_test_network_info(2)"},{"line_number":1513,"context_line":"        self.driver.detach_interface(instance, network_info[0])"},{"line_number":1514,"context_line":"        mock_uvifs.assert_called_once_with(instance, [network_info[0]])"},{"line_number":1515,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad45d7e_fe1e400a","line":1512,"updated":"2016-08-11 12:54:14.000000000","message":"Any reason to get two network_info objects above but only use one in the unit test? Also note that the above two network_info VIF objects will *both* have the same MAC address because, unfortunately the utils.get_test_network_info() \"helper method\" doesn\u0027t allow you to change the MAC address of the VIFs it returns. So, if you *really* want to test the code changes fully, you will want to do this:\n\n from nova.tests.unit import uuidsentinel as uuids\n ...\n vif1 \u003d utils.get_test_network_info()[0]\n vif2 \u003d utils.get_test_network_info()[0]\n vif2.address \u003d uuids.vif2\n # This emulates a nova.network.model.NetworkInfo object\n # with two virtual interfaces with different MAC addresses\n net_info \u003d [vif1, vif2]","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"01fafe9d80277b80281b743eb54ae0737c967a6e","unresolved":false,"context_lines":[{"line_number":1509,"context_line":"    @mock.patch.object(ironic_driver.IronicDriver, \u0027unplug_vifs\u0027)"},{"line_number":1510,"context_line":"    def test_detach_interface(self, mock_uvifs):"},{"line_number":1511,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx)"},{"line_number":1512,"context_line":"        network_info \u003d utils.get_test_network_info(2)"},{"line_number":1513,"context_line":"        self.driver.detach_interface(instance, network_info[0])"},{"line_number":1514,"context_line":"        mock_uvifs.assert_called_once_with(instance, [network_info[0]])"},{"line_number":1515,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad45d7e_2d4f0c38","line":1512,"in_reply_to":"9ad45d7e_fe1e400a","updated":"2016-08-11 14:08:28.000000000","message":"Please check comments in ps 6.","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1f0f1644a1b32fdd8db5b30c01b6e979161e5a78","unresolved":false,"context_lines":[{"line_number":1510,"context_line":"    def test_detach_interface(self, mock_uvifs):"},{"line_number":1511,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx)"},{"line_number":1512,"context_line":"        network_info \u003d utils.get_test_network_info(2)"},{"line_number":1513,"context_line":"        self.driver.detach_interface(instance, network_info[0])"},{"line_number":1514,"context_line":"        mock_uvifs.assert_called_once_with(instance, [network_info[0]])"},{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"    @mock.patch.object(firewall.NoopFirewallDriver, \u0027unfilter_instance\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad45d7e_5e1aec17","line":1513,"updated":"2016-08-11 12:54:14.000000000","message":"Note that you are passing a nova.network.model.VIF object above instead of the expected nova.network.model.NetworkInfo object. You want to do the following:\n\n self.driver.detach_interface(instance, net_info)\n\nafter changing the code as I\u0027ve demonstrated for multiple vifs with multiple MAC addresses.","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"40c5c064f28a794dcccd736c41da4b66cbc0100c","unresolved":false,"context_lines":[{"line_number":1510,"context_line":"    def test_detach_interface(self, mock_uvifs):"},{"line_number":1511,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx)"},{"line_number":1512,"context_line":"        network_info \u003d utils.get_test_network_info(2)"},{"line_number":1513,"context_line":"        self.driver.detach_interface(instance, network_info[0])"},{"line_number":1514,"context_line":"        mock_uvifs.assert_called_once_with(instance, [network_info[0]])"},{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"    @mock.patch.object(firewall.NoopFirewallDriver, \u0027unfilter_instance\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad45d7e_b3b8362c","line":1513,"in_reply_to":"9ad45d7e_5e1aec17","updated":"2016-08-12 15:16:41.000000000","message":"Done","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"01fafe9d80277b80281b743eb54ae0737c967a6e","unresolved":false,"context_lines":[{"line_number":1510,"context_line":"    def test_detach_interface(self, mock_uvifs):"},{"line_number":1511,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.ctx)"},{"line_number":1512,"context_line":"        network_info \u003d utils.get_test_network_info(2)"},{"line_number":1513,"context_line":"        self.driver.detach_interface(instance, network_info[0])"},{"line_number":1514,"context_line":"        mock_uvifs.assert_called_once_with(instance, [network_info[0]])"},{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"    @mock.patch.object(firewall.NoopFirewallDriver, \u0027unfilter_instance\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad45d7e_cd43d011","line":1513,"in_reply_to":"9ad45d7e_5e1aec17","updated":"2016-08-11 14:08:28.000000000","message":"also related to changes after ps 6","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"94ae7bdaba59877aadf385249760017ee2f40bc5","unresolved":false,"context_lines":[{"line_number":1032,"context_line":"        LOG.debug(\"unplug: instance_uuid\u003d%(uuid)s vif\u003d%(network_info)s\","},{"line_number":1033,"context_line":"                  {\u0027uuid\u0027: instance.uuid,"},{"line_number":1034,"context_line":"                   \u0027network_info\u0027: network_info_str})"},{"line_number":1035,"context_line":"        if network_info and len(network_info) \u003e 0:"},{"line_number":1036,"context_line":"            ports \u003d self.ironicclient.call(\"node.list_ports\", node.uuid,"},{"line_number":1037,"context_line":"                                      detail\u003dTrue)"},{"line_number":1038,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_47d505e3","side":"PARENT","line":1035,"updated":"2016-08-05 16:02:17.000000000","message":"Hmm, we did not iterate over VIFs in network_info at all here. This must have been another potential issue: we always unplugged all the VIFs, even if only a subset of all VIFs was passed in network_info.","commit_id":"e99c3665431462fc32877b71ba876da81cb61f3a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"83a6608be9be2ab4c19bad954b35eaec00d06031","unresolved":false,"context_lines":[{"line_number":1032,"context_line":"        LOG.debug(\"unplug: instance_uuid\u003d%(uuid)s vif\u003d%(network_info)s\","},{"line_number":1033,"context_line":"                  {\u0027uuid\u0027: instance.uuid,"},{"line_number":1034,"context_line":"                   \u0027network_info\u0027: network_info_str})"},{"line_number":1035,"context_line":"        if network_info and len(network_info) \u003e 0:"},{"line_number":1036,"context_line":"            ports \u003d self.ironicclient.call(\"node.list_ports\", node.uuid,"},{"line_number":1037,"context_line":"                                      detail\u003dTrue)"},{"line_number":1038,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_f8b0e8dd","side":"PARENT","line":1035,"in_reply_to":"bacf61ea_47d505e3","updated":"2016-08-08 08:32:17.000000000","message":"as i understood, uplug_vifs should calls with correct network_info always.","commit_id":"e99c3665431462fc32877b71ba876da81cb61f3a"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"94ae7bdaba59877aadf385249760017ee2f40bc5","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"                                      detail\u003dTrue)"},{"line_number":1039,"context_line":"            for vif in network_info:"},{"line_number":1040,"context_line":"                for pif in ports:"},{"line_number":1041,"context_line":"                    if (vif[\u0027address\u0027] \u003d\u003d pif.address"},{"line_number":1042,"context_line":"                            and \u0027vif_port_id\u0027 in pif.extra):"},{"line_number":1043,"context_line":"                        # we can not attach a dict directly"},{"line_number":1044,"context_line":"                        patch \u003d [{\u0027op\u0027: \u0027remove\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_c7de153d","line":1041,"updated":"2016-08-05 16:02:17.000000000","message":"What if we have more than one NIC with the same address connected to different networks? Why not use port IDs here?","commit_id":"6a18a5d0927c29cdb588fb92406b4cefccf7f708"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"83a6608be9be2ab4c19bad954b35eaec00d06031","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"                                      detail\u003dTrue)"},{"line_number":1039,"context_line":"            for vif in network_info:"},{"line_number":1040,"context_line":"                for pif in ports:"},{"line_number":1041,"context_line":"                    if (vif[\u0027address\u0027] \u003d\u003d pif.address"},{"line_number":1042,"context_line":"                            and \u0027vif_port_id\u0027 in pif.extra):"},{"line_number":1043,"context_line":"                        # we can not attach a dict directly"},{"line_number":1044,"context_line":"                        patch \u003d [{\u0027op\u0027: \u0027remove\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_b8be70d1","line":1041,"in_reply_to":"bacf61ea_c7de153d","updated":"2016-08-08 08:32:17.000000000","message":"ironic prevents multiple ports with same address. even for different nodes.","commit_id":"6a18a5d0927c29cdb588fb92406b4cefccf7f708"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"94ae7bdaba59877aadf385249760017ee2f40bc5","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"                            self.ironicclient.call(\"port.update\", pif.uuid,"},{"line_number":1048,"context_line":"                                                   patch)"},{"line_number":1049,"context_line":"                        except ironic.exc.BadRequest:"},{"line_number":1050,"context_line":"                            pass"},{"line_number":1051,"context_line":""},{"line_number":1052,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":1053,"context_line":"        \"\"\"Plug VIFs into networks."}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_2798d177","line":1050,"updated":"2016-08-05 16:02:17.000000000","message":"We could probably break the internal loop at this point, as there can be only one port with such ID and once we\u0027ve found it, there is no need to check the remaining ones","commit_id":"6a18a5d0927c29cdb588fb92406b4cefccf7f708"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"83a6608be9be2ab4c19bad954b35eaec00d06031","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"                            self.ironicclient.call(\"port.update\", pif.uuid,"},{"line_number":1048,"context_line":"                                                   patch)"},{"line_number":1049,"context_line":"                        except ironic.exc.BadRequest:"},{"line_number":1050,"context_line":"                            pass"},{"line_number":1051,"context_line":""},{"line_number":1052,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":1053,"context_line":"        \"\"\"Plug VIFs into networks."}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_0b55a8f8","line":1050,"in_reply_to":"bacf61ea_2798d177","updated":"2016-08-08 08:32:17.000000000","message":"Done","commit_id":"6a18a5d0927c29cdb588fb92406b4cefccf7f708"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"94ae7bdaba59877aadf385249760017ee2f40bc5","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"        return super(IronicDriver, self).network_binding_host_id("},{"line_number":1178,"context_line":"            context, instance)"},{"line_number":1179,"context_line":""},{"line_number":1180,"context_line":"    def detach_interface(self, instance, vif):"},{"line_number":1181,"context_line":"        self.unplug_vifs(instance, [vif])"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_a7c96128","line":1180,"updated":"2016-08-05 16:02:17.000000000","message":"could you please add a test case for this method?","commit_id":"6a18a5d0927c29cdb588fb92406b4cefccf7f708"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"83a6608be9be2ab4c19bad954b35eaec00d06031","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"        return super(IronicDriver, self).network_binding_host_id("},{"line_number":1178,"context_line":"            context, instance)"},{"line_number":1179,"context_line":""},{"line_number":1180,"context_line":"    def detach_interface(self, instance, vif):"},{"line_number":1181,"context_line":"        self.unplug_vifs(instance, [vif])"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_0eb2d605","line":1180,"in_reply_to":"bacf61ea_a7c96128","updated":"2016-08-08 08:32:17.000000000","message":"Done","commit_id":"6a18a5d0927c29cdb588fb92406b4cefccf7f708"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"92e66b8945936afb20e4a6c7b441dcd518a5d929","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"                                                   patch)"},{"line_number":1049,"context_line":"                        except ironic.exc.BadRequest:"},{"line_number":1050,"context_line":"                            pass"},{"line_number":1051,"context_line":"                        break"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":1054,"context_line":"        \"\"\"Plug VIFs into networks."}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_c3bdd7d8","line":1051,"updated":"2016-08-09 16:55:31.000000000","message":"The above seems a bit fragile. Perhaps we could add a log warning if there are ports in the return from list_ports that are *not* matched to a network address instead of just ignoring them?","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"a0fed0bbf1f2b5fbc3bbfe78559903bea40c4cb0","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"                                                   patch)"},{"line_number":1049,"context_line":"                        except ironic.exc.BadRequest:"},{"line_number":1050,"context_line":"                            pass"},{"line_number":1051,"context_line":"                        break"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":1054,"context_line":"        \"\"\"Plug VIFs into networks."}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad45d7e_cb2b0a93","line":1051,"in_reply_to":"9ad45d7e_c3bdd7d8","updated":"2016-08-10 09:47:14.000000000","message":"Node may have multiple ports, but only one should match address. probably if neither ports matched, means node has no port with specified address, some log message is needed.","commit_id":"7a4e860b0ebd2cd74731514af6c2e664307fcd24"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1f0f1644a1b32fdd8db5b30c01b6e979161e5a78","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"                            self.ironicclient.call(\"port.update\", pif.uuid,"},{"line_number":1048,"context_line":"                                                   patch)"},{"line_number":1049,"context_line":"                        except ironic.exc.BadRequest:"},{"line_number":1050,"context_line":"                            pass"},{"line_number":1051,"context_line":"                        break"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def plug_vifs(self, instance, network_info):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad45d7e_3e1578e4","line":1050,"updated":"2016-08-11 12:54:14.000000000","message":"At the very least, we should be emiting a LOG.debug() message here along with the exception that occurred. Something like this would be nice:\n\n except ironic.exc.BadRequest as err:\n     msg \u003d (\"Tried to update port %s but got error %s. Ignoring \"\n            \"failure\" % (pif.uuid, err))\n     LOG.debug(msg)","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"40c5c064f28a794dcccd736c41da4b66cbc0100c","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"                            self.ironicclient.call(\"port.update\", pif.uuid,"},{"line_number":1048,"context_line":"                                                   patch)"},{"line_number":1049,"context_line":"                        except ironic.exc.BadRequest:"},{"line_number":1050,"context_line":"                            pass"},{"line_number":1051,"context_line":"                        break"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def plug_vifs(self, instance, network_info):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad45d7e_93ba5209","line":1050,"in_reply_to":"9ad45d7e_3e1578e4","updated":"2016-08-12 15:16:41.000000000","message":"Done","commit_id":"ee81cdea5c98815a69eed7299c9df40c8394a819"}]}
