blob: ba42a1911a2c1dc0eac0a94dfe0f5761eab20e0c [file] [log] [blame]
# Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Library to run xfstests in autotest.
"""
import os
from autotest_lib.client.bin import partition
class xfstests_env:
"""
Setup the environment for running xfstests.
"""
XFS_MOUNT_PATH = '/mnt/stateful_partition/unencrypted/cache'
env_names={}
env_partition={}
env_vp={}
env_device={}
fs_types={}
def setup_partitions(self, job, fs_types, crypto=False,
env_names=['TEST', 'SCRATCH']):
"""
xfttests needs 2 partitions: TEST and SCRATCH.
- TEST_DEV: "device containing TEST PARTITION"
- TEST_DIR: "mount point of TEST PARTITION"
- SCRATCH_DEV "device containing SCRATCH PARTITION"
- SCRATCH_MNT "mount point for SCRATCH PARTITION"
- SCRATCH_DIR "directory on a large partition"
@param job: The job object.
"""
self.env_names = env_names
self.fs_types = fs_types
for name in self.env_names:
file_name = 'xfstests_%s' % name
file_img = os.path.join(
self.XFS_MOUNT_PATH, '%s.img' % file_name)
self.env_vp[name] = partition.virtual_partition(
file_img=file_img, file_size=4096)
self.env_device[name] = self.env_vp[name].device
# You can use real block devices, such as /dev/sdc1 by populating
# env_device directly, but going through the virtual partition
# object.
# By default, we create a directory under autotest
mountpoint = os.path.join(job.tmpdir, file_name)
if not os.path.isdir(mountpoint):
os.makedirs(mountpoint)
self.env_partition[name] = job.partition(
device=self.env_device[name], mountpoint=mountpoint)
#
# Job configuration, instead of editing xfstests config files, set them
# right here as environment variables
#
for name in self.env_names:
os.environ['%s_DEV' % name] = self.env_partition[name].device
test_dir = self.env_partition['TEST'].mountpoint
os.environ['TEST_DIR'] = test_dir
os.environ['SCRATCH_MNT'] = self.env_partition['SCRATCH'].mountpoint
os.environ['SCRATCH_DIR'] = self.XFS_MOUNT_PATH
# ChromeOS does not need special option when SELinux is enabled.
os.environ['SELINUX_MOUNT_OPTIONS'] = ' '
mkfs_args = ''
mnt_options = ''
if crypto:
mkfs_args += '-O encrypt'
# TODO: update this when blockers are updated b:169251326
mnt_options += '-o test_dummy_encryption'
for fs_type in self.fs_types:
for name in self.env_names:
self.env_partition[name].mkfs(fstype=fs_type, args=mkfs_args)
os.environ['EXT_MOUNT_OPTIONS'] = mnt_options
def unmount_partitions(self):
"""
Unmount the partition created.
"""
for name in self.env_names:
self.env_partition[name].unmount(ignore_status=True)
self.env_vp[name].destroy()