Allow shred zeroize option to be configured
Introduce a new parameter in driver_internal_info called agent_erase_devices_zeroize to control the behavior of shred. This parameter controls the --zero argument used when invoking shred. Configuring this to false disabled the last pass of zeroes, leaving the device with random data. Change-Id: I7053034f5b5bc6737b535ee601e6fb71284d4a83 Partial-bug: #1568811 Depends-On: Ia7ea8d909df9ae86a6dbd68ba94746b171535eb8
This commit is contained in:
@@ -619,9 +619,15 @@ class GenericHardwareManager(HardwareManager):
|
|||||||
"""
|
"""
|
||||||
info = node.get('driver_internal_info', {})
|
info = node.get('driver_internal_info', {})
|
||||||
npasses = info.get('agent_erase_devices_iterations', 1)
|
npasses = info.get('agent_erase_devices_iterations', 1)
|
||||||
|
args = ('shred', '--force')
|
||||||
|
|
||||||
|
if info.get('agent_erase_devices_zeroize', True):
|
||||||
|
args += ('--zero', )
|
||||||
|
|
||||||
|
args += ('--verbose', '--iterations', str(npasses), block_device.name)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
utils.execute('shred', '--force', '--zero', '--verbose',
|
utils.execute(*args)
|
||||||
'--iterations', str(npasses), block_device.name)
|
|
||||||
except (processutils.ProcessExecutionError, OSError) as e:
|
except (processutils.ProcessExecutionError, OSError) as e:
|
||||||
msg = ("Erasing block device %(dev)s failed with error %(err)s ",
|
msg = ("Erasing block device %(dev)s failed with error %(err)s ",
|
||||||
{'dev': block_device.name, 'err': e})
|
{'dev': block_device.name, 'err': e})
|
||||||
|
@@ -143,7 +143,9 @@ BLK_DEVICE_TEMPLATE_SMALL_DEVICES = [
|
|||||||
vendor="FooTastic"),
|
vendor="FooTastic"),
|
||||||
]
|
]
|
||||||
|
|
||||||
SHRED_OUTPUT = (
|
SHRED_OUTPUT_0_ITERATIONS_ZERO_FALSE = ()
|
||||||
|
|
||||||
|
SHRED_OUTPUT_1_ITERATION_ZERO_TRUE = (
|
||||||
'shred: /dev/sda: pass 1/2 (random)...\n'
|
'shred: /dev/sda: pass 1/2 (random)...\n'
|
||||||
'shred: /dev/sda: pass 1/2 (random)...4.9GiB/29GiB 17%\n'
|
'shred: /dev/sda: pass 1/2 (random)...4.9GiB/29GiB 17%\n'
|
||||||
'shred: /dev/sda: pass 1/2 (random)...15GiB/29GiB 51%\n'
|
'shred: /dev/sda: pass 1/2 (random)...15GiB/29GiB 51%\n'
|
||||||
@@ -156,6 +158,19 @@ SHRED_OUTPUT = (
|
|||||||
'shred: /dev/sda: pass 2/2 (000000)...29GiB/29GiB 100%\n'
|
'shred: /dev/sda: pass 2/2 (000000)...29GiB/29GiB 100%\n'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
SHRED_OUTPUT_2_ITERATIONS_ZERO_FALSE = (
|
||||||
|
'shred: /dev/sda: pass 1/2 (random)...\n'
|
||||||
|
'shred: /dev/sda: pass 1/2 (random)...4.9GiB/29GiB 17%\n'
|
||||||
|
'shred: /dev/sda: pass 1/2 (random)...15GiB/29GiB 51%\n'
|
||||||
|
'shred: /dev/sda: pass 1/2 (random)...20GiB/29GiB 69%\n'
|
||||||
|
'shred: /dev/sda: pass 1/2 (random)...29GiB/29GiB 100%\n'
|
||||||
|
'shred: /dev/sda: pass 2/2 (random)...\n'
|
||||||
|
'shred: /dev/sda: pass 2/2 (random)...4.9GiB/29GiB 17%\n'
|
||||||
|
'shred: /dev/sda: pass 2/2 (random)...15GiB/29GiB 51%\n'
|
||||||
|
'shred: /dev/sda: pass 2/2 (random)...20GiB/29GiB 69%\n'
|
||||||
|
'shred: /dev/sda: pass 2/2 (random)...29GiB/29GiB 100%\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
LSCPU_OUTPUT = """
|
LSCPU_OUTPUT = """
|
||||||
Architecture: x86_64
|
Architecture: x86_64
|
||||||
@@ -659,31 +674,10 @@ class TestGenericHardwareManager(test_base.BaseTestCase):
|
|||||||
@mock.patch.object(utils, 'execute')
|
@mock.patch.object(utils, 'execute')
|
||||||
def test_erase_block_device_nosecurity_shred(self, mocked_execute):
|
def test_erase_block_device_nosecurity_shred(self, mocked_execute):
|
||||||
hdparm_output = HDPARM_INFO_TEMPLATE.split('\nSecurity:')[0]
|
hdparm_output = HDPARM_INFO_TEMPLATE.split('\nSecurity:')[0]
|
||||||
info = self.node.get('driver_internal_info')
|
|
||||||
info['agent_erase_devices_iterations'] = 2
|
|
||||||
|
|
||||||
mocked_execute.side_effect = [
|
mocked_execute.side_effect = [
|
||||||
(hdparm_output, ''),
|
(hdparm_output, ''),
|
||||||
(SHRED_OUTPUT, '')
|
(SHRED_OUTPUT_1_ITERATION_ZERO_TRUE, '')
|
||||||
]
|
|
||||||
|
|
||||||
block_device = hardware.BlockDevice('/dev/sda', 'big', 1073741824,
|
|
||||||
True)
|
|
||||||
self.hardware.erase_block_device(self.node, block_device)
|
|
||||||
mocked_execute.assert_has_calls([
|
|
||||||
mock.call('hdparm', '-I', '/dev/sda'),
|
|
||||||
mock.call('shred', '--force', '--zero', '--verbose',
|
|
||||||
'--iterations', '2', '/dev/sda')
|
|
||||||
])
|
|
||||||
|
|
||||||
@mock.patch.object(utils, 'execute')
|
|
||||||
def test_erase_block_device_notsupported_shred(self, mocked_execute):
|
|
||||||
hdparm_output = create_hdparm_info(
|
|
||||||
supported=False, enabled=False, frozen=False, enhanced_erase=False)
|
|
||||||
|
|
||||||
mocked_execute.side_effect = [
|
|
||||||
(hdparm_output, ''),
|
|
||||||
(SHRED_OUTPUT, '')
|
|
||||||
]
|
]
|
||||||
|
|
||||||
block_device = hardware.BlockDevice('/dev/sda', 'big', 1073741824,
|
block_device = hardware.BlockDevice('/dev/sda', 'big', 1073741824,
|
||||||
@@ -695,6 +689,71 @@ class TestGenericHardwareManager(test_base.BaseTestCase):
|
|||||||
'--iterations', '1', '/dev/sda')
|
'--iterations', '1', '/dev/sda')
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@mock.patch.object(utils, 'execute')
|
||||||
|
def test_erase_block_device_notsupported_shred(self, mocked_execute):
|
||||||
|
hdparm_output = create_hdparm_info(
|
||||||
|
supported=False, enabled=False, frozen=False, enhanced_erase=False)
|
||||||
|
|
||||||
|
mocked_execute.side_effect = [
|
||||||
|
(hdparm_output, ''),
|
||||||
|
(SHRED_OUTPUT_1_ITERATION_ZERO_TRUE, '')
|
||||||
|
]
|
||||||
|
|
||||||
|
block_device = hardware.BlockDevice('/dev/sda', 'big', 1073741824,
|
||||||
|
True)
|
||||||
|
self.hardware.erase_block_device(self.node, block_device)
|
||||||
|
mocked_execute.assert_has_calls([
|
||||||
|
mock.call('hdparm', '-I', '/dev/sda'),
|
||||||
|
mock.call('shred', '--force', '--zero', '--verbose',
|
||||||
|
'--iterations', '1', '/dev/sda')
|
||||||
|
])
|
||||||
|
|
||||||
|
@mock.patch.object(utils, 'execute')
|
||||||
|
def test_erase_block_device_shred_uses_internal_info(self, mocked_execute):
|
||||||
|
hdparm_output = create_hdparm_info(
|
||||||
|
supported=False, enabled=False, frozen=False, enhanced_erase=False)
|
||||||
|
|
||||||
|
info = self.node.get('driver_internal_info')
|
||||||
|
info['agent_erase_devices_iterations'] = 2
|
||||||
|
info['agent_erase_devices_zeroize'] = False
|
||||||
|
|
||||||
|
mocked_execute.side_effect = [
|
||||||
|
(hdparm_output, ''),
|
||||||
|
(SHRED_OUTPUT_2_ITERATIONS_ZERO_FALSE, '')
|
||||||
|
]
|
||||||
|
|
||||||
|
block_device = hardware.BlockDevice('/dev/sda', 'big', 1073741824,
|
||||||
|
True)
|
||||||
|
self.hardware.erase_block_device(self.node, block_device)
|
||||||
|
mocked_execute.assert_has_calls([
|
||||||
|
mock.call('hdparm', '-I', '/dev/sda'),
|
||||||
|
mock.call('shred', '--force', '--verbose',
|
||||||
|
'--iterations', '2', '/dev/sda')
|
||||||
|
])
|
||||||
|
|
||||||
|
@mock.patch.object(utils, 'execute')
|
||||||
|
def test_erase_block_device_shred_0_pass_no_zeroize(self, mocked_execute):
|
||||||
|
hdparm_output = create_hdparm_info(
|
||||||
|
supported=False, enabled=False, frozen=False, enhanced_erase=False)
|
||||||
|
|
||||||
|
info = self.node.get('driver_internal_info')
|
||||||
|
info['agent_erase_devices_iterations'] = 0
|
||||||
|
info['agent_erase_devices_zeroize'] = False
|
||||||
|
|
||||||
|
mocked_execute.side_effect = [
|
||||||
|
(hdparm_output, ''),
|
||||||
|
(SHRED_OUTPUT_0_ITERATIONS_ZERO_FALSE, '')
|
||||||
|
]
|
||||||
|
|
||||||
|
block_device = hardware.BlockDevice('/dev/sda', 'big', 1073741824,
|
||||||
|
True)
|
||||||
|
self.hardware.erase_block_device(self.node, block_device)
|
||||||
|
mocked_execute.assert_has_calls([
|
||||||
|
mock.call('hdparm', '-I', '/dev/sda'),
|
||||||
|
mock.call('shred', '--force', '--verbose',
|
||||||
|
'--iterations', '0', '/dev/sda')
|
||||||
|
])
|
||||||
|
|
||||||
@mock.patch.object(hardware.GenericHardwareManager,
|
@mock.patch.object(hardware.GenericHardwareManager,
|
||||||
'_is_virtual_media_device', autospec=True)
|
'_is_virtual_media_device', autospec=True)
|
||||||
def test_erase_block_device_virtual_media(self, vm_mock):
|
def test_erase_block_device_virtual_media(self, vm_mock):
|
||||||
|
Reference in New Issue
Block a user