diff --git a/ironic_lib/disk_utils.py b/ironic_lib/disk_utils.py index 3a7e4b9..366b8bc 100644 --- a/ironic_lib/disk_utils.py +++ b/ironic_lib/disk_utils.py @@ -316,10 +316,19 @@ def destroy_disk_metadata(dev, node_uuid): # https://bugs.launchpad.net/ironic/+bug/1317647 LOG.debug("Start destroy disk metadata for node %(node)s.", {'node': node_uuid}) - utils.execute('wipefs', '--all', dev, - run_as_root=True, - check_exit_code=[0], - use_standard_locale=True) + try: + utils.execute('wipefs', '--force', '--all', dev, + run_as_root=True, + use_standard_locale=True) + except processutils.ProcessExecutionError as e: + # NOTE(zhenguo): Check if --force option is supported for wipefs, + # if not, we should try without it. + if '--force' in str(e): + utils.execute('wipefs', '--all', dev, + run_as_root=True, + use_standard_locale=True) + else: + raise e LOG.info(_LI("Disk metadata on %(dev)s successfully destroyed for node " "%(node)s"), {'dev': dev, 'node': node_uuid}) diff --git a/ironic_lib/tests/test_disk_utils.py b/ironic_lib/tests/test_disk_utils.py index 5ec0e4c..3b87f3a 100644 --- a/ironic_lib/tests/test_disk_utils.py +++ b/ironic_lib/tests/test_disk_utils.py @@ -350,9 +350,8 @@ class DestroyMetaDataTestCase(test_base.BaseTestCase): self.node_uuid = "12345678-1234-1234-1234-1234567890abcxyz" def test_destroy_disk_metadata(self, mock_exec): - expected_calls = [mock.call('wipefs', '--all', 'fake-dev', + expected_calls = [mock.call('wipefs', '--force', '--all', 'fake-dev', run_as_root=True, - check_exit_code=[0], use_standard_locale=True)] disk_utils.destroy_disk_metadata(self.dev, self.node_uuid) mock_exec.assert_has_calls(expected_calls) @@ -360,9 +359,8 @@ class DestroyMetaDataTestCase(test_base.BaseTestCase): def test_destroy_disk_metadata_wipefs_fail(self, mock_exec): mock_exec.side_effect = processutils.ProcessExecutionError - expected_call = [mock.call('wipefs', '--all', 'fake-dev', + expected_call = [mock.call('wipefs', '--force', '--all', 'fake-dev', run_as_root=True, - check_exit_code=[0], use_standard_locale=True)] self.assertRaises(processutils.ProcessExecutionError, disk_utils.destroy_disk_metadata, @@ -370,6 +368,20 @@ class DestroyMetaDataTestCase(test_base.BaseTestCase): self.node_uuid) mock_exec.assert_has_calls(expected_call) + def test_destroy_disk_metadata_wipefs_not_support_force(self, mock_exec): + mock_exec.side_effect = iter( + [processutils.ProcessExecutionError(description='--force'), + (None, None)]) + + expected_call = [mock.call('wipefs', '--force', '--all', 'fake-dev', + run_as_root=True, + use_standard_locale=True), + mock.call('wipefs', '--all', 'fake-dev', + run_as_root=True, + use_standard_locale=True)] + disk_utils.destroy_disk_metadata(self.dev, self.node_uuid) + mock_exec.assert_has_calls(expected_call) + @mock.patch.object(utils, 'execute') class GetDeviceBlockSizeTestCase(test_base.BaseTestCase):