def test_clear_holders_wipe_superblock_rereads_pt(self, mock_block, mock_log, m_zfs, m_time, mock_swap, mock_mp): """test clear_holders.wipe_superblock re-reads partition table""" mock_swap.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev mock_block.is_extended_partition.return_value = False mock_block.get_blockdev_for_partition.return_value = ( self.test_blockdev, None) mock_mp.multipath_supported.return_value = False mock_block.is_zfs_member.return_value = False mock_block.get_sysfs_partitions.side_effect = iter([ ['p1', 'p2'], # has partitions before wipe ['p1', 'p2'], # still has partitions after wipe [], # partitions are now gone ]) m_zfs.zfs_supported.return_value = True clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) mock_block.wipe_volume.assert_called_with(self.test_blockdev, exclusive=True, mode='superblock', strict=True) mock_block.get_sysfs_partitions.assert_has_calls( [mock.call(self.test_syspath)] * 3) mock_block.rescan_block_devices.assert_has_calls( [mock.call(devices=[self.test_blockdev])] * 2)
def test_clear_holders_mp_enabled_and_active_wipes_dm_dev( self, mock_block, mock_log, m_time, mock_swap, mock_mpath, m_get_holders, m_zfs): """wipe_superblock wipes removes mp parts first and wipes dev.""" mock_swap.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev m_zfs.zfs_supported.return_value = False mock_block.is_zfs_member.return_value = False mock_block.is_extended_partition.return_value = False mock_block.get_blockdev_for_partition.return_value = ( self.test_blockdev, 1) mock_mpath.multipath_supported.return_value = True mock_mpath.is_mpath_device.return_value = True mock_mpath.find_mpath_id_by_path.return_value = 'mpatha' mock_mpath.find_mpath_partitions.return_value = ['mpatha-part1'] mock_block.get_sysfs_partitions.side_effect = iter([ [], # partitions are now gone ]) mock_mpath.is_mpath_member.return_value = False m_get_holders.return_value = [] clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) mock_mpath.remove_partition.assert_called_with('mpatha-part1') mock_block.wipe_volume.assert_called_with(self.test_blockdev, exclusive=True, mode='superblock', strict=True)
def test_clear_holders_wipe_superblock_rereads_pt_oserr( self, mock_block, mock_log, m_time, mock_swap, mock_mp, m_zfs): """test clear_holders.wipe_superblock re-reads ptable handles oserr""" mock_swap.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev mock_block.is_extended_partition.return_value = False mock_block.get_blockdev_for_partition.return_value = ( self.test_blockdev, None) mock_mp.multipath_supported.return_value = False m_zfs.zfs_supported.return_value = False mock_block.is_zfs_member.return_value = False mock_block.get_sysfs_partitions.side_effect = iter([ ['p1', 'p2'], # has partitions before wipe OSError('No sysfs path for partition'), [], # partitions are now gone ]) clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) mock_block.wipe_volume.assert_called_with(self.test_blockdev, exclusive=True, mode='superblock', strict=True) mock_block.get_sysfs_partitions.assert_has_calls( [mock.call(self.test_syspath)] * 3) mock_block.rescan_block_devices.assert_has_calls( [mock.call(devices=[self.test_blockdev])] * 2) self.assertEqual(1, m_time.sleep.call_count)
def test_clear_holders_wipe_superblock_zfs_no_utils( self, mock_block, mock_log, mock_zfs, mock_swap, mock_mp, mock_udev): """test clear_holders.wipe_superblock handles missing zpool cmd""" mock_swap.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev mock_block.is_extended_partition.return_value = True clear_holders.wipe_superblock(self.test_syspath) self.assertFalse(mock_block.wipe_volume.called) mock_block.is_extended_partition.return_value = False mock_block.get_blockdev_for_partition.return_value = ( self.test_blockdev, None) mock_mp.multipath_supported.return_value = False mock_block.is_zfs_member.return_value = True mock_zfs.zfs_supported.return_value = True mock_zfs.device_to_poolname.return_value = 'fake_pool' mock_zfs.zpool_list.return_value = ['fake_pool'] mock_zfs.zpool_export.side_effect = [ ProcessExecutionError(cmd=['zpool', 'export', 'fake_pool'], stdout="", stderr=("cannot open 'fake_pool': " "no such pool")) ] clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) mock_block.wipe_volume.assert_called_with(self.test_blockdev, exclusive=True, mode='superblock', strict=True)
def test_clear_holders_wipe_superblock_no_zfs(self, mock_block, mock_log, mock_zfs, mock_swap, mock_mp): """test clear_holders.wipe_superblock checks zfs supported""" mock_swap.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev mock_block.is_extended_partition.return_value = True mock_block.get_blockdev_for_partition.return_value = ( self.test_blockdev, None) mock_mp.multipath_supported.return_value = False clear_holders.wipe_superblock(self.test_syspath) self.assertFalse(mock_block.wipe_volume.called) mock_block.is_extended_partition.return_value = False mock_block.is_zfs_member.return_value = True mock_zfs.zfs_supported.return_value = False clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) self.assertEqual(1, mock_zfs.zfs_supported.call_count) self.assertEqual(0, mock_block.is_zfs_member.call_count) self.assertEqual(0, mock_zfs.device_to_poolname.call_count) self.assertEqual(0, mock_zfs.zpool_list.call_count) mock_block.wipe_volume.assert_called_with(self.test_blockdev, exclusive=True, mode='superblock', strict=True)
def test_clear_holders_wipe_superblock(self, mock_block, mock_log, mock_os_path, mock_swap): """test clear_holders.wipe_superblock handles errors right""" mock_swap.return_value = False mock_os_path.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev mock_block.is_extended_partition.return_value = True clear_holders.wipe_superblock(self.test_syspath) self.assertFalse(mock_block.wipe_volume.called) mock_block.is_extended_partition.return_value = False mock_block.is_zfs_member.return_value = False clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) mock_block.wipe_volume.assert_called_with(self.test_blockdev, exclusive=True, mode='superblock')
def test_clear_holders_wipe_superblock_zfs(self, mock_block, mock_log, mock_zfs, mock_swap): """test clear_holders.wipe_superblock handles zfs member""" mock_swap.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev mock_block.is_extended_partition.return_value = True clear_holders.wipe_superblock(self.test_syspath) self.assertFalse(mock_block.wipe_volume.called) mock_block.is_extended_partition.return_value = False mock_block.is_zfs_member.return_value = True mock_zfs.zfs_supported.return_value = True mock_zfs.device_to_poolname.return_value = 'fake_pool' mock_zfs.zpool_list.return_value = ['fake_pool'] clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) mock_zfs.zpool_export.assert_called_with('fake_pool') mock_block.wipe_volume.assert_called_with(self.test_blockdev, exclusive=True, mode='superblock')
def test_clear_holders_mp_enabled_not_active_wipes_dev( self, mock_block, mock_log, m_time, mock_swap, mock_mpath, m_zfs): """wipe_superblock skips wiping multipath member path.""" mock_swap.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev mock_block.is_extended_partition.return_value = False mock_mpath.multipath_supported.return_value = True mock_mpath.find_mpath_id_by_path.return_value = None mock_block.get_blockdev_for_partition.return_value = ( self.test_blockdev, 1) m_zfs.zfs_supported.return_value = False mock_block.is_zfs_member.return_value = False mock_block.get_sysfs_partitions.side_effect = iter([ ['p1', 'p2'], # has partitions before wipe ['p1', 'p2'], # still has partitions after wipe [], # partitions are now gone ]) clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) self.assertEqual(0, mock_block.wipe_volume.call_count)
def test_clear_holders_mp_disabled_wipes_dev(self, mock_block, mock_log, m_time, mock_swap, mock_mpath, m_zfs): """wipe_superblock wipes blockdev with multipath disabled.""" mock_swap.return_value = False mock_block.sysfs_to_devpath.return_value = self.test_blockdev mock_block.is_extended_partition.return_value = False mock_mpath.multipath_supported.return_value = False mock_block.get_blockdev_for_partition.return_value = ( self.test_blockdev, 1) m_zfs.zfs_supported.return_value = False mock_block.is_zfs_member.return_value = False mock_block.get_sysfs_partitions.side_effect = iter([ ['p1', 'p2'], # has partitions before wipe ['p1', 'p2'], # still has partitions after wipe [], # partitions are now gone ]) clear_holders.wipe_superblock(self.test_syspath) mock_block.sysfs_to_devpath.assert_called_with(self.test_syspath) mock_block.wipe_volume.assert_called_with(self.test_blockdev, exclusive=True, mode='superblock')