1*9c5db199SXin Li# Copyright (c) 2017 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Li"""Library to run xfstests in autotest. 6*9c5db199SXin Li 7*9c5db199SXin Li""" 8*9c5db199SXin Li 9*9c5db199SXin Liimport os 10*9c5db199SXin Lifrom autotest_lib.client.bin import partition 11*9c5db199SXin Li 12*9c5db199SXin Liclass xfstests_env: 13*9c5db199SXin Li """ 14*9c5db199SXin Li Setup the environment for running xfstests. 15*9c5db199SXin Li """ 16*9c5db199SXin Li XFS_MOUNT_PATH = '/mnt/stateful_partition/unencrypted/cache' 17*9c5db199SXin Li 18*9c5db199SXin Li env_names={} 19*9c5db199SXin Li env_partition={} 20*9c5db199SXin Li env_vp={} 21*9c5db199SXin Li env_device={} 22*9c5db199SXin Li fs_types={} 23*9c5db199SXin Li 24*9c5db199SXin Li def setup_partitions(self, job, fs_types, crypto=False, 25*9c5db199SXin Li env_names=['TEST', 'SCRATCH']): 26*9c5db199SXin Li """ 27*9c5db199SXin Li xfttests needs 2 partitions: TEST and SCRATCH. 28*9c5db199SXin Li - TEST_DEV: "device containing TEST PARTITION" 29*9c5db199SXin Li - TEST_DIR: "mount point of TEST PARTITION" 30*9c5db199SXin Li - SCRATCH_DEV "device containing SCRATCH PARTITION" 31*9c5db199SXin Li - SCRATCH_MNT "mount point for SCRATCH PARTITION" 32*9c5db199SXin Li 33*9c5db199SXin Li - SCRATCH_DIR "directory on a large partition" 34*9c5db199SXin Li 35*9c5db199SXin Li @param job: The job object. 36*9c5db199SXin Li """ 37*9c5db199SXin Li 38*9c5db199SXin Li self.env_names = env_names 39*9c5db199SXin Li self.fs_types = fs_types 40*9c5db199SXin Li for name in self.env_names: 41*9c5db199SXin Li file_name = 'xfstests_%s' % name 42*9c5db199SXin Li file_img = os.path.join( 43*9c5db199SXin Li self.XFS_MOUNT_PATH, '%s.img' % file_name) 44*9c5db199SXin Li self.env_vp[name] = partition.virtual_partition( 45*9c5db199SXin Li file_img=file_img, file_size=4096) 46*9c5db199SXin Li self.env_device[name] = self.env_vp[name].device 47*9c5db199SXin Li 48*9c5db199SXin Li # You can use real block devices, such as /dev/sdc1 by populating 49*9c5db199SXin Li # env_device directly, but going through the virtual partition 50*9c5db199SXin Li # object. 51*9c5db199SXin Li 52*9c5db199SXin Li # By default, we create a directory under autotest 53*9c5db199SXin Li mountpoint = os.path.join(job.tmpdir, file_name) 54*9c5db199SXin Li if not os.path.isdir(mountpoint): 55*9c5db199SXin Li os.makedirs(mountpoint) 56*9c5db199SXin Li 57*9c5db199SXin Li self.env_partition[name] = job.partition( 58*9c5db199SXin Li device=self.env_device[name], mountpoint=mountpoint) 59*9c5db199SXin Li 60*9c5db199SXin Li # 61*9c5db199SXin Li # Job configuration, instead of editing xfstests config files, set them 62*9c5db199SXin Li # right here as environment variables 63*9c5db199SXin Li # 64*9c5db199SXin Li for name in self.env_names: 65*9c5db199SXin Li os.environ['%s_DEV' % name] = self.env_partition[name].device 66*9c5db199SXin Li 67*9c5db199SXin Li test_dir = self.env_partition['TEST'].mountpoint 68*9c5db199SXin Li 69*9c5db199SXin Li os.environ['TEST_DIR'] = test_dir 70*9c5db199SXin Li os.environ['SCRATCH_MNT'] = self.env_partition['SCRATCH'].mountpoint 71*9c5db199SXin Li os.environ['SCRATCH_DIR'] = self.XFS_MOUNT_PATH 72*9c5db199SXin Li 73*9c5db199SXin Li # ChromeOS does not need special option when SELinux is enabled. 74*9c5db199SXin Li os.environ['SELINUX_MOUNT_OPTIONS'] = ' ' 75*9c5db199SXin Li 76*9c5db199SXin Li mkfs_args = '' 77*9c5db199SXin Li mnt_options = '' 78*9c5db199SXin Li if crypto: 79*9c5db199SXin Li mkfs_args += '-O encrypt' 80*9c5db199SXin Li # TODO: update this when blockers are updated b:169251326 81*9c5db199SXin Li mnt_options += '-o test_dummy_encryption' 82*9c5db199SXin Li 83*9c5db199SXin Li for fs_type in self.fs_types: 84*9c5db199SXin Li for name in self.env_names: 85*9c5db199SXin Li self.env_partition[name].mkfs(fstype=fs_type, args=mkfs_args) 86*9c5db199SXin Li 87*9c5db199SXin Li os.environ['EXT_MOUNT_OPTIONS'] = mnt_options 88*9c5db199SXin Li 89*9c5db199SXin Li def unmount_partitions(self): 90*9c5db199SXin Li """ 91*9c5db199SXin Li Unmount the partition created. 92*9c5db199SXin Li """ 93*9c5db199SXin Li for name in self.env_names: 94*9c5db199SXin Li self.env_partition[name].unmount(ignore_status=True) 95*9c5db199SXin Li self.env_vp[name].destroy() 96