)]}'
{"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05b292910bd7d34bbae366293687557ad8baedca","unresolved":false,"context_lines":[{"line_number":2002,"context_line":"        mock_required_by.return_value \u003d False"},{"line_number":2003,"context_line":"        self._test_rebuild(preserve\u003dTrue)"},{"line_number":2004,"context_line":"        # assert configdrive was not generated"},{"line_number":2005,"context_line":"        self.assertFalse(mock_configdrive.called)"},{"line_number":2006,"context_line":""},{"line_number":2007,"context_line":"    @mock.patch.object(ironic_driver.IronicDriver, \u0027_generate_configdrive\u0027)"},{"line_number":2008,"context_line":"    @mock.patch.object(configdrive, \u0027required_by\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_0d4844ca","line":2005,"updated":"2017-11-20 22:31:56.000000000","message":"nit: mock_configdrive.assert_not_called() gives a slightly better error message if this assertion fails (instead of \"False is not True\").","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0a833cf36327d99b9d58df3dbbbe7c7f4b72ed3c","unresolved":false,"context_lines":[{"line_number":2002,"context_line":"        mock_required_by.return_value \u003d False"},{"line_number":2003,"context_line":"        self._test_rebuild(preserve\u003dTrue)"},{"line_number":2004,"context_line":"        # assert configdrive was not generated"},{"line_number":2005,"context_line":"        self.assertFalse(mock_configdrive.called)"},{"line_number":2006,"context_line":""},{"line_number":2007,"context_line":"    @mock.patch.object(ironic_driver.IronicDriver, \u0027_generate_configdrive\u0027)"},{"line_number":2008,"context_line":"    @mock.patch.object(configdrive, \u0027required_by\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_01fd6b39","line":2005,"in_reply_to":"ff82abbf_0d4844ca","updated":"2017-11-21 02:29:19.000000000","message":"Done","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d9a3c93854c4c0aae2c697550688e3143a3ee5ad","unresolved":false,"context_lines":[{"line_number":2048,"context_line":"    def test_rebuild_no_preserve_ephemeral(self, mock_required_by,"},{"line_number":2049,"context_line":"                                           mock_configdrive):"},{"line_number":2050,"context_line":"        mock_required_by.return_value \u003d False"},{"line_number":2051,"context_line":"        self._test_rebuild(preserve\u003dFalse)"},{"line_number":2052,"context_line":""},{"line_number":2053,"context_line":"    @mock.patch.object(ironic_driver.IronicDriver, \u0027_generate_configdrive\u0027)"},{"line_number":2054,"context_line":"    @mock.patch.object(configdrive, \u0027required_by\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_1ba76c0d","line":2051,"updated":"2017-11-28 18:20:40.000000000","message":"Looks like we could assert the configdrive wasn\u0027t generated here too, like on L2044. It threw me off for a sec not to see it, thinking maybe preserve\u003dFalse was expected to call _generate_configdrive.","commit_id":"878c44f0cff4f11b2a01e60019d79ccf5e5d707a"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05b292910bd7d34bbae366293687557ad8baedca","unresolved":false,"context_lines":[{"line_number":1070,"context_line":"                           \u0027node\u0027: node_uuid})"},{"line_number":1071,"context_line":"                self._cleanup_deploy(node, instance, network_info)"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        # Config drive"},{"line_number":1074,"context_line":"        configdrive_value \u003d None"},{"line_number":1075,"context_line":"        if configdrive.required_by(instance):"},{"line_number":1076,"context_line":"            extra_md \u003d {}"},{"line_number":1077,"context_line":"            if admin_password:"},{"line_number":1078,"context_line":"                extra_md[\u0027admin_pass\u0027] \u003d admin_password"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"            try:"},{"line_number":1081,"context_line":"                configdrive_value \u003d self._generate_configdrive("},{"line_number":1082,"context_line":"                    context, instance, node, network_info, extra_md\u003dextra_md,"},{"line_number":1083,"context_line":"                    files\u003dinjected_files)"},{"line_number":1084,"context_line":"            except Exception as e:"},{"line_number":1085,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":1086,"context_line":"                    msg \u003d (\"Failed to build configdrive: %s\" %"},{"line_number":1087,"context_line":"                           six.text_type(e))"},{"line_number":1088,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":1089,"context_line":"                    self._cleanup_deploy(node, instance, network_info)"},{"line_number":1090,"context_line":""},{"line_number":1091,"context_line":"            LOG.info(\"Config drive for instance %(instance)s on \""},{"line_number":1092,"context_line":"                     \"baremetal node %(node)s created.\","},{"line_number":1093,"context_line":"                     {\u0027instance\u0027: instance[\u0027uuid\u0027], \u0027node\u0027: node_uuid})"},{"line_number":1094,"context_line":""},{"line_number":1095,"context_line":"        # trigger the node deploy"},{"line_number":1096,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_4d55ec4f","line":1093,"range":{"start_line":1073,"start_character":8,"end_line":1093,"end_character":71},"updated":"2017-11-20 22:31:56.000000000","message":"Your new code is totally duplicated with this, can we at least pull this into a private method and call it from both places?","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e344e131d0f1e031012daf53d425ef3c4c1b8c7a","unresolved":false,"context_lines":[{"line_number":1070,"context_line":"                           \u0027node\u0027: node_uuid})"},{"line_number":1071,"context_line":"                self._cleanup_deploy(node, instance, network_info)"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        # Config drive"},{"line_number":1074,"context_line":"        configdrive_value \u003d None"},{"line_number":1075,"context_line":"        if configdrive.required_by(instance):"},{"line_number":1076,"context_line":"            extra_md \u003d {}"},{"line_number":1077,"context_line":"            if admin_password:"},{"line_number":1078,"context_line":"                extra_md[\u0027admin_pass\u0027] \u003d admin_password"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"            try:"},{"line_number":1081,"context_line":"                configdrive_value \u003d self._generate_configdrive("},{"line_number":1082,"context_line":"                    context, instance, node, network_info, extra_md\u003dextra_md,"},{"line_number":1083,"context_line":"                    files\u003dinjected_files)"},{"line_number":1084,"context_line":"            except Exception as e:"},{"line_number":1085,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":1086,"context_line":"                    msg \u003d (\"Failed to build configdrive: %s\" %"},{"line_number":1087,"context_line":"                           six.text_type(e))"},{"line_number":1088,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":1089,"context_line":"                    self._cleanup_deploy(node, instance, network_info)"},{"line_number":1090,"context_line":""},{"line_number":1091,"context_line":"            LOG.info(\"Config drive for instance %(instance)s on \""},{"line_number":1092,"context_line":"                     \"baremetal node %(node)s created.\","},{"line_number":1093,"context_line":"                     {\u0027instance\u0027: instance[\u0027uuid\u0027], \u0027node\u0027: node_uuid})"},{"line_number":1094,"context_line":""},{"line_number":1095,"context_line":"        # trigger the node deploy"},{"line_number":1096,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_ca130c0d","line":1093,"range":{"start_line":1073,"start_character":8,"end_line":1093,"end_character":71},"in_reply_to":"ff82abbf_21566f2b","updated":"2017-11-21 14:50:32.000000000","message":"Based on whether or not you call _cleanup_deploy in the rebuild case probably determines if we can consolidate this code.","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0a833cf36327d99b9d58df3dbbbe7c7f4b72ed3c","unresolved":false,"context_lines":[{"line_number":1070,"context_line":"                           \u0027node\u0027: node_uuid})"},{"line_number":1071,"context_line":"                self._cleanup_deploy(node, instance, network_info)"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        # Config drive"},{"line_number":1074,"context_line":"        configdrive_value \u003d None"},{"line_number":1075,"context_line":"        if configdrive.required_by(instance):"},{"line_number":1076,"context_line":"            extra_md \u003d {}"},{"line_number":1077,"context_line":"            if admin_password:"},{"line_number":1078,"context_line":"                extra_md[\u0027admin_pass\u0027] \u003d admin_password"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"            try:"},{"line_number":1081,"context_line":"                configdrive_value \u003d self._generate_configdrive("},{"line_number":1082,"context_line":"                    context, instance, node, network_info, extra_md\u003dextra_md,"},{"line_number":1083,"context_line":"                    files\u003dinjected_files)"},{"line_number":1084,"context_line":"            except Exception as e:"},{"line_number":1085,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":1086,"context_line":"                    msg \u003d (\"Failed to build configdrive: %s\" %"},{"line_number":1087,"context_line":"                           six.text_type(e))"},{"line_number":1088,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":1089,"context_line":"                    self._cleanup_deploy(node, instance, network_info)"},{"line_number":1090,"context_line":""},{"line_number":1091,"context_line":"            LOG.info(\"Config drive for instance %(instance)s on \""},{"line_number":1092,"context_line":"                     \"baremetal node %(node)s created.\","},{"line_number":1093,"context_line":"                     {\u0027instance\u0027: instance[\u0027uuid\u0027], \u0027node\u0027: node_uuid})"},{"line_number":1094,"context_line":""},{"line_number":1095,"context_line":"        # trigger the node deploy"},{"line_number":1096,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_21566f2b","line":1093,"range":{"start_line":1073,"start_character":8,"end_line":1093,"end_character":71},"in_reply_to":"ff82abbf_4d55ec4f","updated":"2017-11-21 02:29:19.000000000","message":"Most of the logic is already in _generate_configdrive, except error handling and logging. Should the logic be moved into this private method instead?\n\nOtherwise we would just end up with a method with very similar signature which we could be named _generate_configdrive_with_logging_and_error_handling.","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05b292910bd7d34bbae366293687557ad8baedca","unresolved":false,"context_lines":[{"line_number":1517,"context_line":"        :param image_meta: Image object returned by nova.image.glance"},{"line_number":1518,"context_line":"            that defines the image from which to boot this instance. Ignored"},{"line_number":1519,"context_line":"            by this driver."},{"line_number":1520,"context_line":"        :param injected_files: User files to inject into instance. Ignored"},{"line_number":1521,"context_line":"            by this driver."},{"line_number":1522,"context_line":"        :param admin_password: Administrator password to set in"},{"line_number":1523,"context_line":"            instance. Ignored by this driver."},{"line_number":1524,"context_line":"        :param bdms: block-device-mappings to use for rebuild. Ignored"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_cdc6dc17","line":1521,"range":{"start_line":1520,"start_character":67,"end_line":1521,"end_character":27},"updated":"2017-11-20 22:31:56.000000000","message":"This is no longer true.","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0a833cf36327d99b9d58df3dbbbe7c7f4b72ed3c","unresolved":false,"context_lines":[{"line_number":1517,"context_line":"        :param image_meta: Image object returned by nova.image.glance"},{"line_number":1518,"context_line":"            that defines the image from which to boot this instance. Ignored"},{"line_number":1519,"context_line":"            by this driver."},{"line_number":1520,"context_line":"        :param injected_files: User files to inject into instance. Ignored"},{"line_number":1521,"context_line":"            by this driver."},{"line_number":1522,"context_line":"        :param admin_password: Administrator password to set in"},{"line_number":1523,"context_line":"            instance. Ignored by this driver."},{"line_number":1524,"context_line":"        :param bdms: block-device-mappings to use for rebuild. Ignored"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_c19463eb","line":1521,"range":{"start_line":1520,"start_character":67,"end_line":1521,"end_character":27},"in_reply_to":"ff82abbf_cdc6dc17","updated":"2017-11-21 02:29:19.000000000","message":"Done","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05b292910bd7d34bbae366293687557ad8baedca","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"                    msg \u003d (\"Failed to build configdrive: %s\" %"},{"line_number":1568,"context_line":"                           six.text_type(e))"},{"line_number":1569,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":1570,"context_line":"                    self._cleanup_deploy(node, instance, network_info)"},{"line_number":1571,"context_line":""},{"line_number":1572,"context_line":"            LOG.info(\"Config drive for instance %(instance)s on \""},{"line_number":1573,"context_line":"                     \"baremetal node %(node)s created.\","}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_ed99601f","line":1570,"range":{"start_line":1570,"start_character":25,"end_line":1570,"end_character":40},"updated":"2017-11-20 22:31:56.000000000","message":"Is this going to be appropriate for a rebuild? It looks like this is assumed to be called from spawn() and does things like unplugging VIFs and removing volume target info - is that something you should be doing for a failed rebuild?\n\nLooking below, it seems like you should just raise raise exception.InstanceDeployFailure(msg) here.","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0a833cf36327d99b9d58df3dbbbe7c7f4b72ed3c","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"                    msg \u003d (\"Failed to build configdrive: %s\" %"},{"line_number":1568,"context_line":"                           six.text_type(e))"},{"line_number":1569,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":1570,"context_line":"                    self._cleanup_deploy(node, instance, network_info)"},{"line_number":1571,"context_line":""},{"line_number":1572,"context_line":"            LOG.info(\"Config drive for instance %(instance)s on \""},{"line_number":1573,"context_line":"                     \"baremetal node %(node)s created.\","}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_a1a35f4f","line":1570,"range":{"start_line":1570,"start_character":25,"end_line":1570,"end_character":40},"in_reply_to":"ff82abbf_ed99601f","updated":"2017-11-21 02:29:19.000000000","message":"Done","commit_id":"6e5fb9caf5960614b441b00d0c0edffca4cc56ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"321cbd75a201d15e0e79a83d4a34975e9b1ccd69","unresolved":false,"context_lines":[{"line_number":1566,"context_line":"                    msg \u003d (\"Failed to build configdrive: %s\" %"},{"line_number":1567,"context_line":"                           six.text_type(e))"},{"line_number":1568,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":1569,"context_line":"                    exception.InstanceDeployFailure(msg)"},{"line_number":1570,"context_line":""},{"line_number":1571,"context_line":"            LOG.info(\"Config drive for instance %(instance)s on \""},{"line_number":1572,"context_line":"                     \"baremetal node %(node)s created.\","}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_41603aa6","line":1569,"updated":"2017-11-21 19:05:08.000000000","message":"We need a unit test for this failure.","commit_id":"2dc1343edbfaa24fb270d1706efd81190bd852bc"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"d573cd3c8cede4dd8a969c790717fc38a0b9cbe1","unresolved":false,"context_lines":[{"line_number":1566,"context_line":"                    msg \u003d (\"Failed to build configdrive: %s\" %"},{"line_number":1567,"context_line":"                           six.text_type(e))"},{"line_number":1568,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":1569,"context_line":"                    exception.InstanceDeployFailure(msg)"},{"line_number":1570,"context_line":""},{"line_number":1571,"context_line":"            LOG.info(\"Config drive for instance %(instance)s on \""},{"line_number":1572,"context_line":"                     \"baremetal node %(node)s created.\","}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_16b037f4","line":1569,"in_reply_to":"ff82abbf_41603aa6","updated":"2017-11-21 20:29:29.000000000","message":"Done","commit_id":"2dc1343edbfaa24fb270d1706efd81190bd852bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"994d757698bc7d5fcb2c54012fab6a52bc5ebab8","unresolved":false,"context_lines":[{"line_number":1569,"context_line":"                    msg \u003d (\"Failed to build configdrive: %s\" %"},{"line_number":1570,"context_line":"                           six.text_type(e))"},{"line_number":1571,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":1572,"context_line":"                    raise exception.InstanceDeployFailure(msg)"},{"line_number":1573,"context_line":""},{"line_number":1574,"context_line":"            LOG.info(\"Config drive for instance %(instance)s on \""},{"line_number":1575,"context_line":"                     \"baremetal node %(node)s created.\","}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_838b381d","line":1572,"range":{"start_line":1572,"start_character":20,"end_line":1572,"end_character":25},"updated":"2017-11-27 14:03:51.000000000","message":"Good thing for that unit test. :)","commit_id":"878c44f0cff4f11b2a01e60019d79ccf5e5d707a"}],"releasenotes/notes/rebuild-ironic-config-drive-77bea47ad20c105b.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"321cbd75a201d15e0e79a83d4a34975e9b1ccd69","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    Fixes the problem of an old configdrive (used for deploying the node)"},{"line_number":9,"context_line":"    being used again when rebuilding the node. Starting with REST API 1.35,"},{"line_number":10,"context_line":"    it is possible to specify a different configdrive when rebuilding a node."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"ff82abbf_41d35a39","line":10,"range":{"start_line":10,"start_character":22,"end_line":10,"end_character":29},"updated":"2017-11-21 19:05:08.000000000","message":"The user doesn\u0027t really specify a config drive during rebuild, this just changes it so we regenerate a config drive on rebuild, using the provided personality files, metadata, (now) key_name and admin password which can be provided to the rebuild API.\n\n\"Starting with REST API 1.35, it is possible to specify a different configdrive when rebuilding a node.\" is really about the ironic API change, not the nova change.\n\nSo maybe reword to just:\n\n\"Now when you rebuild a baremetal instance, a new config drive will be generated for the node based on the passed in personality files, metadata, admin password, etc.\"","commit_id":"2dc1343edbfaa24fb270d1706efd81190bd852bc"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"d573cd3c8cede4dd8a969c790717fc38a0b9cbe1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    Fixes the problem of an old configdrive (used for deploying the node)"},{"line_number":9,"context_line":"    being used again when rebuilding the node. Starting with REST API 1.35,"},{"line_number":10,"context_line":"    it is possible to specify a different configdrive when rebuilding a node."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"ff82abbf_568f9f29","line":10,"range":{"start_line":10,"start_character":22,"end_line":10,"end_character":29},"in_reply_to":"ff82abbf_41d35a39","updated":"2017-11-21 20:29:29.000000000","message":"Done","commit_id":"2dc1343edbfaa24fb270d1706efd81190bd852bc"}]}
