2929from avocado import Test
3030from avocado import main
3131from avocado .utils import process , build , git , distro , partition
32- from avocado .utils import disk , data_structures
32+ from avocado .utils import disk , data_structures , pmem
3333from avocado .utils .software_manager import SoftwareManager
3434
3535
@@ -51,6 +51,8 @@ def setUp(self):
5151 "df -T / | awk 'END {print $2}'" , shell = True ).decode ("utf-8" )
5252 if root_fs in ['ext3' , 'ext4' ]:
5353 self .use_dd = True
54+ self .dev_type = self .params .get ('type' , default = 'loop' )
55+
5456 sm = SoftwareManager ()
5557
5658 self .detected_distro = distro .detect ()
@@ -73,6 +75,10 @@ def setUp(self):
7375 # on Avocado versions >= 50.0. This is a temporary compatibility
7476 # enabler for older runners, but should be removed soon
7577 elif self .detected_distro .name in ['centos' , 'fedora' , 'rhel' , 'SuSE' ]:
78+ if self .dev_type == 'nvdimm' :
79+ packages .extend (['ndctl' , 'parted' ])
80+ if self .detected_distro .name == 'rhel' :
81+ packages .extend (['daxctl' ])
7682 packages .extend (['acl' , 'bc' , 'dump' , 'indent' , 'libtool' , 'lvm2' ,
7783 'xfsdump' , 'psmisc' , 'sed' , 'libacl-devel' ,
7884 'libattr-devel' , 'libaio-devel' , 'libuuid-devel' ,
@@ -97,15 +103,14 @@ def setUp(self):
97103 if not sm .check_installed (package ) and not sm .install (package ):
98104 self .cancel ("Fail to install %s required for this test." %
99105 package )
100-
101106 self .skip_dangerous = self .params .get ('skip_dangerous' , default = True )
102107 self .test_range = self .params .get ('test_range' , default = None )
103108 self .scratch_mnt = self .params .get (
104109 'scratch_mnt' , default = '/mnt/scratch' )
105110 self .test_mnt = self .params .get ('test_mnt' , default = '/mnt/test' )
106111 self .disk_mnt = self .params .get ('disk_mnt' , default = '/mnt/loop_device' )
107- self .dev_type = self .params .get ('type' , default = 'loop' )
108112 self .fs_to_test = self .params .get ('fs' , default = 'ext4' )
113+
109114 if process .system ('which mkfs.%s' % self .fs_to_test ,
110115 ignore_status = True ):
111116 self .cancel ('Unknown filesystem %s' % self .fs_to_test )
@@ -129,6 +134,59 @@ def setUp(self):
129134 else :
130135 self .cancel ('Need %s GB to create loop devices' % check )
131136 self ._create_loop_device (base_disk , loop_size , mount )
137+ elif self .dev_type == 'nvdimm' :
138+ self .test_dev = self .params .get ('disk_test' , default = None )
139+ self .scratch_dev = self .params .get ('disk_scratch' , default = None )
140+ self .log_test = self .params .get ('log_test' , default = '' )
141+ self .log_scratch = self .params .get ('log_scratch' , default = '' )
142+ logflag = self .params .get ('logdev' , default = False )
143+ self .plib = pmem .PMem ()
144+ regions = sorted (self .plib .run_ndctl_list (
145+ '-R' ), key = lambda i : i ['size' ], reverse = True )
146+ if not (self .test_dev and self .scratch_dev ):
147+ if not regions :
148+ self .plib .enable_region ()
149+ regions = sorted (self .plib .run_ndctl_list (
150+ '-R' ), key = lambda i : i ['size' ], reverse = True )
151+ region = self .plib .run_ndctl_list_val (regions [0 ], 'dev' )
152+ if not self .plib .is_region_legacy (region ):
153+ self .plib .destroy_namespace (region = region , force = True )
154+ self .plib .create_namespace (
155+ region = region , size = '21G' , sector_size = '512' )
156+ pmem_dev = self .plib .run_ndctl_list_val (
157+ self .plib .run_ndctl_list ('-N -r %s' % region )[0 ], 'blockdev' )
158+ if logflag :
159+ if not (self .log_test and self .log_scratch ):
160+ self .plib .create_namespace (
161+ region = region , size = '3G' , mode = 'sector' , sector_size = '512' )
162+ log_dev = self .plib .run_ndctl_list_val (self .plib .run_ndctl_list (
163+ '-N -r %s -m sector' % region )[0 ], 'blockdev' )
164+ else :
165+ self .plib .enable_region ()
166+ if not len (regions ) > 1 and logflag :
167+ self .cancel ("Cannot use logdev with one region" )
168+ else :
169+ reg_2 = self .plib .run_ndctl_list_val (regions [1 ], 'dev' )
170+ self .plib .create_namespace (
171+ region = reg_2 , size = '3G' , mode = 'sector' , sector_size = '512' )
172+ log_dev = self .plib .run_ndctl_list_val (self .plib .run_ndctl_list (
173+ ' -N -r %s -m sector' % reg_2 )[0 ], 'blockdev' )
174+ pmem_dev = self .plib .run_ndctl_list_val (
175+ self .plib .run_ndctl_list ('-N -r %s' % region )[0 ], 'blockdev' )
176+ if process .system ('parted -s -a optimal /dev/%s mklabel gpt --'
177+ ' mkpart primary xfs 1MiB 10GiB mkpart '
178+ 'primary xfs 10GiB 20GiB' % pmem_dev , shell = True ):
179+ self .cancel ("Failed to setup PMEM partitions" )
180+ self .test_dev = "/dev/%sp1" % pmem_dev
181+ self .scratch_dev = "/dev/%sp2" % pmem_dev
182+ self .devices .extend ([self .test_dev , self .scratch_dev ])
183+ if logflag and not (self .log_test and self .log_scratch ):
184+ if process .system ('parted -s -a optimal /dev/%s mklabel gpt --'
185+ ' mkpart primary xfs 1MiB 1GiB mkpart '
186+ 'primary xfs 1GiB 2GiB' % log_dev , shell = True ):
187+ self .cancel ("Failed to setup logdev partitions" )
188+ self .log_test = "/dev/%s1" % log_dev
189+ self .log_scratch = "/dev/%s2" % log_dev
132190 else :
133191 self .test_dev = self .params .get ('disk_test' , default = None )
134192 self .scratch_dev = self .params .get ('disk_scratch' , default = None )
@@ -138,8 +196,6 @@ def setUp(self):
138196 cfg_file = os .path .join (self .teststmpdir , 'local.config' )
139197 self .mkfs_opt = self .params .get ('mkfs_opt' , default = '' )
140198 self .mount_opt = self .params .get ('mount_opt' , default = '' )
141- self .log_test = self .params .get ('log_test' , default = '' )
142- self .log_scratch = self .params .get ('log_scratch' , default = '' )
143199 with open (cfg_file , "r" ) as sources :
144200 lines = sources .readlines ()
145201 with open (cfg_file , "w" ) as sources :
@@ -166,10 +222,12 @@ def setUp(self):
166222 break
167223 with open (cfg_file , "a" ) as sources :
168224 if self .log_test :
225+ sources .write ('export USE_EXTERNAL=yes\n ' )
169226 sources .write ('export TEST_LOGDEV="%s"\n ' % self .log_test )
170227 self .log_devices .append (self .log_test )
171228 if self .log_scratch :
172- sources .write ('export SCRATCH_LOGDEV="%s"\n ' % self .log_scratch )
229+ sources .write ('export SCRATCH_LOGDEV="%s"\n ' %
230+ self .log_scratch )
173231 self .log_devices .append (self .log_scratch )
174232 if self .mkfs_opt :
175233 sources .write ('MKFS_OPTIONS="%s"\n ' % self .mkfs_opt )
@@ -182,7 +240,8 @@ def setUp(self):
182240 for ite , dev in enumerate (self .devices ):
183241 dev_obj = partition .Partition (dev )
184242 if self .logdev_opt :
185- dev_obj .mkfs (fstype = self .fs_to_test , args = '%s %s=%s' % (self .mkfs_opt , self .logdev_opt , self .log_devices [ite ]))
243+ dev_obj .mkfs (fstype = self .fs_to_test , args = '%s %s=%s' % (
244+ self .mkfs_opt , self .logdev_opt , self .log_devices [ite ]))
186245 else :
187246 dev_obj .mkfs (fstype = self .fs_to_test , args = self .mkfs_opt )
188247
@@ -211,11 +270,15 @@ def setUp(self):
211270 self ._create_test_list (self .share_exclude , "shared" ,
212271 dangerous = False )
213272 if self .detected_distro .name is not 'SuSE' :
214- process .run ('useradd 123456-fsgqa' , sudo = True )
215- process .run ('useradd fsgqa' , sudo = True )
273+ if process .system ('useradd 123456-fsgqa' , sudo = True , ignore_status = True ):
274+ self .log .warn ('useradd 123456-fsgqa failed' )
275+ if process .system ('useradd fsgqa' , sudo = True , ignore_status = True ):
276+ self .log .warn ('useradd fsgqa failed' )
216277 else :
217- process .run ('useradd -m -U fsgqa' , sudo = True )
218- process .run ('groupadd sys' , sudo = True )
278+ if process .system ('useradd -m -U fsgqa' , sudo = True , ignore_status = True ):
279+ self .log .warn ('useradd fsgqa failed' )
280+ if process .system ('groupadd sys' , sudo = True , ignore_status = True ):
281+ self .log .warn ('groupadd sys failed' )
219282 if not os .path .exists (self .scratch_mnt ):
220283 os .makedirs (self .scratch_mnt )
221284 if not os .path .exists (self .test_mnt ):
@@ -265,9 +328,9 @@ def tearDown(self):
265328 process .system ('umount %s %s' % (self .scratch_mnt , self .test_mnt ),
266329 sudo = True , ignore_status = True )
267330 if os .path .exists (self .scratch_mnt ):
268- os . rmdir (self .scratch_mnt )
331+ shutil . rmtree (self .scratch_mnt )
269332 if os .path .exists (self .test_mnt ):
270- os . rmdir (self .test_mnt )
333+ shutil . rmtree (self .test_mnt )
271334 if self .dev_type == 'loop' :
272335 for dev in self .devices :
273336 process .system ('losetup -d %s' % dev , shell = True ,
0 commit comments