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