)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"c0cdcc6704915d57b61aec54329b46a68f260c61","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     esberglu \u003cesberglu@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-02-22 09:26:28 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: PowerVM Driver: Network interface attach/detach"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds the ability to hotplug network interfaces for the powervm"},{"line_number":10,"context_line":"virt driver."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa0c359_1833fd15","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":3},"updated":"2018-02-22 23:55:33.000000000","message":"is this WIP because you\u0027re still doing some manual testing? Please remove when complete.","commit_id":"e2d46b044009dbb5670ca52d41b187352d2f8d37"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"8e3cfde3491bf1b9b0576ce0775280e3dde36658","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     esberglu \u003cesberglu@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-02-22 09:26:28 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: PowerVM Driver: Network interface attach/detach"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds the ability to hotplug network interfaces for the powervm"},{"line_number":10,"context_line":"virt driver."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa0c359_3c149fe8","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":3},"in_reply_to":"3fa0c359_1833fd15","updated":"2018-02-23 14:44:04.000000000","message":"Yes","commit_id":"e2d46b044009dbb5670ca52d41b187352d2f8d37"}],"doc/source/user/support-matrix.ini":[{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"603326e1fe5e13812b56db3a73ec9badebc5ff41","unresolved":false,"context_lines":[{"line_number":252,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":253,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":254,"context_line":"driver-impl-libvirt-vz-ct\u003dcomplete"},{"line_number":255,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"[operation.maintenance-mode]"},{"line_number":258,"context_line":"title\u003dSet the host in a maintenance mode"}],"source_content_type":"text/x-properties","patch_set":7,"id":"df7087c5_fa21bca0","line":255,"range":{"start_line":255,"start_character":20,"end_line":255,"end_character":27},"updated":"2018-03-21 19:29:44.000000000","message":"complete","commit_id":"349b532cccad1d69d592faad95f7ff8931d13df8"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"6e15f5f73b30d564a4f39d6540c5ac0bf0456b13","unresolved":false,"context_lines":[{"line_number":252,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":253,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":254,"context_line":"driver-impl-libvirt-vz-ct\u003dcomplete"},{"line_number":255,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"[operation.maintenance-mode]"},{"line_number":258,"context_line":"title\u003dSet the host in a maintenance mode"}],"source_content_type":"text/x-properties","patch_set":8,"id":"df7087c5_2c984b73","line":255,"range":{"start_line":255,"start_character":20,"end_line":255,"end_character":27},"updated":"2018-03-22 12:36:59.000000000","message":"complete","commit_id":"800d781df4e1a335fefd7c43194097c5d3ac82e8"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"1417f6fcf8b7448be26af8da9bea9ff8461dd182","unresolved":false,"context_lines":[{"line_number":252,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":253,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":254,"context_line":"driver-impl-libvirt-vz-ct\u003dcomplete"},{"line_number":255,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"[operation.maintenance-mode]"},{"line_number":258,"context_line":"title\u003dSet the host in a maintenance mode"}],"source_content_type":"text/x-properties","patch_set":8,"id":"df7087c5_12048217","line":255,"range":{"start_line":255,"start_character":20,"end_line":255,"end_character":27},"in_reply_to":"df7087c5_2c984b73","updated":"2018-03-22 14:08:32.000000000","message":"Done","commit_id":"800d781df4e1a335fefd7c43194097c5d3ac82e8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"10abe5ddcb78e676fa3368155f2a7127a829b010","unresolved":false,"context_lines":[{"line_number":208,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":209,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":210,"context_line":"driver-impl-libvirt-vz-ct\u003dcomplete"},{"line_number":211,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"[operation.attach-tagged-interface]"},{"line_number":214,"context_line":"title\u003dAttach tagged virtual network interface to instance"}],"source_content_type":"text/x-properties","patch_set":9,"id":"bf659307_23d2e35d","line":211,"updated":"2018-03-26 20:14:36.000000000","message":"Should probably have a matching feature release note.","commit_id":"3b0748091900f38ab288398b1a515a643a1ac374"}],"nova/tests/unit/virt/powervm/tasks/test_vm.py":[{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"7ae61bbe194edfbb46d70a888bfb0d075a9cee1d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.apt \u003d mock.Mock()"},{"line_number":29,"context_line":"        self.instance \u003d mock.Mock()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @mock.patch(\u0027nova.virt.powervm.vm.get_instance_wrapper\u0027, autospec\u003dTrue)"},{"line_number":32,"context_line":"    def test_get(self, mock_get_wrap):"},{"line_number":33,"context_line":"        get \u003d tf_vm.Get(self.apt, self.instance)"},{"line_number":34,"context_line":"        get.execute()"},{"line_number":35,"context_line":"        mock_get_wrap.assert_called_once_with(self.apt, self.instance)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @mock.patch(\u0027pypowervm.tasks.storage.add_lpar_storage_scrub_tasks\u0027,"},{"line_number":38,"context_line":"                autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_10750232","line":35,"range":{"start_line":31,"start_character":0,"end_line":35,"end_character":70},"updated":"2018-02-23 17:21:39.000000000","message":"Test taskflow instantiation as in\nhttps://review.openstack.org/#/c/543571/","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"e2b649c7401374ddd439a9badf59d097ef898e79","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.apt \u003d mock.Mock()"},{"line_number":29,"context_line":"        self.instance \u003d mock.Mock()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @mock.patch(\u0027nova.virt.powervm.vm.get_instance_wrapper\u0027, autospec\u003dTrue)"},{"line_number":32,"context_line":"    def test_get(self, mock_get_wrap):"},{"line_number":33,"context_line":"        get \u003d tf_vm.Get(self.apt, self.instance)"},{"line_number":34,"context_line":"        get.execute()"},{"line_number":35,"context_line":"        mock_get_wrap.assert_called_once_with(self.apt, self.instance)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @mock.patch(\u0027pypowervm.tasks.storage.add_lpar_storage_scrub_tasks\u0027,"},{"line_number":38,"context_line":"                autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_c15b2f1f","line":35,"range":{"start_line":31,"start_character":0,"end_line":35,"end_character":70},"in_reply_to":"3fa0c359_10750232","updated":"2018-02-26 16:30:06.000000000","message":"Done","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"}],"nova/tests/unit/virt/powervm/test_driver.py":[{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ccf6f3c8ab2ba47f866254abe37426c18766eba","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertFalse(self.drv.capabilities[\u0027supports_recreate\u0027])"},{"line_number":62,"context_line":"        self.assertFalse("},{"line_number":63,"context_line":"            self.drv.capabilities[\u0027supports_migrate_to_same_host\u0027])"},{"line_number":64,"context_line":"        self.assertFalse(self.drv.capabilities[\u0027supports_attach_interface\u0027])"},{"line_number":65,"context_line":"        self.assertFalse(self.drv.capabilities[\u0027supports_device_tagging\u0027])"},{"line_number":66,"context_line":"        self.assertFalse("},{"line_number":67,"context_line":"            self.drv.capabilities[\u0027supports_tagged_attach_interface\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_b343f56b","line":64,"range":{"start_line":64,"start_character":13,"end_line":64,"end_character":24},"updated":"2018-02-23 21:32:13.000000000","message":"assertTrue","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"e2b649c7401374ddd439a9badf59d097ef898e79","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertFalse(self.drv.capabilities[\u0027supports_recreate\u0027])"},{"line_number":62,"context_line":"        self.assertFalse("},{"line_number":63,"context_line":"            self.drv.capabilities[\u0027supports_migrate_to_same_host\u0027])"},{"line_number":64,"context_line":"        self.assertFalse(self.drv.capabilities[\u0027supports_attach_interface\u0027])"},{"line_number":65,"context_line":"        self.assertFalse(self.drv.capabilities[\u0027supports_device_tagging\u0027])"},{"line_number":66,"context_line":"        self.assertFalse("},{"line_number":67,"context_line":"            self.drv.capabilities[\u0027supports_tagged_attach_interface\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_a1b5c333","line":64,"range":{"start_line":64,"start_character":13,"end_line":64,"end_character":24},"in_reply_to":"3fa0c359_b343f56b","updated":"2018-02-26 16:30:06.000000000","message":"Done","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ee010d3df6eddc315635a4d1d3eaac01b98c7e5","unresolved":false,"context_lines":[{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # InstanceNotFound and generic exception both raise"},{"line_number":347,"context_line":"        mock_tf_run.side_effect \u003d exception.InstanceNotFound"},{"line_number":348,"context_line":"        self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":349,"context_line":"                         self.drv.plug_vifs, mock_inst, \u0027net_info\u0027)"},{"line_number":350,"context_line":"        mock_tf_run.side_effect \u003d Exception"},{"line_number":351,"context_line":"        self.assertRaises(exception.VirtualInterfacePlugException,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_43303757","line":348,"updated":"2018-03-26 20:30:56.000000000","message":"Assert this one has a specific message? Otherwise this isn\u0027t testing that this error is handled specifically, i.e. use:\n\nex \u003d self.assertRaises(exception.VirtualInterfacePlugException, ...)\nself.assertIn(\u0027Plug vif failed because instance\u0027, six.text_type(ex))","commit_id":"3b0748091900f38ab288398b1a515a643a1ac374"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"380f072cb069aa2c6a2833b7c6f193b88b23d7d8","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        mock_tf.return_value.add.assert_has_calls(add_calls)"},{"line_number":343,"context_line":"        mock_tf_run.assert_called_once_with("},{"line_number":344,"context_line":"            mock_tf.return_value, instance\u003dmock_inst)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # InstanceNotFound and generic exception both raise"},{"line_number":347,"context_line":"        mock_tf_run.side_effect \u003d exception.InstanceNotFound"},{"line_number":348,"context_line":"        self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":349,"context_line":"                         self.drv.plug_vifs, mock_inst, \u0027net_info\u0027)"},{"line_number":350,"context_line":"        mock_tf_run.side_effect \u003d Exception"},{"line_number":351,"context_line":"        self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":352,"context_line":"                         self.drv.plug_vifs, mock_inst, \u0027net_info\u0027)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    @mock.patch(\u0027nova.virt.powervm.tasks.base.run\u0027, autospec\u003dTrue)"},{"line_number":355,"context_line":"    @mock.patch(\u0027nova.virt.powervm.tasks.network.UnplugVifs\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_5a3271f3","line":352,"range":{"start_line":345,"start_character":0,"end_line":352,"end_character":67},"updated":"2018-03-26 05:26:50.000000000","message":"nit, can consider to split negative test cases to make it more clear","commit_id":"3b0748091900f38ab288398b1a515a643a1ac374"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"6a5cc44772416190442014161e1686b2e12f9041","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            mock_tf.return_value, instance\u003dmock_inst)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # InstanceNotFound and generic exception both raise"},{"line_number":348,"context_line":"        mock_tf_run.side_effect \u003d exception.InstanceNotFound"},{"line_number":349,"context_line":"        exc \u003d self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":350,"context_line":"                                self.drv.plug_vifs, mock_inst, \u0027net_info\u0027)"},{"line_number":351,"context_line":"        self.assertIn(\u0027instance\u0027, six.text_type(exc))"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_4e756531","line":348,"updated":"2018-03-29 12:11:34.000000000","message":"InstanceNotFound requires instance_id arg. This is causing tox to fail.","commit_id":"cdfb477934b69d533f842d550f99a496a94252b4"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"6a5cc44772416190442014161e1686b2e12f9041","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        mock_tf_run.side_effect \u003d exception.InstanceNotFound"},{"line_number":349,"context_line":"        exc \u003d self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":350,"context_line":"                                self.drv.plug_vifs, mock_inst, \u0027net_info\u0027)"},{"line_number":351,"context_line":"        self.assertIn(\u0027instance\u0027, six.text_type(exc))"},{"line_number":352,"context_line":"        mock_tf_run.side_effect \u003d Exception"},{"line_number":353,"context_line":"        exc \u003d self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":354,"context_line":"                                self.drv.plug_vifs, mock_inst, \u0027net_info\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_6e4f0934","line":351,"updated":"2018-03-29 12:11:34.000000000","message":"I\u0027d like to see this check for more than the single word \"instance\".","commit_id":"cdfb477934b69d533f842d550f99a496a94252b4"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c7b05deea91ee0f86de10571cd655ba8fdc7036b","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            mock_tf.return_value, instance\u003dmock_inst)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # InstanceNotFound and generic exception both raise"},{"line_number":348,"context_line":"        mock_tf_run.side_effect \u003d exception.InstanceNotFound(\u0027id\u0027)"},{"line_number":349,"context_line":"        exc \u003d self.assertRaises(exception.VirtualInterfacePlugException,"},{"line_number":350,"context_line":"                                self.drv.plug_vifs, mock_inst, \u0027net_info\u0027)"},{"line_number":351,"context_line":"        self.assertIn(\u0027instance\u0027, six.text_type(exc))"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_e902336f","line":348,"updated":"2018-03-29 13:14:45.000000000","message":"At least it was the test that was broken, not the code :)","commit_id":"ed525cc403d98e26d4c88fdc00d476ada1eb9ced"}],"nova/virt/powervm/driver.py":[{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"3652d09ba1cbbb35a8938d56ebd77346b7da0c2b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \"has_imagecache\": False,"},{"line_number":57,"context_line":"        \"supports_recreate\": False,"},{"line_number":58,"context_line":"        \"supports_migrate_to_same_host\": False,"},{"line_number":59,"context_line":"        \"supports_attach_interface\": True,"},{"line_number":60,"context_line":"        \"supports_device_tagging\": False,"},{"line_number":61,"context_line":"        \"supports_tagged_attach_interface\": False,"},{"line_number":62,"context_line":"        \"supports_tagged_attach_volume\": False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_587e65af","line":59,"updated":"2018-02-22 23:50:54.000000000","message":"let\u0027s rebase this onto https://review.openstack.org/#/c/547169/","commit_id":"e2d46b044009dbb5670ca52d41b187352d2f8d37"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"8e3cfde3491bf1b9b0576ce0775280e3dde36658","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \"has_imagecache\": False,"},{"line_number":57,"context_line":"        \"supports_recreate\": False,"},{"line_number":58,"context_line":"        \"supports_migrate_to_same_host\": False,"},{"line_number":59,"context_line":"        \"supports_attach_interface\": True,"},{"line_number":60,"context_line":"        \"supports_device_tagging\": False,"},{"line_number":61,"context_line":"        \"supports_tagged_attach_interface\": False,"},{"line_number":62,"context_line":"        \"supports_tagged_attach_volume\": False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_1cb6833f","line":59,"in_reply_to":"3fa0c359_587e65af","updated":"2018-02-23 14:44:04.000000000","message":"Done","commit_id":"e2d46b044009dbb5670ca52d41b187352d2f8d37"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ccf6f3c8ab2ba47f866254abe37426c18766eba","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            \u0027has_imagecache\u0027: False,"},{"line_number":60,"context_line":"            \u0027supports_recreate\u0027: False,"},{"line_number":61,"context_line":"            \u0027supports_migrate_to_same_host\u0027: False,"},{"line_number":62,"context_line":"            \u0027supports_attach_interface\u0027: False,"},{"line_number":63,"context_line":"            \u0027supports_device_tagging\u0027: False,"},{"line_number":64,"context_line":"            \u0027supports_tagged_attach_interface\u0027: False,"},{"line_number":65,"context_line":"            \u0027supports_tagged_attach_volume\u0027: False,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_13518936","line":62,"range":{"start_line":62,"start_character":41,"end_line":62,"end_character":46},"updated":"2018-02-23 21:32:13.000000000","message":"need to flip this to True","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"e2b649c7401374ddd439a9badf59d097ef898e79","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            \u0027has_imagecache\u0027: False,"},{"line_number":60,"context_line":"            \u0027supports_recreate\u0027: False,"},{"line_number":61,"context_line":"            \u0027supports_migrate_to_same_host\u0027: False,"},{"line_number":62,"context_line":"            \u0027supports_attach_interface\u0027: False,"},{"line_number":63,"context_line":"            \u0027supports_device_tagging\u0027: False,"},{"line_number":64,"context_line":"            \u0027supports_tagged_attach_interface\u0027: False,"},{"line_number":65,"context_line":"            \u0027supports_tagged_attach_volume\u0027: False,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_e1af4be0","line":62,"range":{"start_line":62,"start_character":41,"end_line":62,"end_character":46},"in_reply_to":"3fa0c359_13518936","updated":"2018-02-26 16:30:06.000000000","message":"Done","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ee010d3df6eddc315635a4d1d3eaac01b98c7e5","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        flow \u003d tf_lf.Flow(\"plug_vifs\")"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        # Get the LPAR Wrapper"},{"line_number":361,"context_line":"        flow.add(tf_vm.Get(self.adapter, instance))"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"        # Run the attach"},{"line_number":364,"context_line":"        flow.add(tf_net.PlugVifs(self.virtapi, self.adapter, instance,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_23d3c33a","line":361,"updated":"2018-03-26 20:30:56.000000000","message":"So the output of this is input to the PlugVifs flow?","commit_id":"3b0748091900f38ab288398b1a515a643a1ac374"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c7b05deea91ee0f86de10571cd655ba8fdc7036b","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        flow \u003d tf_lf.Flow(\"plug_vifs\")"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        # Get the LPAR Wrapper"},{"line_number":361,"context_line":"        flow.add(tf_vm.Get(self.adapter, instance))"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"        # Run the attach"},{"line_number":364,"context_line":"        flow.add(tf_net.PlugVifs(self.virtapi, self.adapter, instance,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_c2115606","line":361,"in_reply_to":"bf659307_23d3c33a","updated":"2018-03-29 13:14:45.000000000","message":"Right, Get.__init__ does its super() call with provides\u003d[\u0027lpar_wrap\u0027]; PlugVifs.__init__ does its super() call with requires\u003d[\u0027lpar_wrap\u0027].  Taskflow uses the latter to grab the return value from the former\u0027s execute() and stuffs it into the param list of the latter\u0027s execute().","commit_id":"3b0748091900f38ab288398b1a515a643a1ac374"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ee010d3df6eddc315635a4d1d3eaac01b98c7e5","unresolved":false,"context_lines":[{"line_number":373,"context_line":"                % instance.name)"},{"line_number":374,"context_line":"        except Exception:"},{"line_number":375,"context_line":"            LOG.exception(\"PowerVM error plugging vifs.\", instance\u003dinstance)"},{"line_number":376,"context_line":"            raise exc.VirtualInterfacePlugException("},{"line_number":377,"context_line":"                _(\"Plug vif failed because of an unexpected error.\"))"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def unplug_vifs(self, instance, network_info):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_43a6f7c3","line":376,"range":{"start_line":376,"start_character":22,"end_line":376,"end_character":51},"updated":"2018-03-26 20:30:56.000000000","message":"I was thinking maybe this should be VirtualInterfaceCreateException but it doesn\u0027t matter much, this is going to result in a 500 from the REST API either way (it\u0027s an RPC call from API to compute for attaching network interfaces).","commit_id":"3b0748091900f38ab288398b1a515a643a1ac374"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ee010d3df6eddc315635a4d1d3eaac01b98c7e5","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        flow \u003d tf_lf.Flow(\"unplug_vifs\")"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        # Run the detach"},{"line_number":387,"context_line":"        flow.add(tf_net.UnplugVifs(self.adapter, instance, network_info))"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        # Run the flow"},{"line_number":390,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_63c53b3c","line":387,"updated":"2018-03-26 20:30:56.000000000","message":"OK I guess this doesn\u0027t need:\n\n  flow.add(tf_vm.Get(self.adapter, instance))\n\nBecause that\u0027s already built into the UnplugVifs flow. Nice that these are consistent...\n\nhttps://github.com/openstack/nova/blob/1fb0d34ec472165a923ff7747c2b2eb528f83085/nova/virt/powervm/tasks/network.py#L188","commit_id":"3b0748091900f38ab288398b1a515a643a1ac374"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c7b05deea91ee0f86de10571cd655ba8fdc7036b","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        flow \u003d tf_lf.Flow(\"unplug_vifs\")"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        # Run the detach"},{"line_number":387,"context_line":"        flow.add(tf_net.UnplugVifs(self.adapter, instance, network_info))"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        # Run the flow"},{"line_number":390,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_02c3ce5e","line":387,"in_reply_to":"bf659307_63c53b3c","updated":"2018-03-29 13:14:45.000000000","message":"They\u0027re different because the lpar_wrap value is also used in PlugMgmtVif in the config drive flow.  UnplugVifs doesn\u0027t share with anyone, so it can do it locally and save some paperwork.  But yeah, consistency might be nice.","commit_id":"3b0748091900f38ab288398b1a515a643a1ac374"}],"nova/virt/powervm/tasks/network.py":[{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4fbbb7d3769775de1a2c541077e6850b8e488f06","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        super(UnplugVifs, self).__init__(name\u003d\u0027unplug_vifs\u0027)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def execute(self):"},{"line_number":186,"context_line":"        lpar_wrap \u003d vm.get_instance_wrapper(self.adapter, self.instance)"},{"line_number":187,"context_line":"        # If the LPAR is not in an OK state for deleting, then throw an"},{"line_number":188,"context_line":"        # error up front."},{"line_number":189,"context_line":"        modifiable, reason \u003d lpar_wrap.can_modify_io()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_2a86bfba","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":72},"updated":"2018-02-21 23:42:40.000000000","message":"Put this back","commit_id":"d60a2b5a0bf4efe3343683c6f7a0277e55a1ffed"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"6a585a99b8f2764f1633128af3f6ff553bf79347","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # Cache of CNAs that is filled on initial _vif_exists() call."},{"line_number":59,"context_line":"        self.cnas \u003d None"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        super(PlugVifs, self).__init__(name\u003d\u0027plug_vifs\u0027, provides\u003d\u0027vm_cnas\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _vif_exists(self, network_info):"},{"line_number":64,"context_line":"        \"\"\"Does the instance have a CNA for a given net?"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_bc844b5f","line":61,"updated":"2018-02-22 14:20:44.000000000","message":"removing the lpar_wrap requirement here is going to change the create flow, adding an unnecessary call to vm.get_instance_wrapper. Why are we doing this, over just adding a tf_vm.GET to the new attach flow?","commit_id":"12ad3a7b94403a11034f16c1009ab2b1112f1f55"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"6a585a99b8f2764f1633128af3f6ff553bf79347","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        super(UnplugVifs, self).__init__(name\u003d\u0027unplug_vifs\u0027)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def execute(self):"},{"line_number":186,"context_line":"        lpar_wrap \u003d vm.get_instance_wrapper(self.adapter, self.instance)"},{"line_number":187,"context_line":"        # If the LPAR is not in an OK state for deleting, then throw an"},{"line_number":188,"context_line":"        # error up front."},{"line_number":189,"context_line":"        modifiable, reason \u003d lpar_wrap.can_modify_io()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_f12afc8e","line":186,"updated":"2018-02-22 14:20:44.000000000","message":"unnecessary move of this line. It is odd that this line is here at all, rather than requires\u003d[\u0027lpar_wrap\u0027] like we have for PlugVifs, but I\u0027m not sure we want to bite that off in this change.","commit_id":"12ad3a7b94403a11034f16c1009ab2b1112f1f55"}],"nova/virt/powervm/tasks/vm.py":[{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"3652d09ba1cbbb35a8938d56ebd77346b7da0c2b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \"\"\"Creates the Task for getting a VM entry."},{"line_number":33,"context_line":"        Provides the \u0027lpar_wrap\u0027 for other tasks."},{"line_number":34,"context_line":"        :param adapter: The adapter for the pypowervm API"},{"line_number":35,"context_line":"        :param host_uuid: The host UUID"},{"line_number":36,"context_line":"        :param instance: The nova instance."},{"line_number":37,"context_line":"        \"\"\""},{"line_number":38,"context_line":"        super(Get, self).__init__(\u0027get_vm\u0027, provides\u003d\u0027lpar_wrap\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_e7b8f475","line":35,"updated":"2018-02-22 23:50:54.000000000","message":"no such param","commit_id":"e2d46b044009dbb5670ca52d41b187352d2f8d37"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"8e3cfde3491bf1b9b0576ce0775280e3dde36658","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \"\"\"Creates the Task for getting a VM entry."},{"line_number":33,"context_line":"        Provides the \u0027lpar_wrap\u0027 for other tasks."},{"line_number":34,"context_line":"        :param adapter: The adapter for the pypowervm API"},{"line_number":35,"context_line":"        :param host_uuid: The host UUID"},{"line_number":36,"context_line":"        :param instance: The nova instance."},{"line_number":37,"context_line":"        \"\"\""},{"line_number":38,"context_line":"        super(Get, self).__init__(\u0027get_vm\u0027, provides\u003d\u0027lpar_wrap\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_5c996bc1","line":35,"in_reply_to":"3fa0c359_e7b8f475","updated":"2018-02-23 14:44:04.000000000","message":"Done","commit_id":"e2d46b044009dbb5670ca52d41b187352d2f8d37"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"987473ebbe71a5fa820384ebf62e1c411624b748","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        :param adapter: The adapter for the pypowervm API"},{"line_number":35,"context_line":"        :param instance: The nova instance."},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        super(Get, self).__init__(\u0027get_vm\u0027, provides\u003d\u0027lpar_wrap\u0027)"},{"line_number":38,"context_line":"        self.adapter \u003d adapter"},{"line_number":39,"context_line":"        self.instance \u003d instance"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_bd5746ca","line":37,"range":{"start_line":37,"start_character":34,"end_line":37,"end_character":42},"updated":"2018-02-23 18:30:31.000000000","message":"name kwarg","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"e2b649c7401374ddd439a9badf59d097ef898e79","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        :param adapter: The adapter for the pypowervm API"},{"line_number":35,"context_line":"        :param instance: The nova instance."},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        super(Get, self).__init__(\u0027get_vm\u0027, provides\u003d\u0027lpar_wrap\u0027)"},{"line_number":38,"context_line":"        self.adapter \u003d adapter"},{"line_number":39,"context_line":"        self.instance \u003d instance"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_817a0785","line":37,"range":{"start_line":37,"start_character":34,"end_line":37,"end_character":42},"in_reply_to":"3fa0c359_bd5746ca","updated":"2018-02-26 16:30:06.000000000","message":"Done","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ccf6f3c8ab2ba47f866254abe37426c18766eba","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        :param adapter: The adapter for the pypowervm API"},{"line_number":35,"context_line":"        :param instance: The nova instance."},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        super(Get, self).__init__(\u0027get_vm\u0027, provides\u003d\u0027lpar_wrap\u0027)"},{"line_number":38,"context_line":"        self.adapter \u003d adapter"},{"line_number":39,"context_line":"        self.instance \u003d instance"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_5352b136","line":37,"range":{"start_line":37,"start_character":34,"end_line":37,"end_character":42},"in_reply_to":"3fa0c359_bd5746ca","updated":"2018-02-23 21:32:13.000000000","message":"yup, good catch","commit_id":"99dae36d9abea5aadb173258eacc931ae7e96cec"}]}
