)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Gabriel Adrian Samfira \u003cgsamfira@cloudbasesolutions.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-09 02:48:39 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add Hyper-V OVS ViF driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This branch adds a new ViF driver to the Nova Hyper-V compute driver."},{"line_number":10,"context_line":"It\u0027s responsible for creating the OVS port and the related association"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_e516b5a6","line":7,"updated":"2014-12-10 11:56:30.000000000","message":"Adds","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8f7d1221975479910907a2baff4113a69a9088e9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"with the Hyper-V virtual switch port. Aside from the openvswitch binaries"},{"line_number":12,"context_line":"it has no other dependencies. Flow rules are added by an external agent"},{"line_number":13,"context_line":"such as OpenDaylight or by a Neutron OVS agent."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I4cee52f65968fa503f2c8a2c9a206489719fb15a"},{"line_number":16,"context_line":"Implements: blueprint hyper-v-ovs-vif"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3a961159_9aab3574","line":14,"updated":"2014-12-22 15:27:26.000000000","message":"please add DocImpact and describe the new configuration variables","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5def011b8673a699d78af8bee07b25932e8534a0","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Co-Authored-By: Claudiu Belu \u003ccbelu@cloudbasesolutions.com\u003e"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Depends-On: Ia07ade945ca7469b9c23c801a6bfe08135d39466"},{"line_number":21,"context_line":"Depends-On: Ia33e76a28f96fb94e6fdeedc4947b8a353e3d5bc"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Implements: blueprint hyper-v-ovs-vif"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":46,"id":"1a95cdbc_29d44dbb","line":21,"updated":"2016-10-07 14:14:50.000000000","message":"This is not yet released. So what you need to do is get a release of os-vif done, then bump the minimum required version of os-vif in global-requirements in the openstack/requirements repo, and then depend on that change and bump the same minimum version of os-vif in nova\u0027s requirements.txt.","commit_id":"c78a1c6edfd01fc042676a9cf4d58a761665829e"}],"nova/network/linux_net.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"6fe6a496cf323923b90f42e41ece8940d36ccb2c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"from nova import paths"},{"line_number":42,"context_line":"from nova.pci import utils as pci_utils"},{"line_number":43,"context_line":"from nova import utils"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_9829629d","line":44,"updated":"2015-01-27 17:04:00.000000000","message":"unneded change.","commit_id":"55cfb96a46e10447a4fb393d0a384f0062a9f8f1"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ba33f31dd5e462e0cdc0e1ae3b05eb34cda5e175","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from nova import exception"},{"line_number":37,"context_line":"from nova.i18n import _, _LE, _LW"},{"line_number":38,"context_line":"from nova.network import net_common"},{"line_number":39,"context_line":"from nova.network import ovs_utils"},{"line_number":40,"context_line":"from nova import objects"},{"line_number":41,"context_line":"from nova.openstack.common import fileutils"}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_37d5f542","line":38,"updated":"2015-04-30 06:31:19.000000000","message":"i think that you should have the common code in a separate patch set independent of the HyperV support. That should make the review process a little simpler.","commit_id":"3ffdf0e1daff1c871beca7a7e26b0da5386ed016"}],"nova/network/net_common.py":[{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ae9e27517bf71fa064c59f754bcc65ed9faaf98a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def _set_device_mtu(dev, mtu\u003dNone):"},{"line_number":33,"context_line":"    \"\"\"Set the device MTU.\"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    if not mtu:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_196449b8","line":32,"updated":"2015-02-02 14:39:33.000000000","message":"Well, since this is no longer a \u0027private\u0027 method, why not remove the underscore?","commit_id":"636559f487932d021f518578cef9346f271fe49e"}],"nova/network/ovs_utils.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"6fe6a496cf323923b90f42e41ece8940d36ccb2c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    cfg.IntOpt(\u0027ovs_vsctl_timeout\u0027,"},{"line_number":27,"context_line":"               default\u003d120,"},{"line_number":28,"context_line":"               help\u003d\u0027Amount of time, in seconds, that ovs_vsctl should wait \u0027"},{"line_number":29,"context_line":"                    \u0027for a response from the database. 0 is to wait forever.\u0027),"},{"line_number":30,"context_line":"]"},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"CONF.register_opts(ovs_cfg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_ec9b8363","line":29,"updated":"2015-01-27 17:04:00.000000000","message":"no need for this config option, since it is already defined in linux_net with the exact same default value and help message.\n\nimport instead.","commit_id":"55cfb96a46e10447a4fb393d0a384f0062a9f8f1"}],"nova/tests/unit/virt/hyperv/test_vif.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _test_get_vif_driver(self, expected_driver, vif_type,"},{"line_number":41,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"},{"line_number":42,"context_line":"                             expect_exception\u003dNone):"},{"line_number":43,"context_line":"        self.flags(network_api_class\u003dnetwork_class)"},{"line_number":44,"context_line":"        if expect_exception is not None:"},{"line_number":45,"context_line":"            self.assertRaises(expect_exception,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_a573cd13","line":42,"updated":"2014-12-10 11:56:30.000000000","message":"since you use it for self.assertRaises, it would look better as expected_exception","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _test_get_vif_driver(self, expected_driver, vif_type,"},{"line_number":41,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"},{"line_number":42,"context_line":"                             expect_exception\u003dNone):"},{"line_number":43,"context_line":"        self.flags(network_api_class\u003dnetwork_class)"},{"line_number":44,"context_line":"        if expect_exception is not None:"},{"line_number":45,"context_line":"            self.assertRaises(expect_exception,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_bee11a9c","line":42,"in_reply_to":"3a961159_a573cd13","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"},{"line_number":42,"context_line":"                             expect_exception\u003dNone):"},{"line_number":43,"context_line":"        self.flags(network_api_class\u003dnetwork_class)"},{"line_number":44,"context_line":"        if expect_exception is not None:"},{"line_number":45,"context_line":"            self.assertRaises(expect_exception,"},{"line_number":46,"context_line":"                              vif.get_vif_driver,"},{"line_number":47,"context_line":"                              vif_type)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_6569e524","line":44,"updated":"2014-12-10 11:56:30.000000000","message":"if expect_exception is enough. :)","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"},{"line_number":42,"context_line":"                             expect_exception\u003dNone):"},{"line_number":43,"context_line":"        self.flags(network_api_class\u003dnetwork_class)"},{"line_number":44,"context_line":"        if expect_exception is not None:"},{"line_number":45,"context_line":"            self.assertRaises(expect_exception,"},{"line_number":46,"context_line":"                              vif.get_vif_driver,"},{"line_number":47,"context_line":"                              vif_type)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_deefc685","line":44,"in_reply_to":"3a961159_6569e524","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                              vif_type)"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            actual_class \u003d type(vif.get_vif_driver(vif_type))"},{"line_number":50,"context_line":"            self.assertEqual(actual_class, expected_driver)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_get_vif_driver_neutron(self):"},{"line_number":53,"context_line":"        self._test_get_vif_driver("}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_e57dd5e8","line":50,"updated":"2014-12-10 11:56:30.000000000","message":"expected is always first in assertions. :)","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                              vif_type)"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            actual_class \u003d type(vif.get_vif_driver(vif_type))"},{"line_number":50,"context_line":"            self.assertEqual(actual_class, expected_driver)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_get_vif_driver_neutron(self):"},{"line_number":53,"context_line":"        self._test_get_vif_driver("}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_bef83a4a","line":50,"in_reply_to":"3a961159_e57dd5e8","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self._vif._vmutils \u003d mock.MagicMock()"},{"line_number":88,"context_line":"        self._vif._netutils \u003d mock.MagicMock()"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self._fake_vif \u003d {"},{"line_number":91,"context_line":"            \"address\": \"fake_addr\","},{"line_number":92,"context_line":"            \"id\": \"fake_id\","},{"line_number":93,"context_line":"            \"network\": {"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_c59619f0","line":90,"updated":"2014-12-10 11:56:30.000000000","message":"i suggest using nova.tests.unit.fake_network.fake_vif(id)","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        super(TestHyperVOVSVIFDriver, self).setUp()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_plug(self):"},{"line_number":100,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":101,"context_line":"        mock_get_external_vswitch \u003d mock.MagicMock()"},{"line_number":102,"context_line":"        self._vif._netutils.get_external_vswitch \u003d mock_get_external_vswitch"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_65ac8536","line":100,"updated":"2014-12-10 11:56:30.000000000","message":"also, you care a self.instance in the setUp","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        super(TestHyperVOVSVIFDriver, self).setUp()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_plug(self):"},{"line_number":100,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":101,"context_line":"        mock_get_external_vswitch \u003d mock.MagicMock()"},{"line_number":102,"context_line":"        self._vif._netutils.get_external_vswitch \u003d mock_get_external_vswitch"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f903bc0a","line":100,"in_reply_to":"3a961159_65ac8536","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"6099c666b0b76374b4108ae467eaf61bc71c76c6","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def test_plug(self):"},{"line_number":100,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":101,"context_line":"        mock_get_external_vswitch \u003d mock.MagicMock()"},{"line_number":102,"context_line":"        self._vif._netutils.get_external_vswitch \u003d mock_get_external_vswitch"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        mock_set_nic_connection \u003d self._vif._vmutils.set_nic_connection"},{"line_number":105,"context_line":"        self._vif._netutils.vswitch_port_needed.return_value \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_c42566c3","line":102,"updated":"2014-12-09 11:06:44.000000000","message":"_netutils is already mocked in setUp, why create a new mock for one of its methods?","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def test_plug(self):"},{"line_number":100,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":101,"context_line":"        mock_get_external_vswitch \u003d mock.MagicMock()"},{"line_number":102,"context_line":"        self._vif._netutils.get_external_vswitch \u003d mock_get_external_vswitch"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        mock_set_nic_connection \u003d self._vif._vmutils.set_nic_connection"},{"line_number":105,"context_line":"        self._vif._netutils.vswitch_port_needed.return_value \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f9865c64","line":102,"in_reply_to":"3a961159_a58f4dcb","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def test_plug(self):"},{"line_number":100,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":101,"context_line":"        mock_get_external_vswitch \u003d mock.MagicMock()"},{"line_number":102,"context_line":"        self._vif._netutils.get_external_vswitch \u003d mock_get_external_vswitch"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        mock_set_nic_connection \u003d self._vif._vmutils.set_nic_connection"},{"line_number":105,"context_line":"        self._vif._netutils.vswitch_port_needed.return_value \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_99bab821","line":102,"in_reply_to":"3a961159_c42566c3","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def test_plug(self):"},{"line_number":100,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":101,"context_line":"        mock_get_external_vswitch \u003d mock.MagicMock()"},{"line_number":102,"context_line":"        self._vif._netutils.get_external_vswitch \u003d mock_get_external_vswitch"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        mock_set_nic_connection \u003d self._vif._vmutils.set_nic_connection"},{"line_number":105,"context_line":"        self._vif._netutils.vswitch_port_needed.return_value \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_a58f4dcb","line":102,"in_reply_to":"3a961159_c42566c3","updated":"2014-12-10 11:56:30.000000000","message":"agreed.","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self._vif.plug(self.instance, self._fake_vif)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        mock_set_nic_connection.assert_called_with("},{"line_number":110,"context_line":"            self.instance.name,"},{"line_number":111,"context_line":"            self._fake_vif[\u0027id\u0027],"},{"line_number":112,"context_line":"            mock_get_external_vswitch())"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_056f41fe","line":109,"updated":"2014-12-10 11:56:30.000000000","message":"assert_called_once_with","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self._vif.plug(self.instance, self._fake_vif)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        mock_set_nic_connection.assert_called_with("},{"line_number":110,"context_line":"            self.instance.name,"},{"line_number":111,"context_line":"            self._fake_vif[\u0027id\u0027],"},{"line_number":112,"context_line":"            mock_get_external_vswitch())"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_197ec86b","line":109,"in_reply_to":"3a961159_056f41fe","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Cloudbase Solutions SRL"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_8659a400","line":1,"updated":"2015-01-22 12:04:53.000000000","message":"2015. :)","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":28,"context_line":"CONF \u003d cfg.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestGetVIFDriver(test.NoDBTestCase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"},{"line_number":34,"context_line":"        patched_utilsfactory \u003d mock.patch.object(vif,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_c6e72c11","line":31,"updated":"2015-01-22 12:04:53.000000000","message":"this should extend the class test_base.HyperVBaseTestCase:\n\nfrom nova.tests.unit.virt.hyperv import test_base\n\nalso, for consistency with other test classes, this should be renamed to GetVIFDriverTestCase","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        patched_utilsfactory \u003d mock.patch.object(vif,"},{"line_number":35,"context_line":"                                                 \"utilsfactory\")"},{"line_number":36,"context_line":"        patched_utilsfactory.start()"},{"line_number":37,"context_line":"        self.addCleanup(patched_utilsfactory.stop)"},{"line_number":38,"context_line":"        super(TestGetVIFDriver, self).setUp()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _test_get_vif_driver(self, expected_driver, vif_type,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_66be78d6","line":37,"updated":"2015-01-22 12:04:53.000000000","message":"if you extend the class mentioned above, this mock.patch.object is no longer necessary.","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            expected_exception\u003dTypeError)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"class TestHyperVOVSVIFDriver(test.NoDBTestCase):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def setUp(self):"},{"line_number":79,"context_line":"        patched_utilsfactory \u003d mock.patch.object(vif,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_a69dc05b","line":76,"updated":"2015-01-22 12:04:53.000000000","message":"ditto","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        patched_utilsfactory \u003d mock.patch.object(vif,"},{"line_number":80,"context_line":"                                                 \"utilsfactory\")"},{"line_number":81,"context_line":"        patched_utilsfactory.start()"},{"line_number":82,"context_line":"        self.addCleanup(patched_utilsfactory.stop)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self.context \u003d \u0027fake-context\u0027"},{"line_number":85,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_c6a3ac9c","line":82,"updated":"2015-01-22 12:04:53.000000000","message":"ditto","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            \"network\": {"},{"line_number":94,"context_line":"                \"bridge\": \"fake_bridge\","},{"line_number":95,"context_line":"            }"},{"line_number":96,"context_line":"        }"},{"line_number":97,"context_line":"        super(TestHyperVOVSVIFDriver, self).setUp()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_plug(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_a6394043","line":96,"updated":"2015-01-22 12:04:53.000000000","message":"consider using nova.tests.unit.objects.test_virtual_interface.fake_vif instead. If there will be any changes to VIFs, that dict will also be updated and these tests will use the updated version and it will always reflect the current reality.","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"6fe6a496cf323923b90f42e41ece8940d36ccb2c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self._vif._netutils \u003d mock.MagicMock()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self._fake_vif \u003d test_virtual_interface.fake_vif"},{"line_number":85,"context_line":"        self._fake_vif[\u0027network\u0027] \u003d {\u0027bridge\u0027: \u0027fake_bridge\u0027}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_plug(self):"},{"line_number":88,"context_line":"        mock_get_external_vswitch \u003d self._vif._netutils.get_external_vswitch"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_8c4d9f9c","line":85,"updated":"2015-01-27 17:04:00.000000000","message":"ehh, this could have secondary effects further in the future, since you persistently modify the dict, which will be used by other tests as well.\n\ntry this:\n\n    self._fake_vif \u003d dict(test_virtual_interface.fake_vif,\n                          network\u003d{\u0027bridge\u0027: \u0027fake_bridge\u0027})","commit_id":"55cfb96a46e10447a4fb393d0a384f0062a9f8f1"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ba33f31dd5e462e0cdc0e1ae3b05eb34cda5e175","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from oslo_config import cfg"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from nova.network import model as network_model"}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_573751b0","line":21,"updated":"2015-04-30 06:31:19.000000000","message":"mock is third party","commit_id":"3ffdf0e1daff1c871beca7a7e26b0da5386ed016"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0abd73e5fa3cf84bfd77587de849982895fb25f4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class GetVIFDriverTestCase(test_base.HyperVBaseTestCase):"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def setUp(self):"},{"line_number":35,"context_line":"        super(GetVIFDriverTestCase, self).setUp()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _test_get_vif_driver(self, expected_driver, vif_type,"},{"line_number":38,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1aca2d91_cf629cd8","line":35,"updated":"2015-05-12 20:24:04.000000000","message":"not necessary. Does nothing.","commit_id":"f9c008d8ccfcffa8a209821e78adccc2ae70423e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e4e5b901ce2402af4aae2e7f3546d0092f6cfd42","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def test_post_start_no_dev(self, bridge_has_dev\u003dFalse):"},{"line_number":105,"context_line":"        calls \u003d ["},{"line_number":106,"context_line":"              mock.call(\u0027ovs-vsctl\u0027, \u0027--timeout\u003d120\u0027, \u0027--\u0027, \u0027--if-exists\u0027,"},{"line_number":107,"context_line":"                        \u0027del-port\u0027, self._fake_vif[\u0027id\u0027],"},{"line_number":108,"context_line":"                        \u0027--\u0027, \u0027add-port\u0027,"},{"line_number":109,"context_line":"                        self._fake_vif[\u0027network\u0027][\u0027bridge\u0027],"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a016987_1943ff14","line":106,"updated":"2015-05-29 14:51:28.000000000","message":"looks overindented.","commit_id":"e6ae8fa99f04fad057ceb2837ebf5c4b7a183a58"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e4e5b901ce2402af4aae2e7f3546d0092f6cfd42","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                        self._fake_vif[\u0027address\u0027],"},{"line_number":116,"context_line":"                        \u0027external-ids:vm-uuid\u003d%s\u0027 % self.instance.uuid,"},{"line_number":117,"context_line":"                        run_as_root\u003dFalse)"},{"line_number":118,"context_line":"          ]"},{"line_number":119,"context_line":"        self._test_post_start(calls\u003dcalls, bridge_has_dev\u003dbridge_has_dev)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def test_post_start(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a016987_593df78d","line":118,"updated":"2015-05-29 14:51:28.000000000","message":"this looks a bit overindented, it should match the same indentation as calls.","commit_id":"e6ae8fa99f04fad057ceb2837ebf5c4b7a183a58"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3d5974f7952e94619b4b175d604555543ad44a16","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class GetVIFDriverTestCase(test_base.HyperVBaseTestCase):"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def setUp(self):"},{"line_number":35,"context_line":"        super(GetVIFDriverTestCase, self).setUp()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _test_get_vif_driver(self, expected_driver, vif_type,"},{"line_number":38,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_53b34a4d","line":35,"updated":"2015-07-28 11:26:15.000000000","message":"setUp does nothing.","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f43428a6212f54fbcd193c87d060c84781145a09","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class GetVIFDriverTestCase(test_base.HyperVBaseTestCase):"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def setUp(self):"},{"line_number":35,"context_line":"        super(GetVIFDriverTestCase, self).setUp()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _test_get_vif_driver(self, expected_driver, vif_type,"},{"line_number":38,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_efff10a9","line":35,"in_reply_to":"3a50d1a3_53b34a4d","updated":"2015-08-03 12:55:20.000000000","message":"Done","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3d5974f7952e94619b4b175d604555543ad44a16","unresolved":false,"context_lines":[{"line_number":73,"context_line":"class HyperVOVSVIFDriverTestCase(test_base.HyperVBaseTestCase):"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def setUp(self):"},{"line_number":76,"context_line":"        super(HyperVOVSVIFDriverTestCase, self).setUp()"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        self.context \u003d \u0027fake-context\u0027"},{"line_number":79,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_13886270","line":76,"updated":"2015-07-28 11:26:15.000000000","message":"ditto.","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f43428a6212f54fbcd193c87d060c84781145a09","unresolved":false,"context_lines":[{"line_number":73,"context_line":"class HyperVOVSVIFDriverTestCase(test_base.HyperVBaseTestCase):"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def setUp(self):"},{"line_number":76,"context_line":"        super(HyperVOVSVIFDriverTestCase, self).setUp()"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        self.context \u003d \u0027fake-context\u0027"},{"line_number":79,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_4ff724d3","line":76,"in_reply_to":"3a50d1a3_13886270","updated":"2015-08-03 12:55:20.000000000","message":"Done","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3d5974f7952e94619b4b175d604555543ad44a16","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self._vif.post_start(self.instance, self._fake_vif)"},{"line_number":105,"context_line":"        mock_execute.assert_has_calls(calls)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def test_post_start_no_dev(self, bridge_has_dev\u003dFalse):"},{"line_number":108,"context_line":"        calls \u003d ["},{"line_number":109,"context_line":"              mock.call(\u0027ovs-vsctl\u0027, \u0027--timeout\u003d120\u0027, \u0027--\u0027, \u0027--if-exists\u0027,"},{"line_number":110,"context_line":"                        \u0027del-port\u0027, self._fake_vif[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_f32cd64b","line":107,"range":{"start_line":107,"start_character":18,"end_line":107,"end_character":59},"updated":"2015-07-28 11:26:15.000000000","message":"why does this have a default argument? This method isn\u0027t called by any method here.","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f43428a6212f54fbcd193c87d060c84781145a09","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self._vif.post_start(self.instance, self._fake_vif)"},{"line_number":105,"context_line":"        mock_execute.assert_has_calls(calls)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def test_post_start_no_dev(self, bridge_has_dev\u003dFalse):"},{"line_number":108,"context_line":"        calls \u003d ["},{"line_number":109,"context_line":"              mock.call(\u0027ovs-vsctl\u0027, \u0027--timeout\u003d120\u0027, \u0027--\u0027, \u0027--if-exists\u0027,"},{"line_number":110,"context_line":"                        \u0027del-port\u0027, self._fake_vif[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_2ffad8bd","line":107,"in_reply_to":"3a50d1a3_f32cd64b","updated":"2015-08-03 12:55:20.000000000","message":"Done","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"6c4f6e582715ccf6d645ccb4aa79f140e7ce6748","unresolved":false,"context_lines":[{"line_number":33,"context_line":"class GetVIFDriverTestCase(test_base.HyperVBaseTestCase):"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self):"},{"line_number":36,"context_line":"        super(GetVIFDriverTestCase, self).setUp()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _test_get_vif_driver(self, expected_driver, vif_type,"},{"line_number":39,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_bcaba31c","line":36,"updated":"2015-11-10 14:45:03.000000000","message":"unnecessary.","commit_id":"366169aac66cefc32caf7ca81434649b2c25beae"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"758d929b808f56da47c177763c4d734164cd41e9","unresolved":false,"context_lines":[{"line_number":33,"context_line":"class GetVIFDriverTestCase(test_base.HyperVBaseTestCase):"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self):"},{"line_number":36,"context_line":"        super(GetVIFDriverTestCase, self).setUp()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _test_get_vif_driver(self, expected_driver, vif_type,"},{"line_number":39,"context_line":"                             network_class\u003d\u0027nova.network.api.API\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_da52be34","line":36,"in_reply_to":"da85f559_bcaba31c","updated":"2015-11-12 10:54:44.000000000","message":"Done","commit_id":"366169aac66cefc32caf7ca81434649b2c25beae"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"6c4f6e582715ccf6d645ccb4aa79f140e7ce6748","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                        self._fake_vif[\u0027address\u0027],"},{"line_number":125,"context_line":"                        \u0027external-ids:vm-uuid\u003d%s\u0027 % self.instance.uuid,"},{"line_number":126,"context_line":"                        run_as_root\u003dFalse)"},{"line_number":127,"context_line":"          ]"},{"line_number":128,"context_line":"        self._test_post_start(calls\u003dcalls, bridge_has_dev\u003dbridge_has_dev)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_post_start(self):"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_bc9403e2","line":127,"updated":"2015-11-10 14:45:03.000000000","message":"unindent this a bit.. to match the calls indentation.","commit_id":"366169aac66cefc32caf7ca81434649b2c25beae"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"758d929b808f56da47c177763c4d734164cd41e9","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                        self._fake_vif[\u0027address\u0027],"},{"line_number":125,"context_line":"                        \u0027external-ids:vm-uuid\u003d%s\u0027 % self.instance.uuid,"},{"line_number":126,"context_line":"                        run_as_root\u003dFalse)"},{"line_number":127,"context_line":"          ]"},{"line_number":128,"context_line":"        self._test_post_start(calls\u003dcalls, bridge_has_dev\u003dbridge_has_dev)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_post_start(self):"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_9a3756fe","line":127,"in_reply_to":"da85f559_bc9403e2","updated":"2015-11-12 10:54:44.000000000","message":"Done","commit_id":"366169aac66cefc32caf7ca81434649b2c25beae"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dc6ca8c0d895212bc4d81df9843df3dfd6d2fff9","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_plug_type_unknown(self):"},{"line_number":91,"context_line":"        vif \u003d {\u0027type\u0027: mock.sentinel.vif_type}"},{"line_number":92,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":93,"context_line":"                          self.vif_driver.plug,"},{"line_number":94,"context_line":"                          mock.sentinel.instance, vif)"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"ba5201f7_15942441","line":92,"updated":"2017-01-11 20:21:59.000000000","message":"would be good to have an exception subclass raised instead of the base NovaException. I know sfinucan recently just did a couple patches that removed all raises of NovaException directly.","commit_id":"201d5941589bd195ecdfa79d0a607d3bcfca3bd3"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"99f082229b6053f59afd907be1e7e7910569140d","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_plug_type_unknown(self):"},{"line_number":91,"context_line":"        vif \u003d {\u0027type\u0027: mock.sentinel.vif_type}"},{"line_number":92,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":93,"context_line":"                          self.vif_driver.plug,"},{"line_number":94,"context_line":"                          mock.sentinel.instance, vif)"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"ba5201f7_e65ff83e","line":92,"in_reply_to":"ba5201f7_15942441","updated":"2017-01-11 20:33:50.000000000","message":"Done","commit_id":"201d5941589bd195ecdfa79d0a607d3bcfca3bd3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dc6ca8c0d895212bc4d81df9843df3dfd6d2fff9","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def test_unplug_type_unknown(self):"},{"line_number":119,"context_line":"        vif \u003d {\u0027type\u0027: mock.sentinel.vif_type}"},{"line_number":120,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":121,"context_line":"                          self.vif_driver.unplug,"},{"line_number":122,"context_line":"                          mock.sentinel.instance, vif)"}],"source_content_type":"text/x-python","patch_set":54,"id":"ba5201f7_559a2c6f","line":120,"updated":"2017-01-11 20:21:59.000000000","message":"ditto.","commit_id":"201d5941589bd195ecdfa79d0a607d3bcfca3bd3"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"99f082229b6053f59afd907be1e7e7910569140d","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def test_unplug_type_unknown(self):"},{"line_number":119,"context_line":"        vif \u003d {\u0027type\u0027: mock.sentinel.vif_type}"},{"line_number":120,"context_line":"        self.assertRaises(exception.NovaException,"},{"line_number":121,"context_line":"                          self.vif_driver.unplug,"},{"line_number":122,"context_line":"                          mock.sentinel.instance, vif)"}],"source_content_type":"text/x-python","patch_set":54,"id":"ba5201f7_c646747a","line":120,"in_reply_to":"ba5201f7_559a2c6f","updated":"2017-01-11 20:33:50.000000000","message":"Done","commit_id":"201d5941589bd195ecdfa79d0a607d3bcfca3bd3"}],"nova/tests/unit/virt/hyperv/test_vmops.py":[{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"6099c666b0b76374b4108ae467eaf61bc71c76c6","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        mock_instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        mock_vif_driver \u003d mock.MagicMock()"},{"line_number":226,"context_line":"        mock_get_vif_driver.return_value \u003d mock_vif_driver"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        fake_root_path \u003d mock_create_root_vhd.return_value"},{"line_number":229,"context_line":"        fake_root_path \u003d None if boot_from_volume else fake_root_path"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_24f8ea48","line":226,"updated":"2014-12-09 11:06:44.000000000","message":"The return value of a mock is already a mock, why create a new one?","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        mock_instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        mock_vif_driver \u003d mock.MagicMock()"},{"line_number":226,"context_line":"        mock_get_vif_driver.return_value \u003d mock_vif_driver"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        fake_root_path \u003d mock_create_root_vhd.return_value"},{"line_number":229,"context_line":"        fake_root_path \u003d None if boot_from_volume else fake_root_path"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_19b6c8fa","line":226,"in_reply_to":"3a961159_053d81de","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        mock_instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        mock_vif_driver \u003d mock.MagicMock()"},{"line_number":226,"context_line":"        mock_get_vif_driver.return_value \u003d mock_vif_driver"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        fake_root_path \u003d mock_create_root_vhd.return_value"},{"line_number":229,"context_line":"        fake_root_path \u003d None if boot_from_volume else fake_root_path"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_b9edb4f1","line":226,"in_reply_to":"3a961159_24f8ea48","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        mock_instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        mock_vif_driver \u003d mock.MagicMock()"},{"line_number":226,"context_line":"        mock_get_vif_driver.return_value \u003d mock_vif_driver"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        fake_root_path \u003d mock_create_root_vhd.return_value"},{"line_number":229,"context_line":"        fake_root_path \u003d None if boot_from_volume else fake_root_path"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_053d81de","line":226,"in_reply_to":"3a961159_24f8ea48","updated":"2014-12-10 11:56:30.000000000","message":"agreed.","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"6099c666b0b76374b4108ae467eaf61bc71c76c6","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                              fake_root_path, fake_ephemeral_path,"},{"line_number":305,"context_line":"                              enable_instance_metrics):"},{"line_number":306,"context_line":"        mock_vif_driver \u003d mock.MagicMock()"},{"line_number":307,"context_line":"        mock_get_vif_driver.return_value \u003d mock_vif_driver"},{"line_number":308,"context_line":"        self.flags(enable_instance_metrics_collection\u003denable_instance_metrics,"},{"line_number":309,"context_line":"                   group\u003d\u0027hyperv\u0027)"},{"line_number":310,"context_line":"        fake_network_info \u003d {\u0027id\u0027: mock.sentinel.ID,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_0494cee0","line":307,"updated":"2014-12-09 11:06:44.000000000","message":"ditto","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                              fake_root_path, fake_ephemeral_path,"},{"line_number":305,"context_line":"                              enable_instance_metrics):"},{"line_number":306,"context_line":"        mock_vif_driver \u003d mock.MagicMock()"},{"line_number":307,"context_line":"        mock_get_vif_driver.return_value \u003d mock_vif_driver"},{"line_number":308,"context_line":"        self.flags(enable_instance_metrics_collection\u003denable_instance_metrics,"},{"line_number":309,"context_line":"                   group\u003d\u0027hyperv\u0027)"},{"line_number":310,"context_line":"        fake_network_info \u003d {\u0027id\u0027: mock.sentinel.ID,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_99f2b8d0","line":307,"in_reply_to":"3a961159_0494cee0","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"c076a4bd2a2fc4084291018d7a04f61a8c94568a","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":64,"context_line":"        self._vmops._vif_driver_cache.get.assert_called_with("},{"line_number":65,"context_line":"                                                        mock.sentinel.VIF_TYPE)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @mock.patch(\u0027nova.virt.hyperv.vif.get_vif_driver\u0027)"},{"line_number":68,"context_line":"    def test_get_vif_driver_not_cached(self, mock_get_vif_driver):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3acd31a7_b5bbece4","line":65,"updated":"2015-05-04 13:19:23.000000000","message":"overindented..","commit_id":"42f18f1635d260af6061edbe1d5738ebd3fc3242"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"c076a4bd2a2fc4084291018d7a04f61a8c94568a","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        mock_get_vif_driver.return_value \u003d mock.sentinel.VIF_DRV"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":72,"context_line":"        mock_get_vif_driver.assert_called_with(mock.sentinel.VIF_TYPE)"},{"line_number":73,"context_line":"        self.assertEqual(mock.sentinel.VIF_DRV,"},{"line_number":74,"context_line":"                self._vmops._vif_driver_cache[mock.sentinel.VIF_TYPE])"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3acd31a7_f5f284d1","line":72,"updated":"2015-05-04 13:19:23.000000000","message":"assert_called_once_with","commit_id":"42f18f1635d260af6061edbe1d5738ebd3fc3242"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"c076a4bd2a2fc4084291018d7a04f61a8c94568a","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        self._vmops._vmutils.create_nic.assert_called_once_with("},{"line_number":419,"context_line":"            mock_instance.name, mock.sentinel.ID, mock.sentinel.ADDRESS)"},{"line_number":420,"context_line":"        mock_vif_driver.plug.assert_called_once_with(mock_instance,"},{"line_number":421,"context_line":"                                                         fake_network_info)"},{"line_number":422,"context_line":"        mock_enable \u003d self._vmops._vmutils.enable_vm_metrics_collection"},{"line_number":423,"context_line":"        if enable_instance_metrics:"},{"line_number":424,"context_line":"            mock_enable.assert_called_once_with(mock_instance.name)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3acd31a7_d5e1c89b","line":421,"updated":"2015-05-04 13:19:23.000000000","message":"overindented, also, unrelated change.","commit_id":"42f18f1635d260af6061edbe1d5738ebd3fc3242"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e4e5b901ce2402af4aae2e7f3546d0092f6cfd42","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":64,"context_line":"        self._vmops._vif_driver_cache.get.assert_called_with("},{"line_number":65,"context_line":"                                                        mock.sentinel.VIF_TYPE)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @mock.patch(\u0027nova.virt.hyperv.vif.get_vif_driver\u0027)"},{"line_number":68,"context_line":"    def test_get_vif_driver_not_cached(self, mock_get_vif_driver):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a016987_b9006bac","line":65,"updated":"2015-05-29 14:51:28.000000000","message":"overindented.","commit_id":"e6ae8fa99f04fad057ceb2837ebf5c4b7a183a58"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e4e5b901ce2402af4aae2e7f3546d0092f6cfd42","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":72,"context_line":"        mock_get_vif_driver.assert_called_with(mock.sentinel.VIF_TYPE)"},{"line_number":73,"context_line":"        self.assertEqual(mock.sentinel.VIF_DRV,"},{"line_number":74,"context_line":"                self._vmops._vif_driver_cache[mock.sentinel.VIF_TYPE])"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def test_list_instances(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a016987_79b793d8","line":73,"updated":"2015-05-29 14:51:28.000000000","message":"I\u0027d say mock.sentinel.VIF_DRV would look better on a new line, so it will have the same indentation as the next line.","commit_id":"e6ae8fa99f04fad057ceb2837ebf5c4b7a183a58"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e4e5b901ce2402af4aae2e7f3546d0092f6cfd42","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":72,"context_line":"        mock_get_vif_driver.assert_called_with(mock.sentinel.VIF_TYPE)"},{"line_number":73,"context_line":"        self.assertEqual(mock.sentinel.VIF_DRV,"},{"line_number":74,"context_line":"                self._vmops._vif_driver_cache[mock.sentinel.VIF_TYPE])"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def test_list_instances(self):"},{"line_number":77,"context_line":"        mock_instance \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a016987_59bcd7ba","line":74,"updated":"2015-05-29 14:51:28.000000000","message":"overindented.","commit_id":"e6ae8fa99f04fad057ceb2837ebf5c4b7a183a58"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e4e5b901ce2402af4aae2e7f3546d0092f6cfd42","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        self._vmops._vmutils.create_nic.assert_called_once_with("},{"line_number":419,"context_line":"            mock_instance.name, mock.sentinel.ID, mock.sentinel.ADDRESS)"},{"line_number":420,"context_line":"        mock_vif_driver.plug.assert_called_once_with(mock_instance,"},{"line_number":421,"context_line":"                                                         fake_network_info)"},{"line_number":422,"context_line":"        mock_enable \u003d self._vmops._vmutils.enable_vm_metrics_collection"},{"line_number":423,"context_line":"        if enable_instance_metrics:"},{"line_number":424,"context_line":"            mock_enable.assert_called_once_with(mock_instance.name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a016987_79d4331f","line":421,"updated":"2015-05-29 14:51:28.000000000","message":"unnecessary change.","commit_id":"e6ae8fa99f04fad057ceb2837ebf5c4b7a183a58"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3d5974f7952e94619b4b175d604555543ad44a16","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._vmops._vif_driver_cache.get.return_value \u003d mock.sentinel.VIF_DRV"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":66,"context_line":"        self._vmops._vif_driver_cache.get.assert_called_with("},{"line_number":67,"context_line":"            mock.sentinel.VIF_TYPE)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @mock.patch(\u0027nova.virt.hyperv.vif.get_vif_driver\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_93ad52eb","line":66,"updated":"2015-07-28 11:26:15.000000000","message":"assert_called_once_with?","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f43428a6212f54fbcd193c87d060c84781145a09","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._vmops._vif_driver_cache.get.return_value \u003d mock.sentinel.VIF_DRV"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":66,"context_line":"        self._vmops._vif_driver_cache.get.assert_called_with("},{"line_number":67,"context_line":"            mock.sentinel.VIF_TYPE)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @mock.patch(\u0027nova.virt.hyperv.vif.get_vif_driver\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_0ffd9cb0","line":66,"in_reply_to":"3a50d1a3_93ad52eb","updated":"2015-08-03 12:55:20.000000000","message":"Done","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3d5974f7952e94619b4b175d604555543ad44a16","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":74,"context_line":"        mock_get_vif_driver.assert_called_once_with(mock.sentinel.VIF_TYPE)"},{"line_number":75,"context_line":"        self.assertEqual(mock.sentinel.VIF_DRV,"},{"line_number":76,"context_line":"                self._vmops._vif_driver_cache[mock.sentinel.VIF_TYPE])"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_list_instances(self):"},{"line_number":79,"context_line":"        mock_instance \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_33b6be3e","line":76,"updated":"2015-07-28 11:26:15.000000000","message":"overindented.","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f43428a6212f54fbcd193c87d060c84781145a09","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self._vmops._get_vif_driver(mock.sentinel.VIF_TYPE)"},{"line_number":74,"context_line":"        mock_get_vif_driver.assert_called_once_with(mock.sentinel.VIF_TYPE)"},{"line_number":75,"context_line":"        self.assertEqual(mock.sentinel.VIF_DRV,"},{"line_number":76,"context_line":"                self._vmops._vif_driver_cache[mock.sentinel.VIF_TYPE])"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_list_instances(self):"},{"line_number":79,"context_line":"        mock_instance \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_2f21784d","line":76,"in_reply_to":"3a50d1a3_33b6be3e","updated":"2015-08-03 12:55:20.000000000","message":"Done","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"}],"nova/virt/hyperv/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4f9b5b47004a08acfa45b596e3925486fac8f4fa","unresolved":false,"context_lines":[{"line_number":280,"context_line":"    def get_instance_disk_info(self, instance, block_device_info\u003dNone):"},{"line_number":281,"context_line":"        pass"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":284,"context_line":"        \"\"\"Plug VIFs into networks.\"\"\""},{"line_number":285,"context_line":"        self._vmops.plug_vifs(instance, network_info)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def unplug_vifs(self, instance, network_info):"},{"line_number":288,"context_line":"        \"\"\"Unplug VIFs from networks.\"\"\""},{"line_number":289,"context_line":"        self._vmops.unplug_vifs(instance, network_info)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def ensure_filtering_rules_for_instance(self, instance, network_info):"},{"line_number":292,"context_line":"        LOG.debug(\"ensure_filtering_rules_for_instance called\","}],"source_content_type":"text/x-python","patch_set":49,"id":"da4df55a_19e513a7","line":289,"range":{"start_line":283,"start_character":4,"end_line":289,"end_character":55},"updated":"2016-12-28 19:27:03.000000000","message":"The commit message doesn\u0027t mention anything about supporting hot plug of VIFs in this change, it just talks about converting to using os-vif. There is some confusing history here, but I believe this was a series of two changes, this one for the os-vif conversion and then https://review.openstack.org/#/c/138255/ which built on top of it for the interface attach/detach support. For some reason that was folded into this change which also does the os-vif conversion, but adding the support for interface attach/detach is not mentioned in the commit message - it should be, along with a release note saying the hyper-v driver supports that feature with this change. We\u0027d also want to update the support matrix here:\n\nhttps://review.openstack.org/#/c/409967/\n\nI know that originally blueprint hyper-v-vnic-hot-plug was for this but we superseded that with this os-vif change and it\u0027s blueprint - I can\u0027t remember why, but Claudiu would probably remember.","commit_id":"330617c4689ab48106594143b99294a8bf47cd39"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5139da4b80fc75a0c0b6a2379c0c36b86f6ad3bb","unresolved":false,"context_lines":[{"line_number":280,"context_line":"    def get_instance_disk_info(self, instance, block_device_info\u003dNone):"},{"line_number":281,"context_line":"        pass"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":284,"context_line":"        \"\"\"Plug VIFs into networks.\"\"\""},{"line_number":285,"context_line":"        self._vmops.plug_vifs(instance, network_info)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def unplug_vifs(self, instance, network_info):"},{"line_number":288,"context_line":"        \"\"\"Unplug VIFs from networks.\"\"\""},{"line_number":289,"context_line":"        self._vmops.unplug_vifs(instance, network_info)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def ensure_filtering_rules_for_instance(self, instance, network_info):"},{"line_number":292,"context_line":"        LOG.debug(\"ensure_filtering_rules_for_instance called\","}],"source_content_type":"text/x-python","patch_set":49,"id":"da4df55a_dcb2994b","line":289,"range":{"start_line":283,"start_character":4,"end_line":289,"end_character":55},"in_reply_to":"da4df55a_19e513a7","updated":"2016-12-28 20:05:25.000000000","message":"Actually I\u0027m confused about the difference between plug_vifs and attach_interface here. plug_vifs is only called from the compute manager on init of the host, not during attach_interface.","commit_id":"330617c4689ab48106594143b99294a8bf47cd39"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0bd0b1abde67619ce9e2cf48653359f105dbd0ca","unresolved":false,"context_lines":[{"line_number":280,"context_line":"    def get_instance_disk_info(self, instance, block_device_info\u003dNone):"},{"line_number":281,"context_line":"        pass"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def plug_vifs(self, instance, network_info):"},{"line_number":284,"context_line":"        \"\"\"Plug VIFs into networks.\"\"\""},{"line_number":285,"context_line":"        self._vmops.plug_vifs(instance, network_info)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def unplug_vifs(self, instance, network_info):"},{"line_number":288,"context_line":"        \"\"\"Unplug VIFs from networks.\"\"\""},{"line_number":289,"context_line":"        self._vmops.unplug_vifs(instance, network_info)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def ensure_filtering_rules_for_instance(self, instance, network_info):"},{"line_number":292,"context_line":"        LOG.debug(\"ensure_filtering_rules_for_instance called\","}],"source_content_type":"text/x-python","patch_set":49,"id":"ba5201f7_d1e91e1c","line":289,"range":{"start_line":283,"start_character":4,"end_line":289,"end_character":55},"in_reply_to":"da4df55a_dcb2994b","updated":"2017-01-03 12:57:25.000000000","message":"Ok, sooo...\n\n1. the patch regarding the os-vif object conversion was abandoned. It was converting VIF_TYPE_HYPERV vifs to os-vif objects, which wasn\u0027t useful, it was only used by HyperVNovaNetworkVIFPlugin, which will be removed when nova-network will be removed.\n\n2. The attach_interface / detach_interface methods have been added a very long time ago during a bugfix. The blueprint hyper-v-vnic-hot-plug was no longer needed, since it didn\u0027t actually add any new functionality. With this patch, attach_interface is able to also plug OVS vifs.\n\n3. I will add a release note regarding the fact that the nova Hyper-V driver can now plug OVS vifs. I don\u0027t think that attach_interface needs to be mentioned in it, since this patch doesn\u0027t add it. \n\n4. I\u0027ve added a comment on the support matrix patch you\u0027ve mentioned.\n\n5. Soo, attach_interface also ADDS the given vNIC to the instance, as well as plugging the vif, while plug_vifs just plugs the vifs (a vif is considered plugged if it is connected to a vswitch).\n\n6. The tempest tests are all trying to hotplug the vNICs, while the instance is running. Hotplugging is only supported on Windows / Hyper-V Server 2016 + Generation 2 VMs. Older Hyper-V versions only support attaching vNICs while the VM is turned off. We are currently using Hyper-V Server 2012 R2 in the CI at the moment. We will enable those tests when we\u0027ll make the switch to 2016.","commit_id":"330617c4689ab48106594143b99294a8bf47cd39"}],"nova/virt/hyperv/hostutils.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    _HOST_FORCED_SHUTDOWN \u003d 12"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self):"},{"line_number":33,"context_line":"        self._conn_cimv2 \u003d None"},{"line_number":34,"context_line":"        if sys.platform \u003d\u003d \u0027win32\u0027:"},{"line_number":35,"context_line":"            self._conn_cimv2 \u003d wmi.WMI(privileges\u003d[\"Shutdown\"])"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_c602cc3d","line":33,"updated":"2015-01-22 12:04:53.000000000","message":"I\u0027m not really sure why this change and the one below is necessary. This class and the other classes from nova.virt.hyperv will only be used on Windows. If the changes are for the unit tests to run on linux, then the unit tests should be changed.","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"}],"nova/virt/hyperv/livemigrationops.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"caa6bfde748c6ba883b937d461ac22450d68a1ba","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                                           network_info, block_migration):"},{"line_number":121,"context_line":"        LOG.debug(\"post_live_migration_at_destination called\","},{"line_number":122,"context_line":"                  instance\u003dinstance_ref)"},{"line_number":123,"context_line":"        self._vmops.plug_vifs(instance_ref, network_info)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def check_can_live_migrate_destination(self, ctxt, instance_ref,"},{"line_number":126,"context_line":"                                           src_compute_info, dst_compute_info,"}],"source_content_type":"text/x-python","patch_set":51,"id":"ba5201f7_e4cba651","line":123,"range":{"start_line":123,"start_character":20,"end_line":123,"end_character":29},"updated":"2017-01-04 02:58:54.000000000","message":"Where does the hyper-v driver unplug the vifs from the source host during live migration? The libvirt driver does it in post_live_migration_at_source.","commit_id":"19442f52d80be2f49987378fcd336ca183147d6a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"50f0d243bb743875b4fd006244f0282a0f6f4ea0","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                                           network_info, block_migration):"},{"line_number":121,"context_line":"        LOG.debug(\"post_live_migration_at_destination called\","},{"line_number":122,"context_line":"                  instance\u003dinstance_ref)"},{"line_number":123,"context_line":"        self._vmops.plug_vifs(instance_ref, network_info)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def check_can_live_migrate_destination(self, ctxt, instance_ref,"},{"line_number":126,"context_line":"                                           src_compute_info, dst_compute_info,"}],"source_content_type":"text/x-python","patch_set":51,"id":"ba5201f7_cce86e13","line":123,"range":{"start_line":123,"start_character":20,"end_line":123,"end_character":29},"in_reply_to":"ba5201f7_2103d510","updated":"2017-01-04 16:55:07.000000000","message":"Leaving a note in the hyperv driver code is fine. I\u0027m honestly not sure why we have the two post live migration at source operations in the compute manager - we really need a diagram in the docs about the actual call flows for live migration because it\u0027s super confusing and I have to relearn it every time I look into stuff like this.\n\nAlso note that post_live_migration_at_source is expected to be only run for libvirt really:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/manager.py#L5567\n\nWhy we don\u0027t just unplug the vifs when cleanup is called on the driver, I don\u0027t know. Looking at how _live_migration_cleanup_flags is used in the compute manager, it probably has something to do with the shared storage checks so the libvirt driver always wants to unplug vifs but doesn\u0027t always want to \u0027cleanup\u0027 the disks on the source just yet...which is probably a weird wrinkle in how those methods are all implemented between the various virt drivers.\n\nI think ftersin was actually trying to clean that up at one point to decouple that logic from the libvirt driver\u0027s cleanup() method. Looks like post_live_migration_at_source was added way back in Juno here:\n\nhttps://review.openstack.org/#/c/78165/","commit_id":"19442f52d80be2f49987378fcd336ca183147d6a"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3ed4b1bb7f705a73d45e684e416eb7265dac3025","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                                           network_info, block_migration):"},{"line_number":121,"context_line":"        LOG.debug(\"post_live_migration_at_destination called\","},{"line_number":122,"context_line":"                  instance\u003dinstance_ref)"},{"line_number":123,"context_line":"        self._vmops.plug_vifs(instance_ref, network_info)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def check_can_live_migrate_destination(self, ctxt, instance_ref,"},{"line_number":126,"context_line":"                                           src_compute_info, dst_compute_info,"}],"source_content_type":"text/x-python","patch_set":51,"id":"ba5201f7_2103d510","line":123,"range":{"start_line":123,"start_character":20,"end_line":123,"end_character":29},"in_reply_to":"ba5201f7_e4cba651","updated":"2017-01-04 09:38:39.000000000","message":"it seems that we are doing vif unplugging. The compute manager will call self.driver.cleanup [1], which will unplug the vifs (see the nova.virt.hyperv.driver implementation added in this patch)\n\nand now I\u0027ve noticed that there is a post_live_migration method, called at source, and post_live_migration_at_source, called at source. any particular idea why they had to be separate methods? it seems that only libvirt uses that method. plus, libvirt\u0027s cleanup method will also unplug vifs, if its destroy_vifs flag is True (which is True for any other hypervisor). Honestly, I\u0027d remove that method and just leave cleanup, it will be cleaner.\n\ni could probably add the unplug to post_live_migration, since we\u0027re already implementing that method just above, but that would mean that we\u0027re doing the same ovs operations twice, which i\u0027d like to avoid. maybe, perhaps, probably a note in post_live_migration saying that the vifs are being unplugged by the nova compute manager when it calls driver.cleanup?\n\n[1] https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L5590","commit_id":"19442f52d80be2f49987378fcd336ca183147d6a"}],"nova/virt/hyperv/ovsutils.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    to the linux_net ones but have linux specific options, such as run_as_root"},{"line_number":19,"context_line":"    and delete_net_dev, removed."},{"line_number":20,"context_line":"    This also allows us the flexibility to adapt to any future platform"},{"line_number":21,"context_line":"    specific differences."},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_6521e5b3","line":21,"updated":"2014-12-10 11:56:30.000000000","message":"There is no reason this block should be indented.","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    to the linux_net ones but have linux specific options, such as run_as_root"},{"line_number":19,"context_line":"    and delete_net_dev, removed."},{"line_number":20,"context_line":"    This also allows us the flexibility to adapt to any future platform"},{"line_number":21,"context_line":"    specific differences."},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_5e6e7630","line":21,"in_reply_to":"3a961159_6521e5b3","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    try:"},{"line_number":46,"context_line":"        return utils.execute(*full_args)"},{"line_number":47,"context_line":"    except Exception as e:"},{"line_number":48,"context_line":"        LOG.error(_(\"Unable to execute %(cmd)s. Exception: %(exception)s\"),"},{"line_number":49,"context_line":"                  {\u0027cmd\u0027: full_args, \u0027exception\u0027: e})"},{"line_number":50,"context_line":"        raise exception.AgentError(method\u003dfull_args)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_85309102","line":48,"updated":"2014-12-10 11:56:30.000000000","message":"_LE","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    try:"},{"line_number":46,"context_line":"        return utils.execute(*full_args)"},{"line_number":47,"context_line":"    except Exception as e:"},{"line_number":48,"context_line":"        LOG.error(_(\"Unable to execute %(cmd)s. Exception: %(exception)s\"),"},{"line_number":49,"context_line":"                  {\u0027cmd\u0027: full_args, \u0027exception\u0027: e})"},{"line_number":50,"context_line":"        raise exception.AgentError(method\u003dfull_args)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_9e78def3","line":48,"in_reply_to":"3a961159_85309102","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8f7d1221975479910907a2baff4113a69a9088e9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                    \u0027for a response from the database. 0 is to wait forever.\u0027),"},{"line_number":38,"context_line":"]"},{"line_number":39,"context_line":"CONF \u003d cfg.CONF"},{"line_number":40,"context_line":"CONF.register_opts(net_cfg)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _ovs_vsctl(args):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_1aaf457e","line":40,"updated":"2014-12-22 15:27:26.000000000","message":"why is this not in the hyperv section? the ovs_vsctl_timeout is already defined","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                    \u0027for a response from the database. 0 is to wait forever.\u0027),"},{"line_number":38,"context_line":"]"},{"line_number":39,"context_line":"CONF \u003d cfg.CONF"},{"line_number":40,"context_line":"CONF.register_opts(net_cfg)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _ovs_vsctl(args):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_c6b00c8e","line":40,"in_reply_to":"3a961159_1aaf457e","updated":"2015-01-22 12:04:53.000000000","message":"Then I don\u0027t even think defining ovs_vsctl_timeout is even necessary. It should just be imported / used instead. Also, if defining this config opt is no longer necessary, the the DocImpact in the commit message is no longer needed either.","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8f7d1221975479910907a2baff4113a69a9088e9","unresolved":false,"context_lines":[{"line_number":40,"context_line":"CONF.register_opts(net_cfg)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _ovs_vsctl(args):"},{"line_number":44,"context_line":"    full_args \u003d [\u0027ovs-vsctl\u0027, \u0027--timeout\u003d%s\u0027 % CONF.ovs_vsctl_timeout] + args"},{"line_number":45,"context_line":"    try:"},{"line_number":46,"context_line":"        return utils.execute(*full_args)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_7a6a091b","line":43,"range":{"start_line":43,"start_character":4,"end_line":43,"end_character":14},"updated":"2014-12-22 15:27:26.000000000","message":"this is exactly the same code as https://github.com/openstack/nova/blob/master/nova/network/linux_net.py#L1336\n\nmaybe it is worthwhile to remove these methods out to ovs_utils and then you cam make use of those.","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"}],"nova/virt/hyperv/vif.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    _vif_driver_class_map \u003d {"},{"line_number":42,"context_line":"        \u0027nova.network.neutronv2.api.API\u0027: HyperVNeutronVIFDriver(),"},{"line_number":43,"context_line":"        \u0027nova.network.api.API\u0027: HyperVNovaNetworkVIFDriver(),"},{"line_number":44,"context_line":"    }"},{"line_number":45,"context_line":"    if vif_type \u003d\u003d network_model.VIF_TYPE_OVS:"},{"line_number":46,"context_line":"        return HyperVOVSVIFDriver()"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_884c2872","line":44,"updated":"2014-12-10 11:56:30.000000000","message":"this function is called multiple times. No need to recreate the dict each time. Take it out of the function. :)","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    _vif_driver_class_map \u003d {"},{"line_number":42,"context_line":"        \u0027nova.network.neutronv2.api.API\u0027: HyperVNeutronVIFDriver(),"},{"line_number":43,"context_line":"        \u0027nova.network.api.API\u0027: HyperVNovaNetworkVIFDriver(),"},{"line_number":44,"context_line":"    }"},{"line_number":45,"context_line":"    if vif_type \u003d\u003d network_model.VIF_TYPE_OVS:"},{"line_number":46,"context_line":"        return HyperVOVSVIFDriver()"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_ce09d1de","line":44,"in_reply_to":"3a961159_884c2872","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027nova.network.api.API\u0027: HyperVNovaNetworkVIFDriver(),"},{"line_number":44,"context_line":"    }"},{"line_number":45,"context_line":"    if vif_type \u003d\u003d network_model.VIF_TYPE_OVS:"},{"line_number":46,"context_line":"        return HyperVOVSVIFDriver()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    try:"},{"line_number":49,"context_line":"        return _vif_driver_class_map[CONF.network_api_class]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_281414f4","line":46,"updated":"2014-12-10 11:56:30.000000000","message":"nit: the driver is stateless, so it isn\u0027t necessary to return a new instance each time the vif_type is ovs.","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027nova.network.api.API\u0027: HyperVNovaNetworkVIFDriver(),"},{"line_number":44,"context_line":"    }"},{"line_number":45,"context_line":"    if vif_type \u003d\u003d network_model.VIF_TYPE_OVS:"},{"line_number":46,"context_line":"        return HyperVOVSVIFDriver()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    try:"},{"line_number":49,"context_line":"        return _vif_driver_class_map[CONF.network_api_class]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_0ee2f902","line":46,"in_reply_to":"3a961159_281414f4","updated":"2014-12-10 15:43:54.000000000","message":"if I move the map outside of the function, classes cannot be instantiated. Tests will fail on non windows systems due to the fact that global variables are instantiated on import, whereas the tests mock the necessary classes after the import happens.\n\nget_vif_driver() results are cached in vmops to minimize the number of times this function is called.","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"616995bc3690b50ade743c58377abd451e86c154","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        raise TypeError(_(\"VIF driver not found for \""},{"line_number":52,"context_line":"                          \"network_api_class: %(api_class)s, %(vif_type)s\") %"},{"line_number":53,"context_line":"                        {"},{"line_number":54,"context_line":"                            \"api_class\": CONF.network_api_class,"},{"line_number":55,"context_line":"                            \"vif_type\": vif_type"},{"line_number":56,"context_line":"                        })"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_c800f003","line":54,"updated":"2014-12-10 11:56:30.000000000","message":"{\"api_class\": CONF.network_api_class,\n...\n\nNo need to put it on a separate line. :)","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":9426,"name":"Gabriel Adrian Samfira","email":"gsamfira@cloudbasesolutions.com","username":"gsamfira"},"change_message_id":"946756390bb538a158d3ff0a9ceae50507b96997","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        raise TypeError(_(\"VIF driver not found for \""},{"line_number":52,"context_line":"                          \"network_api_class: %(api_class)s, %(vif_type)s\") %"},{"line_number":53,"context_line":"                        {"},{"line_number":54,"context_line":"                            \"api_class\": CONF.network_api_class,"},{"line_number":55,"context_line":"                            \"vif_type\": vif_type"},{"line_number":56,"context_line":"                        })"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_8eed09f2","line":54,"in_reply_to":"3a961159_c800f003","updated":"2014-12-10 15:43:54.000000000","message":"Done","commit_id":"0fe75f3d7411208b72f14ffd0853d178ca618b5e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"dd9615baaf5c3c394ecf335b0aa7faacf688d4b0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            nic_name,"},{"line_number":91,"context_line":"            self._get_ovs_interfaceid(vif),"},{"line_number":92,"context_line":"            vif[\u0027address\u0027],"},{"line_number":93,"context_line":"            instance[\u0027uuid\u0027])"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def unplug(self, instance, vif):"},{"line_number":96,"context_line":"        ovsutils.delete_ovs_vif_port("}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_e659885c","line":93,"updated":"2015-01-22 12:04:53.000000000","message":"instance.uuid","commit_id":"589aea9ca43121d8a2c82f0343058eb9d779be00"},{"author":{"_account_id":3185,"name":"Alessandro Pilotti","email":"apilotti@cloudbasesolutions.com","username":"alexpilotti"},"change_message_id":"490173fa369c7689dbc542a87064a26cefd07609","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    if vif_type \u003d\u003d network_model.VIF_TYPE_OVS:"},{"line_number":124,"context_line":"        return _ovs_vif_driver()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    try:"},{"line_number":127,"context_line":"        return _vif_driver_class_map[CONF.network_api_class]()"},{"line_number":128,"context_line":"    except KeyError:"},{"line_number":129,"context_line":"        raise TypeError(_(\"VIF driver not found for \""}],"source_content_type":"text/x-python","patch_set":24,"id":"fa1b9901_9be344d9","line":126,"updated":"2015-08-25 17:47:51.000000000","message":"Add VIF_TYPE_HYPERV \u003d \"hyperv\" to network_model and check if it\u0027s hyperv, raise exception with \"Unexpected vif_type\u003d%s\" if not.","commit_id":"f7bbb9f13fb3fa1fb886839cea5cb9daf55b6e4b"},{"author":{"_account_id":14253,"name":"Nithin Raju","email":"nithin@vmware.com"},"change_message_id":"341574adb34c0eb84e5367ff4201d5368150a1c8","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        # interface will not be properly initialized in the guest os."},{"line_number":90,"context_line":"        nic_name \u003d vif[\u0027id\u0027]"},{"line_number":91,"context_line":"        bridge \u003d self._get_bridge_name(vif)"},{"line_number":92,"context_line":"        if ovs_utils.check_bridge_has_dev(bridge, nic_name,"},{"line_number":93,"context_line":"                                          run_as_root\u003dFalse):"},{"line_number":94,"context_line":"            return"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_14c79a65","line":92,"updated":"2015-11-12 19:48:52.000000000","message":"If the VIF already exists on the bridge, we need to delete it and recreate it. This is the correct logic.\n\nThe reason is that, ovs-vswitchd does not automatically add the VIF to OVS kernel datapath. It needs to be triggered to do so, and the only way to trigger it is by adding the port to the bridge.\n\nAs an example, KVM does the following:\novs-vsctl --if-exists del-port vnet0 -- add-port ovsbr0 vnet0","commit_id":"76014ae681b9b9944cc4243e883f6f502c6c13a5"},{"author":{"_account_id":14253,"name":"Nithin Raju","email":"nithin@vmware.com"},"change_message_id":"c49dbfeb77a6833967ac36d59a7e8b1e4e3e251d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # interface will not be properly initialized in the guest os."},{"line_number":78,"context_line":"        nic_name \u003d vif[\u0027id\u0027]"},{"line_number":79,"context_line":"        bridge \u003d self._get_bridge_name(vif)"},{"line_number":80,"context_line":"        if ovs_utils.check_bridge_has_dev(bridge, nic_name,"},{"line_number":81,"context_line":"                                          run_as_root\u003dFalse):"},{"line_number":82,"context_line":"            return"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7a740942_98bd2f04","line":80,"updated":"2015-12-08 16:46:14.000000000","message":"If the port already exists in OVSDB for some reason - either user added it manually, or residue from a previous failed VM power on, we should gracefully handle that case.\n\nCan we delete any existing port by the same name before adding it?\n\nAs an example, KVM does the same: ovs-vsctl --if-exists del-port vnet0 -- add-port ovsbr0 vnet0","commit_id":"debb2897ff1c4ddf8bcfdb279c66a94e33b736cc"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"7c92d46bfa19ba3ff367b1a04fb5fb4d863f689f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # interface will not be properly initialized in the guest os."},{"line_number":78,"context_line":"        nic_name \u003d vif[\u0027id\u0027]"},{"line_number":79,"context_line":"        bridge \u003d self._get_bridge_name(vif)"},{"line_number":80,"context_line":"        if ovs_utils.check_bridge_has_dev(bridge, nic_name,"},{"line_number":81,"context_line":"                                          run_as_root\u003dFalse):"},{"line_number":82,"context_line":"            return"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7a740942_fd63d33f","line":80,"in_reply_to":"7a740942_98bd2f04","updated":"2015-12-09 13:05:18.000000000","message":"Indeed this makes sense.","commit_id":"debb2897ff1c4ddf8bcfdb279c66a94e33b736cc"},{"author":{"_account_id":15130,"name":"Sonu","email":"sonu.sudhakaran@gmail.com","username":"sonu"},"change_message_id":"062005169b5d0a447ef09ef37a3a99d4ad78a85e","unresolved":false,"context_lines":[{"line_number":104,"context_line":"}"},{"line_number":105,"context_line":"_ovs_vif_driver \u003d HyperVOVSVIFDriver"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"def get_vif_driver(vif_type):"},{"line_number":109,"context_line":"    # results should be cached. Creating a global driver map"},{"line_number":110,"context_line":"    # with instantiated classes will cause tests to fail on"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a740942_eeb7ad82","line":107,"updated":"2015-12-09 06:17:15.000000000","message":"Not a good idea to put the caching requirement on client. If the implementation demands a single instance, it must be handled in this function.","commit_id":"debb2897ff1c4ddf8bcfdb279c66a94e33b736cc"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"0b3613bcd6f010b67bc1ff3ea45a0dd33f35c5ce","unresolved":false,"context_lines":[{"line_number":104,"context_line":"}"},{"line_number":105,"context_line":"_ovs_vif_driver \u003d HyperVOVSVIFDriver"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"def get_vif_driver(vif_type):"},{"line_number":109,"context_line":"    # results should be cached. Creating a global driver map"},{"line_number":110,"context_line":"    # with instantiated classes will cause tests to fail on"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a740942_de3ee628","line":107,"in_reply_to":"7a740942_eeb7ad82","updated":"2015-12-10 04:28:40.000000000","message":"I prefer the cache to be in vmops. This sould be a factory method here, responsible only for giving the client an instantiated method of a particular vif driver. It makes much more sense in my opinion to have vmops deal with the caching of objects.","commit_id":"debb2897ff1c4ddf8bcfdb279c66a94e33b736cc"},{"author":{"_account_id":14253,"name":"Nithin Raju","email":"nithin@vmware.com"},"change_message_id":"73ec003e137e9c0de28fedeecdfeca08ec7f54e8","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    def post_start(self, instance, vif):"},{"line_number":77,"context_line":"        # we add the interface to the bridge post start, otherwise the"},{"line_number":78,"context_line":"        # interface will not be properly initialized in the guest os."},{"line_number":79,"context_line":"        ovs_utils.create_ovs_vif_port("},{"line_number":80,"context_line":"            self._get_bridge_name(vif),"},{"line_number":81,"context_line":"            vif[\u0027id\u0027],"},{"line_number":82,"context_line":"            self._get_ovs_interfaceid(vif),"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a740942_8521bbfe","line":79,"updated":"2015-12-10 18:40:51.000000000","message":"how does ovs_utils.create_ovs_vif_port() handle things if there\u0027s a port already existing by this name?\n\nIdeally, some code like this would have been great:\n\ndef post_start(self, instance, vif)\n\n        nic_name \u003d vif[\u0027id\u0027]\t\t\n        bridge \u003d self._get_bridge_name(vif)\t\t\n        if ovs_utils.check_bridge_has_dev(bridge, nic_name, run_as_root\u003dFalse):\n                unplug(self, instance, vif)\n\n        ovs_utils.create_ovs_vif_port(self._get_bridge_name(vif), ....","commit_id":"e77ed34c43f5c298ad8e77aa0f72991c4a6b4990"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"9a41d0572095918377589da0842ed17be7cea624","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    def post_start(self, instance, vif):"},{"line_number":77,"context_line":"        # we add the interface to the bridge post start, otherwise the"},{"line_number":78,"context_line":"        # interface will not be properly initialized in the guest os."},{"line_number":79,"context_line":"        ovs_utils.create_ovs_vif_port("},{"line_number":80,"context_line":"            self._get_bridge_name(vif),"},{"line_number":81,"context_line":"            vif[\u0027id\u0027],"},{"line_number":82,"context_line":"            self._get_ovs_interfaceid(vif),"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a740942_b3288934","line":79,"in_reply_to":"7a740942_011586e3","updated":"2015-12-11 17:30:43.000000000","message":"Sorry, I said \"it\u0027s defined in this patch\" but didn\u0027t provide the link. Here it is https://review.openstack.org/#/c/179727/16","commit_id":"e77ed34c43f5c298ad8e77aa0f72991c4a6b4990"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"ed3934e82add3868a153d618c271f12b44cb9824","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    def post_start(self, instance, vif):"},{"line_number":77,"context_line":"        # we add the interface to the bridge post start, otherwise the"},{"line_number":78,"context_line":"        # interface will not be properly initialized in the guest os."},{"line_number":79,"context_line":"        ovs_utils.create_ovs_vif_port("},{"line_number":80,"context_line":"            self._get_bridge_name(vif),"},{"line_number":81,"context_line":"            vif[\u0027id\u0027],"},{"line_number":82,"context_line":"            self._get_ovs_interfaceid(vif),"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a740942_e0cf4db1","line":79,"in_reply_to":"7a740942_8521bbfe","updated":"2015-12-10 18:51:57.000000000","message":"ovs_utils.create_ovs_vif_port  is defined in this patch. It\u0027s just the method from linux_net moved to a common location so that it can be used both on Windows and Linux.\n\nThe call is basically:\n\novs_vsctl --if-exists del-port interface --add-port bridge interface\n\nSo it deletes the port in case it is already present in the bridge.","commit_id":"e77ed34c43f5c298ad8e77aa0f72991c4a6b4990"},{"author":{"_account_id":14253,"name":"Nithin Raju","email":"nithin@vmware.com"},"change_message_id":"baa0fa761e6aabce599d9616fc613afdc467ce0d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    def post_start(self, instance, vif):"},{"line_number":77,"context_line":"        # we add the interface to the bridge post start, otherwise the"},{"line_number":78,"context_line":"        # interface will not be properly initialized in the guest os."},{"line_number":79,"context_line":"        ovs_utils.create_ovs_vif_port("},{"line_number":80,"context_line":"            self._get_bridge_name(vif),"},{"line_number":81,"context_line":"            vif[\u0027id\u0027],"},{"line_number":82,"context_line":"            self._get_ovs_interfaceid(vif),"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a740942_011586e3","line":79,"in_reply_to":"7a740942_e0cf4db1","updated":"2015-12-11 17:11:54.000000000","message":"Do you mind pointing me to the code of ovs_utils.create_ovs_vif_port()?","commit_id":"e77ed34c43f5c298ad8e77aa0f72991c4a6b4990"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e7d3fde53092d4151ca35a79d57a1d2f5675607e","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class HyperVBasePlugin(os_vif_plugin.PluginBase):"},{"line_number":31,"context_line":"    def describe(self):"},{"line_number":32,"context_line":"        return os_vif_objects.host_info.HostPluginInfo("},{"line_number":33,"context_line":"            plugin_name\u003d\"ovs\","}],"source_content_type":"text/x-python","patch_set":41,"id":"1ac06dbe_c3ec60f5","line":30,"updated":"2016-08-23 13:20:31.000000000","message":"The whole point of os-vif is that it separates VIF plugin responsibility out of Nova, so that supporting new VIF types does not involve nova code. As such it is inappropriate to add os-vif plugins to the nova tree. Apart from the two core os-vif plugins (linux bridge + ovs), all other plugins should be standalone python modules, in a vif_plugin_XXX namespace.","commit_id":"b8005c5c08edf70846414f504bdc8fc0aaef2d41"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e5e5a9f67b043b3be35e431468654fe0b59992e8","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class HyperVBasePlugin(os_vif_plugin.PluginBase):"},{"line_number":31,"context_line":"    def describe(self):"},{"line_number":32,"context_line":"        return os_vif_objects.host_info.HostPluginInfo("},{"line_number":33,"context_line":"            plugin_name\u003d\"ovs\","}],"source_content_type":"text/x-python","patch_set":41,"id":"1ac06dbe_04daefe7","line":30,"in_reply_to":"1ac06dbe_a4ecbb2a","updated":"2016-08-23 16:22:15.000000000","message":"just for an insignificant thing *","commit_id":"b8005c5c08edf70846414f504bdc8fc0aaef2d41"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"8f600391cdf4e2bfa7676cbc1642ce3d104643f5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class HyperVBasePlugin(os_vif_plugin.PluginBase):"},{"line_number":31,"context_line":"    def describe(self):"},{"line_number":32,"context_line":"        return os_vif_objects.host_info.HostPluginInfo("},{"line_number":33,"context_line":"            plugin_name\u003d\"ovs\","}],"source_content_type":"text/x-python","patch_set":41,"id":"1ac06dbe_a4ecbb2a","line":30,"in_reply_to":"1ac06dbe_c3ec60f5","updated":"2016-08-23 16:21:17.000000000","message":"I understand your point, and I agree with it, but I am strongly against creating a new repo just such an insignificant thing.\n\nThis module was updated 7 times over the past 24+ months, and most updates were maintenance stuff (centralize config options, fix invalid import order, use oslo.log, removed unused LOG, etc.), which are trivial. The effort to create and maintain a new repo, which won\u0027t be updated anyways is much greater than just accepting this.\n\nPlus, looking at the code, this is what it\u0027s going to happen: HyperVNovaNetworkPlugin will get removed in the near future anyways, since nova will drop any and all support for it. HyperVNeutronPlugin, honestly, I think it would be simpler to have a NoopPlugin in os-vif... Soo... what exactly are we going to have in the new repo?","commit_id":"b8005c5c08edf70846414f504bdc8fc0aaef2d41"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"f949c4c085a2ae289d249ccc243b8a319839203e","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    @staticmethod"},{"line_number":96,"context_line":"    def _get_vif_driver(vif_type):"},{"line_number":97,"context_line":"        if vif_type \u003d\u003d model.VIF_TYPE_OVS:"},{"line_number":98,"context_line":"            return ovs.OvsPlugin(CONF)"},{"line_number":99,"context_line":"        elif vif_type \u003d\u003d model.VIF_TYPE_HYPERV:"},{"line_number":100,"context_line":"            if nova.network.is_neutron():"},{"line_number":101,"context_line":"                return HyperVNeutronVIFDriver()"}],"source_content_type":"text/x-python","patch_set":43,"id":"7a8ec9b2_4850d332","line":98,"updated":"2016-09-21 11:42:49.000000000","message":"You should not be directly accessing the os-vif plugins in this way. The only supported mechanism for Nova to use os-vif is via the os_vif API. ie you should be calling  os_vif.plug(vif, instance_info) / os_vif.unplug(vif, instance_info) not hand-picking specific plugins directly in nova.\n\nNB, your code is further wrong becasue its passing a Nova instance object into os-vif which is not what it wants.","commit_id":"32ce1721c67ebe5507cce556a3e72d281ec2dcd3"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"a87ec820652456ebdfdbb627edfc47b130f10852","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    @staticmethod"},{"line_number":96,"context_line":"    def _get_vif_driver(vif_type):"},{"line_number":97,"context_line":"        if vif_type \u003d\u003d model.VIF_TYPE_OVS:"},{"line_number":98,"context_line":"            return ovs.OvsPlugin(CONF)"},{"line_number":99,"context_line":"        elif vif_type \u003d\u003d model.VIF_TYPE_HYPERV:"},{"line_number":100,"context_line":"            if nova.network.is_neutron():"},{"line_number":101,"context_line":"                return HyperVNeutronVIFDriver()"}],"source_content_type":"text/x-python","patch_set":43,"id":"5a8bc5a2_8fe68eb2","line":98,"in_reply_to":"7a8ec9b2_4850d332","updated":"2016-09-23 13:23:57.000000000","message":"Done","commit_id":"32ce1721c67ebe5507cce556a3e72d281ec2dcd3"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"31310bd00d9072fd028368e25992214d21896d0a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        if vif_type \u003d\u003d model.VIF_TYPE_OVS:"},{"line_number":93,"context_line":"            return os_vif"},{"line_number":94,"context_line":"        elif vif_type \u003d\u003d model.VIF_TYPE_HYPERV:"},{"line_number":95,"context_line":"            return self._vif_plugin"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        raise exception.NovaException(_(\"Unexpected vif_type\u003d%s\") % vif_type)"}],"source_content_type":"text/x-python","patch_set":45,"id":"5a8bc5a2_5feeefec","line":95,"updated":"2016-09-23 14:58:25.000000000","message":"I think this is a *horrible* design pattern. You\u0027re returning 2 completely different things in each codepath - in one case you\u0027re returning the os-vif module, and in the other a locally defined object. It happens to work because you picked method names for the local object that matches os-vif. That doesn\u0027t make it good though.","commit_id":"7cf0b31b25146481bdfe59a1754f176a172bf641"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"46744f7cad1f42305452d067e03bf8a17fee8337","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        if vif_type \u003d\u003d model.VIF_TYPE_OVS:"},{"line_number":93,"context_line":"            return os_vif"},{"line_number":94,"context_line":"        elif vif_type \u003d\u003d model.VIF_TYPE_HYPERV:"},{"line_number":95,"context_line":"            return self._vif_plugin"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        raise exception.NovaException(_(\"Unexpected vif_type\u003d%s\") % vif_type)"}],"source_content_type":"text/x-python","patch_set":45,"id":"5a8bc5a2_16ce095a","line":95,"in_reply_to":"5a8bc5a2_5feeefec","updated":"2016-09-23 18:06:42.000000000","message":"Done","commit_id":"7cf0b31b25146481bdfe59a1754f176a172bf641"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5139da4b80fc75a0c0b6a2379c0c36b86f6ad3bb","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class HyperVBaseVIFPlugin(object):"},{"line_number":32,"context_line":"    @abc.abstractmethod"},{"line_number":33,"context_line":"    def plug(self, vif, instance):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abc.abstractmethod"},{"line_number":37,"context_line":"    def unplug(self, vif, instance):"},{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class HyperVNeutronVIFPlugin(HyperVBaseVIFPlugin):"}],"source_content_type":"text/x-python","patch_set":49,"id":"da4df55a_1cb9812e","line":38,"range":{"start_line":33,"start_character":4,"end_line":38,"end_character":12},"updated":"2016-12-28 20:05:25.000000000","message":"Why did these args need to be moved? Seems like unnecessary churn.","commit_id":"330617c4689ab48106594143b99294a8bf47cd39"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e841007132e33800e32c7f7e1951b930290b3dc1","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class HyperVBaseVIFPlugin(object):"},{"line_number":32,"context_line":"    @abc.abstractmethod"},{"line_number":33,"context_line":"    def plug(self, vif, instance):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abc.abstractmethod"},{"line_number":37,"context_line":"    def unplug(self, vif, instance):"},{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class HyperVNeutronVIFPlugin(HyperVBaseVIFPlugin):"}],"source_content_type":"text/x-python","patch_set":49,"id":"ba5201f7_a410be02","line":38,"range":{"start_line":33,"start_character":4,"end_line":38,"end_character":12},"in_reply_to":"ba5201f7_ce8fbf21","updated":"2017-01-04 02:40:08.000000000","message":"OK. If it\u0027s something that bugs you feel free to make the change on a later separate patch so we don\u0027t make this one harder to review than it is.","commit_id":"330617c4689ab48106594143b99294a8bf47cd39"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0bd0b1abde67619ce9e2cf48653359f105dbd0ca","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class HyperVBaseVIFPlugin(object):"},{"line_number":32,"context_line":"    @abc.abstractmethod"},{"line_number":33,"context_line":"    def plug(self, vif, instance):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abc.abstractmethod"},{"line_number":37,"context_line":"    def unplug(self, vif, instance):"},{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class HyperVNeutronVIFPlugin(HyperVBaseVIFPlugin):"}],"source_content_type":"text/x-python","patch_set":49,"id":"ba5201f7_ce8fbf21","line":38,"range":{"start_line":33,"start_character":4,"end_line":38,"end_character":12},"in_reply_to":"da4df55a_1cb9812e","updated":"2017-01-03 12:57:25.000000000","message":"hm, I only wanted to have the same argument order as os-vif: (vif, instance) instead of (instance, vif)\n\nbut I can change it back.","commit_id":"330617c4689ab48106594143b99294a8bf47cd39"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5139da4b80fc75a0c0b6a2379c0c36b86f6ad3bb","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            raise exception.NovaException("},{"line_number":91,"context_line":"                _(\"Unexpected vif_type\u003d%s\") % vif_type)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def unplug(self, vif, instance):"},{"line_number":94,"context_line":"        vif_type \u003d vif[\u0027type\u0027]"},{"line_number":95,"context_line":"        if vif_type \u003d\u003d model.VIF_TYPE_HYPERV:"},{"line_number":96,"context_line":"            self._vif_plugin.unplug(vif, instance)"}],"source_content_type":"text/x-python","patch_set":49,"id":"da4df55a_3c8ba569","line":93,"updated":"2016-12-28 20:05:25.000000000","message":"Will this handle unplugging things that were plugged using the old vif driver? In other words, is there any upgrade impact with this?","commit_id":"330617c4689ab48106594143b99294a8bf47cd39"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0bd0b1abde67619ce9e2cf48653359f105dbd0ca","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            raise exception.NovaException("},{"line_number":91,"context_line":"                _(\"Unexpected vif_type\u003d%s\") % vif_type)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def unplug(self, vif, instance):"},{"line_number":94,"context_line":"        vif_type \u003d vif[\u0027type\u0027]"},{"line_number":95,"context_line":"        if vif_type \u003d\u003d model.VIF_TYPE_HYPERV:"},{"line_number":96,"context_line":"            self._vif_plugin.unplug(vif, instance)"}],"source_content_type":"text/x-python","patch_set":49,"id":"ba5201f7_ee8ba31c","line":93,"in_reply_to":"da4df55a_3c8ba569","updated":"2017-01-03 12:57:25.000000000","message":"there is no upgrade impact, unplugging for VIF_TYPE_HYPERV will still be the same. Before this patch, we only supported VIF_TYPE_HYPERV vif types, meaning that old instances could only have VIF_TYPE_HYPERV vifs. With this patch, we are adding VIF_TYPE_OVS to the list.","commit_id":"330617c4689ab48106594143b99294a8bf47cd39"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dc6ca8c0d895212bc4d81df9843df3dfd6d2fff9","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            instance \u003d os_vif_util.nova_to_osvif_instance(instance)"},{"line_number":100,"context_line":"            os_vif.unplug(vif, instance)"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            raise exception.NovaException("},{"line_number":103,"context_line":"                _(\"Unexpected vif_type\u003d%s\") % vif_type)"}],"source_content_type":"text/x-python","patch_set":54,"id":"ba5201f7_f5032040","line":102,"updated":"2017-01-11 20:21:59.000000000","message":"See comment about raising a more explicit exception class please. Perhaps something like VirtualInterfacePlugException would be appropriate?\n\nhttps://github.com/openstack/nova/blob/master/nova/exception.py#L127","commit_id":"201d5941589bd195ecdfa79d0a607d3bcfca3bd3"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"99f082229b6053f59afd907be1e7e7910569140d","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            instance \u003d os_vif_util.nova_to_osvif_instance(instance)"},{"line_number":100,"context_line":"            os_vif.unplug(vif, instance)"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            raise exception.NovaException("},{"line_number":103,"context_line":"                _(\"Unexpected vif_type\u003d%s\") % vif_type)"}],"source_content_type":"text/x-python","patch_set":54,"id":"ba5201f7_a6417065","line":102,"in_reply_to":"ba5201f7_f5032040","updated":"2017-01-11 20:33:50.000000000","message":"Done","commit_id":"201d5941589bd195ecdfa79d0a607d3bcfca3bd3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bfa456e90280349e1418f6fb78077c77b51ee7ba","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            os_vif.plug(vif, instance)"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            reason \u003d _(\"Unexpected vif_type\u003d%s\") % vif_type"},{"line_number":91,"context_line":"            raise exception.VirtualInterfacePlugException(reason\u003dreason)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def unplug(self, instance, vif):"},{"line_number":94,"context_line":"        vif_type \u003d vif[\u0027type\u0027]"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba5201f7_9c891829","line":91,"range":{"start_line":91,"start_character":58,"end_line":91,"end_character":64},"updated":"2017-01-11 22:12:50.000000000","message":"There is no \u0027reason\u0027 kwarg on this exception class\u0027s msg:\n\nhttps://github.com/openstack/nova/blob/f55815b2f90b934801a88e10bf750876b0587328/nova/exception.py#L128\n\nSo if you want a custom message, you have to override that by passing it in as the first arg to the constructor.","commit_id":"a6a8f3ce1220712992d28928fb3c51417457a76e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"4ae148f30e9fb1f62239f0efcc59d5bebf4ff0c9","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            os_vif.plug(vif, instance)"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            reason \u003d _(\"Unexpected vif_type\u003d%s\") % vif_type"},{"line_number":91,"context_line":"            raise exception.VirtualInterfacePlugException(reason\u003dreason)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def unplug(self, instance, vif):"},{"line_number":94,"context_line":"        vif_type \u003d vif[\u0027type\u0027]"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba5201f7_3c010c39","line":91,"range":{"start_line":91,"start_character":58,"end_line":91,"end_character":64},"in_reply_to":"ba5201f7_9c891829","updated":"2017-01-11 22:20:10.000000000","message":"Done","commit_id":"a6a8f3ce1220712992d28928fb3c51417457a76e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bfa456e90280349e1418f6fb78077c77b51ee7ba","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            os_vif.unplug(vif, instance)"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            reason \u003d _(\"Unexpected vif_type\u003d%s\") % vif_type"},{"line_number":103,"context_line":"            raise exception.VirtualInterfaceUnplugException(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba5201f7_bc8edc2b","line":103,"updated":"2017-01-11 22:12:50.000000000","message":"same","commit_id":"a6a8f3ce1220712992d28928fb3c51417457a76e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b97ef8ef235a8fe4bba688d6ab8d604d4e549a72","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            os_vif.unplug(vif, instance)"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            reason \u003d _(\"Unexpected vif_type\u003d%s\") % vif_type"},{"line_number":103,"context_line":"            raise exception.VirtualInterfaceUnplugException(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba5201f7_7cf71459","line":103,"in_reply_to":"ba5201f7_bc8edc2b","updated":"2017-01-11 22:19:50.000000000","message":"nevermind i guess this one does have a reason, so it\u0027s only a problem in the plug exception","commit_id":"a6a8f3ce1220712992d28928fb3c51417457a76e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"4ae148f30e9fb1f62239f0efcc59d5bebf4ff0c9","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            os_vif.unplug(vif, instance)"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            reason \u003d _(\"Unexpected vif_type\u003d%s\") % vif_type"},{"line_number":103,"context_line":"            raise exception.VirtualInterfaceUnplugException(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba5201f7_fca14447","line":103,"in_reply_to":"ba5201f7_bc8edc2b","updated":"2017-01-11 22:20:10.000000000","message":"this actually has a reason kwarg, while the other one above doesn\u0027t.","commit_id":"a6a8f3ce1220712992d28928fb3c51417457a76e"}],"nova/virt/hyperv/vmops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3d5974f7952e94619b4b175d604555543ad44a16","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            return vif_driver"},{"line_number":215,"context_line":"        vif_driver \u003d vif_utils.get_vif_driver(vif_type)"},{"line_number":216,"context_line":"        self._vif_driver_cache[vif_type] \u003d vif_driver"},{"line_number":217,"context_line":"        return vif_driver"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _is_resize_needed(self, vhd_path, old_size, new_size, instance):"},{"line_number":220,"context_line":"        if new_size \u003c old_size:"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_30ef94b2","line":217,"updated":"2015-07-28 11:26:15.000000000","message":"I think something like this looks a bit better.:\n\n    vif_driver \u003d self._vif_driver_cache.get(vif_type)\n    if not vif_driver:\n        vif_driver \u003d vif_utils.get_vif_driver(vif_type)\n        self._vif_driver_cache[vif_type] \u003d vif_driver\n    return vif_driver\n\nbut it\u0027s just a suggestion.","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f43428a6212f54fbcd193c87d060c84781145a09","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            return vif_driver"},{"line_number":215,"context_line":"        vif_driver \u003d vif_utils.get_vif_driver(vif_type)"},{"line_number":216,"context_line":"        self._vif_driver_cache[vif_type] \u003d vif_driver"},{"line_number":217,"context_line":"        return vif_driver"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _is_resize_needed(self, vhd_path, old_size, new_size, instance):"},{"line_number":220,"context_line":"        if new_size \u003c old_size:"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_9ea00044","line":217,"in_reply_to":"3a50d1a3_30ef94b2","updated":"2015-08-03 12:55:20.000000000","message":"Done","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3d5974f7952e94619b4b175d604555543ad44a16","unresolved":false,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"            if destroy_disks:"},{"line_number":449,"context_line":"                self._delete_disk_files(instance_name)"},{"line_number":450,"context_line":"            if network_info:"},{"line_number":451,"context_line":"                for vif in network_info:"},{"line_number":452,"context_line":"                    vif_driver \u003d self._get_vif_driver(vif.get(\u0027type\u0027))"},{"line_number":453,"context_line":"                    vif_driver.unplug(instance, vif)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_106938f9","line":450,"range":{"start_line":450,"start_character":15,"end_line":450,"end_character":27},"updated":"2015-07-28 11:26:15.000000000","message":"I think we should add a comment as to why are we unpluging the vif after the VM has been destroyed. Adding a comment saying that \"the OVS ports has to be cleaned up / removed after the VM is destroyed\" could be useful to other reviewers as well.","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3d5974f7952e94619b4b175d604555543ad44a16","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                                                           block_device_info)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        self._set_vm_state(instance, constants.HYPERV_VM_STATE_ENABLED)"},{"line_number":562,"context_line":"        if network_info:"},{"line_number":563,"context_line":"            for vif in network_info:"},{"line_number":564,"context_line":"                vif_driver \u003d self._get_vif_driver(vif.get(\u0027type\u0027))"},{"line_number":565,"context_line":"                vif_driver.post_start(instance, vif)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_900a2825","line":562,"updated":"2015-07-28 11:26:15.000000000","message":"i\u0027m not particularly sure why we need to do this post_start action. Is it because the ovs port might not exist when the vm is started? If so, in what case this occurs? I think a comment would be useful here, explaining this.","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f43428a6212f54fbcd193c87d060c84781145a09","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                                                           block_device_info)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        self._set_vm_state(instance, constants.HYPERV_VM_STATE_ENABLED)"},{"line_number":562,"context_line":"        if network_info:"},{"line_number":563,"context_line":"            for vif in network_info:"},{"line_number":564,"context_line":"                vif_driver \u003d self._get_vif_driver(vif.get(\u0027type\u0027))"},{"line_number":565,"context_line":"                vif_driver.post_start(instance, vif)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_b94ab681","line":562,"in_reply_to":"3a50d1a3_900a2825","updated":"2015-08-03 12:55:20.000000000","message":"Done","commit_id":"6e6421fa2d459b37d2ebec1d0455f504f9a8ae1d"},{"author":{"_account_id":15130,"name":"Sonu","email":"sonu.sudhakaran@gmail.com","username":"sonu"},"change_message_id":"062005169b5d0a447ef09ef37a3a99d4ad78a85e","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        self._pathutils \u003d pathutils.PathUtils()"},{"line_number":128,"context_line":"        self._volumeops \u003d volumeops.VolumeOps()"},{"line_number":129,"context_line":"        self._imagecache \u003d imagecache.ImageCache()"},{"line_number":130,"context_line":"        self._vif_driver_cache \u003d {}"},{"line_number":131,"context_line":"        self._vm_log_writers \u003d {}"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def list_instance_uuids(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a740942_ce3991f3","line":130,"updated":"2015-12-09 06:17:15.000000000","message":"What is the need of maintaining all type drivers in a single instance of vmops? If I am correct, it is always one to one relation. I am not convinced why a VMOPS should have a cache of VIF drivers?","commit_id":"debb2897ff1c4ddf8bcfdb279c66a94e33b736cc"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"2ca0b4a40ec5bb67a8d0c3a95237f356c3e12e55","unresolved":false,"context_lines":[{"line_number":631,"context_line":"                                                           block_device_info)"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"        self._set_vm_state(instance, os_win_const.HYPERV_VM_STATE_ENABLED)"},{"line_number":634,"context_line":"        self.plug_vifs(instance, network_info)"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"    def _set_vm_state(self, instance, req_state):"},{"line_number":637,"context_line":"        instance_name \u003d instance.name"}],"source_content_type":"text/x-python","patch_set":46,"id":"1a95cdbc_2d2cd049","line":634,"updated":"2016-10-05 11:22:13.000000000","message":"Wondering whether we should have an inline comment mentioning why ports are bound after the instance is spawned.","commit_id":"c78a1c6edfd01fc042676a9cf4d58a761665829e"}],"nova/virt/hyperv/vmutilsv2.py":[{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ae9e27517bf71fa064c59f754bcc65ed9faaf98a","unresolved":false,"context_lines":[{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        eth_port_data.HostResource \u003d [vswitch_conn_data]"},{"line_number":269,"context_line":"        eth_port_data.Parent \u003d nic_data.path_()"},{"line_number":270,"context_line":"        eth_port_data.ElementName \u003d nic_name"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        vm \u003d self._lookup_vm_check(vm_name)"},{"line_number":273,"context_line":"        self._add_virt_resource(eth_port_data, vm.path_())"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_5c5dcf20","line":270,"updated":"2015-02-02 14:39:33.000000000","message":"This looks redundant. Isn\u0027t this already set when the nic is created?\nhttps://github.com/openstack/nova/blob/master/nova/virt/hyperv/vmutils.py#L486\n\nThe ElementName is used even when retrieving the nic by name.\n\nIf this is a workaround for some Hyper-V issue, I think it should be mentioned in an inline comment.","commit_id":"636559f487932d021f518578cef9346f271fe49e"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"42c81fd379a97e0e9e90ea0b71b701a1a694af70","unresolved":false,"context_lines":[{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        eth_port_data.HostResource \u003d [vswitch_conn_data]"},{"line_number":269,"context_line":"        eth_port_data.Parent \u003d nic_data.path_()"},{"line_number":270,"context_line":"        eth_port_data.ElementName \u003d nic_name"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        vm \u003d self._lookup_vm_check(vm_name)"},{"line_number":273,"context_line":"        self._add_virt_resource(eth_port_data, vm.path_())"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_b7023d3c","line":270,"in_reply_to":"da86d52c_5c5dcf20","updated":"2015-02-03 09:32:25.000000000","message":"eth_port_data is an instance of the  Msvm_EthernetPortAllocationSettingData Class while nic_data is an instance of Msvm_SyntheticEthernetPortSettingData Class","commit_id":"636559f487932d021f518578cef9346f271fe49e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"6c4f6e582715ccf6d645ccb4aa79f140e7ce6748","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        eth_port_data.HostResource \u003d [vswitch_conn_data]"},{"line_number":290,"context_line":"        eth_port_data.Parent \u003d nic_data.path_()"},{"line_number":291,"context_line":"        eth_port_data.ElementName \u003d nic_name"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        vm \u003d self._lookup_vm_check(vm_name)"},{"line_number":294,"context_line":"        self._add_virt_resource(eth_port_data, vm.path_())"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_fc7dab1c","line":291,"updated":"2015-11-10 14:45:03.000000000","message":"this should aready exist in os-win, which means this won\u0027t be necessary.","commit_id":"366169aac66cefc32caf7ca81434649b2c25beae"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"758d929b808f56da47c177763c4d734164cd41e9","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        eth_port_data.HostResource \u003d [vswitch_conn_data]"},{"line_number":290,"context_line":"        eth_port_data.Parent \u003d nic_data.path_()"},{"line_number":291,"context_line":"        eth_port_data.ElementName \u003d nic_name"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        vm \u003d self._lookup_vm_check(vm_name)"},{"line_number":294,"context_line":"        self._add_virt_resource(eth_port_data, vm.path_())"}],"source_content_type":"text/x-python","patch_set":27,"id":"da85f559_b51fcdb5","line":291,"in_reply_to":"da85f559_fc7dab1c","updated":"2015-11-12 10:54:44.000000000","message":"Not really, there are methods for creating new nics in os-win not modifying existing ones. But I guess your point is that this chain of patches should be based on the ones adding os-win ?","commit_id":"366169aac66cefc32caf7ca81434649b2c25beae"}],"releasenotes/notes/hyper-v-ovs-vif-348fca68db4918fe.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6c9e4364b8818a3c40102d39ae80ae7ed53b0794","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    The nova Hyper-V driver can now plug OVS VIFs."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - The nova Hyper-V driver can now plug OVS VIFs. This means that"},{"line_number":6,"context_line":"    neutron-ovs-agent can be used as an L2 agent instead of"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"ba5201f7_24c04e7b","line":3,"updated":"2017-01-04 02:39:58.000000000","message":"I don\u0027t think we probably need a prelude to the release notes for this vendor/virt specific feature.","commit_id":"19442f52d80be2f49987378fcd336ca183147d6a"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"3ed4b1bb7f705a73d45e684e416eb7265dac3025","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    The nova Hyper-V driver can now plug OVS VIFs."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - The nova Hyper-V driver can now plug OVS VIFs. This means that"},{"line_number":6,"context_line":"    neutron-ovs-agent can be used as an L2 agent instead of"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"ba5201f7_01f41184","line":3,"in_reply_to":"ba5201f7_24c04e7b","updated":"2017-01-04 09:38:39.000000000","message":"Done","commit_id":"19442f52d80be2f49987378fcd336ca183147d6a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3d2320377234015efb9d3b5df26d993a505bf358","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    neutron-hyperv-agent."},{"line_number":6,"context_line":"    In order to plug OVS VIFs, the configuration option \"vswitch_name\""},{"line_number":7,"context_line":"    from the \"hyperv\" section must be set to the vSwitch which has the OVS"},{"line_number":8,"context_line":"    extension enabled."}],"source_content_type":"text/x-yaml","patch_set":53,"id":"ba5201f7_b18dd3d4","line":8,"updated":"2017-01-07 16:48:20.000000000","message":"It would probably also be good to mention the caveat that Claudiu noted in an earlier part of the review here:\n\n\"Hotplugging is only supported on Windows / Hyper-V Server 2016 + Generation 2 VMs. Older Hyper-V versions only support attaching vNICs while the VM is turned off.\"","commit_id":"bce6a9fe330c847d04c44b8630b2fbb207621b91"}]}
