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         @param job: The job object.
     34         """
     35 
     36         self.env_names = env_names
     37         self.fs_types = fs_types
     38         for name in self.env_names:
     39             file_name = 'xfstests_%s' % name
     40             file_img = os.path.join(
     41                 self.XFS_MOUNT_PATH, '%s.img' % file_name)
     42             self.env_vp[name] = partition.virtual_partition(
     43                 file_img=file_img, file_size=1024)
     44             self.env_device[name] = self.env_vp[name].device
     45 
     46             # You can use real block devices, such as /dev/sdc1 by populating
     47             # env_device directly, but going through the virtual partition
     48             # object.
     49 
     50             # By default, we create a directory under autotest
     51             mountpoint = os.path.join(job.tmpdir, file_name)
     52             if not os.path.isdir(mountpoint):
     53                 os.makedirs(mountpoint)
     54 
     55             self.env_partition[name] = job.partition(
     56                 device=self.env_device[name], mountpoint=mountpoint)
     57 
     58         #
     59         # Job configuration, instead of editing xfstests config files, set them
     60         # right here as environment variables
     61         #
     62         for name in self.env_names:
     63             os.environ['%s_DEV' % name] = self.env_partition[name].device
     64 
     65         test_dir = self.env_partition['TEST'].mountpoint
     66 
     67         os.environ['TEST_DIR'] = test_dir
     68         os.environ['SCRATCH_MNT'] = self.env_partition['SCRATCH'].mountpoint
     69 
     70         # ChromeOS does not need special option when SELinux is enabled.
     71         os.environ['SELINUX_MOUNT_OPTIONS'] = ' '
     72 
     73         mkfs_args = ''
     74         mnt_options = ''
     75         if crypto:
     76             mkfs_args += '-O encrypt'
     77             mnt_options += '-o test_dummy_encryption'
     78 
     79         for fs_type in self.fs_types:
     80             for name in self.env_names:
     81                 self.env_partition[name].mkfs(fstype=fs_type, args=mkfs_args)
     82 
     83         os.environ['EXT_MOUNT_OPTIONS'] = mnt_options
     84 
     85     def unmount_partitions(self):
     86         """
     87         Unmount the partition created.
     88         """
     89         for name in self.env_names:
     90             self.env_partition[name].unmount(ignore_status=True)
     91             self.env_vp[name].destroy()
     92