def test_self_heal_and_add_brick_with_data_from_diff_users(self): """ Test case: 1. Created a 2X3 volume. 2. Mount the volume using FUSE and give 777 permissions to the mount. 3. Added a new user. 4. Login as new user and created 100 files from the new user: for i in {1..100};do dd if=/dev/urandom of=$i bs=1024 count=1;done 5. Kill a brick which is part of the volume. 6. On the mount, login as root user and create 1000 files: for i in {1..1000};do dd if=/dev/urandom of=f$i bs=10M count=1;done 7. On the mount, login as new user, and copy existing data to the mount. 8. Start volume using force. 9. While heal is in progress, add-brick and start rebalance. 10. Wait for rebalance and heal to complete, 11. Check for MSGID: 108008 errors in rebalance logs. """ # Change permissions of mount point to 777 ret = set_file_permissions(self.first_client, self.mountpoint, '-R 777') self.assertTrue(ret, "Unable to change mount point permissions") g.log.info("Mount point permissions set to 777") # Create 100 files from non-root user cmd = ("su -l %s -c 'cd %s; for i in {1..100};do dd if=/dev/urandom " "of=nonrootfile$i bs=1024 count=1; done'" % (self.users[0], self.mountpoint)) ret, _, _ = g.run(self.first_client, cmd) self.assertFalse(ret, "Failed to create files from non-root user") # Kill one brick which is part of the volume self._bring_bricks_offline() # Create 1000 files from root user cmd = ("cd %s; for i in {1..1000};do dd if=/dev/urandom of=rootfile$i" " bs=10M count=1;done" % self.mountpoint) ret, _, _ = g.run(self.first_client, cmd) self.assertFalse(ret, "Failed to creare files from root user") # On the mount, login as new user, and copy existing data to # the mount cmd = ("su -l %s -c 'wget https://cdn.kernel.org/pub/linux/kernel/" "v5.x/linux-5.4.54.tar.xz; tar -xvf linux-5.4.54.tar.xz;" "cd %s; cp -r ~/ .;'" % (self.users[1], self.mountpoint)) ret, _, _ = g.run(self.first_client, cmd) self.assertFalse(ret, "Failed to copy files from non-root user") # Check if there are files to be healed self._check_if_there_are_files_to_be_healed() # Start the vol using force self._restart_volume_and_bring_all_offline_bricks_online() # Add bricks to volume and wait for heal to complete self._expand_volume_and_wait_for_rebalance_to_complete() # Wait for heal to complete self._wait_for_heal_to_completed() # Check for MSGID: 108008 errors in rebalance logs particiapting_nodes = [] for brick in get_all_bricks(self.mnode, self.volname): node, _ = brick.split(':') particiapting_nodes.append(node) for server in particiapting_nodes: ret = occurences_of_pattern_in_file( server, "MSGID: 108008", "/var/log/glusterfs/{}-rebalance.log".format(self.volname)) self.assertEqual(ret, 0, "[Input/output error] present in rebalance log" " file") g.log.info("Expanding volume successful and no MSGID: 108008 " "errors see in rebalance logs")
def _set_root_dir_permission(self, permission): """ Sets the root dir permission to the given value""" m_point = self.mounts[0].mountpoint ret = set_file_permissions(self.clients[0], m_point, permission) self.assertTrue(ret, "Failed to set root dir permissions")
def test_access_file_with_stale_linkto_xattr(self): """ Description: Checks if the files are accessible as non-root user if the files have stale linkto xattr. Steps: 1) Create a volume and start it. 2) Mount the volume on client node using FUSE. 3) Create a file. 4) Enable performance.parallel-readdir and performance.readdir-ahead on the volume. 5) Rename the file in order to create a linkto file. 6) Force the linkto xattr values to become stale by changing the dht subvols in the graph 7) Login as an non-root user and access the file. """ # pylint: disable=protected-access # Set permissions on the mount-point m_point = self.mounts[0].mountpoint ret = set_file_permissions(self.clients[0], m_point, "-R 777") self.assertTrue(ret, "Failed to set file permissions") g.log.info("Successfully set file permissions on mount-point") # Creating a file on the mount-point cmd = 'dd if=/dev/urandom of={}/FILE-1 count=1 bs=16k'.format(m_point) ret, _, _ = g.run(self.clients[0], cmd) self.assertEqual(ret, 0, "File to create file") # Enable performance.parallel-readdir and # performance.readdir-ahead on the volume options = { "performance.parallel-readdir": "enable", "performance.readdir-ahead": "enable" } ret = set_volume_options(self.mnode, self.volname, options) self.assertTrue(ret, "Failed to set volume options") g.log.info("Successfully set volume options") # Finding a file name such that renaming source file to it will form a # linkto file subvols = (get_subvols(self.mnode, self.volname))['volume_subvols'] newhash = find_new_hashed(subvols, "/", "FILE-1") new_name = str(newhash.newname) new_host = str(newhash.hashedbrickobject._host) new_name_path = str(newhash.hashedbrickobject._fqpath)[:-1] # Move file such that it hashes to some other subvol and forms linkto # file ret = move_file(self.clients[0], "{}/FILE-1".format(m_point), "{}/{}".format(m_point, new_name)) self.assertTrue(ret, "Rename failed") g.log.info('Renamed file %s to %s', "{}/FILE-1".format(m_point), "{}/{}".format(m_point, new_name)) # Check if "dst_file" is linkto file ret = is_linkto_file(new_host, '{}{}'.format(new_name_path, new_name)) self.assertTrue(ret, "File is not a linkto file") g.log.info("File is linkto file") # Force the linkto xattr values to become stale by changing the dht # subvols in the graph; for that: # disable performance.parallel-readdir and # performance.readdir-ahead on the volume options = { "performance.parallel-readdir": "disable", "performance.readdir-ahead": "disable" } ret = set_volume_options(self.mnode, self.volname, options) self.assertTrue(ret, "Failed to disable volume options") g.log.info("Successfully disabled volume options") # Access the file as non-root user cmd = "ls -lR {}".format(m_point) ret, _, _ = g.run(self.mounts[0].client_system, cmd, user="******") self.assertEqual(ret, 0, "Lookup failed ") g.log.info("Lookup successful")
def _testcase(self, number_of_expands=1): """ Test case: 1. Create a volume start it and mount on the client. 2. Set full permission on the mount point. 3. Add new user to the client. 4. As the new user create dirs/files. 5. Compute arequal checksum and check permission on / and subdir. 6. expand cluster according to number_of_expands and start rebalance. 7. After rebalance is completed: 7.1 check arequal checksum 7.2 verfiy no change in / and sub dir permissions. 7.3 As the new user create and delete file/dir. """ # Set full permissions on the mount point. ret = set_file_permissions(self.clients[0], self.mountpoint, "-R 777") self.assertTrue(ret, "Failed to set permissions on the mount point") g.log.info("Set full permissions on the mount point") # Create dirs/files as self.test_user cmd = (r'su -l %s -c "cd %s;' r'for i in {0..9}; do mkdir d\$i; done;' r'for i in {0..99}; do let x=\$i%%10;' r'dd if=/dev/urandom of=d\$x/f.\$i bs=1024 count=1; done"' % (self.user, self.mountpoint)) ret, _, _ = g.run(self.client, cmd) self.assertEqual(ret, 0, ("Failed to create files as %s", self.user)) g.log.info("IO as %s is successful", self.user) # check permission on / and subdir self._check_user_permission() # get arequal checksum before expand self.arequal_checksum_before = collect_mounts_arequal(self.mounts[0]) self._logged_vol_info() # expand the volume for i in range(number_of_expands): ret = expand_volume(self.mnode, self.volname, self.servers, self.all_servers_info) self.assertTrue( ret, ("Failed to expand iter %d volume %s", i, self.volname)) self._logged_vol_info() # Start Rebalance and wait for completion self._start_rebalance_and_wait() # compare arequals checksum before and after rebalance self._get_arequal_and_check_if_equal_to_before() # permissions check on / and sub dir self._check_user_permission() # Create/Delete file as self.test_user cmd = ('su -l %s -c ' '"cd %s; touch file.test;' 'find . -mindepth 1 -maxdepth 1 -type d | xargs rm -rf"' % (self.user, self.mountpoint)) ret, _, _ = g.run(self.client, cmd) self.assertEqual(ret, 0, ("User %s failed to create files", self.user)) g.log.info("IO as %s is successful", self.user)
def test_root_squash_enable(self): """ Tests to verify Nfs Ganesha rootsquash functionality when glusterd service is restarted Steps: 1. Create some files and dirs inside mount point 2. Set permission as 777 for mount point 3. Enable root-squash on volume 4. Create some more files and dirs 5. Restart glusterd on all the nodes 6. Try to edit file created in step 1 It should not allow to edit the file 7. Try to edit the file created in step 5 It should allow to edit the file """ # Start IO on mount point. cmd = ("for i in {1..10}; do touch %s/file$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successful in getting stats of files/dirs " "from mount point") # Set mount point permission to 777 ret = set_file_permissions(self.mounts[0].client_system, self.mounts[0].mountpoint, 777) self.assertTrue(ret, "Failed to set permission for directory") g.log.info("Successfully set permissions for directory") # Enable root-squash on volume ret = set_root_squash(self.servers[0], self.volname) self.assertTrue(ret, "Failed to enable root-squash on volume") g.log.info("root-squash is enable on the volume") # Start IO on mount point. cmd = ("for i in {1..10}; do touch %s/Squashfile$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successfull in getting stats of files/dirs " "from mount point") # Restart glusterd on all servers ret = restart_glusterd(self.servers) self.assertTrue(ret, ("Failed to restart glusterd on all servers %s", self.servers)) g.log.info("Successfully restarted glusterd on all servers %s", self.servers) # Check if glusterd is running on all servers ret = is_glusterd_running(self.servers) self.assertEqual(ret, 0, ("Failed:Glusterd is not running on all " "servers %s", self.servers)) g.log.info("Glusterd is running on all the servers %s", self.servers) # Checking if peer is connected. ret = wait_for_peers_to_connect(self.mnode, self.servers) self.assertTrue(ret, "Failed:Peer is not in connected state.") g.log.info("Peers are in connected state.") # Edit file created by root user for mount_obj in self.mounts: ret = append_string_to_file(mount_obj.client_system, "%s/file10" % mount_obj.mountpoint, 'hello') self.assertFalse(ret, "Unexpected:nfsnobody user editing file " "created by root user should FAIL") g.log.info("Successful:nfsnobody user failed to edit file " "created by root user") # Edit the file created by nfsnobody user for mount_obj in self.mounts: ret = append_string_to_file(mount_obj.client_system, "%s/Squashfile5" % mount_obj.mountpoint, 'hello') self.assertTrue(ret, "Unexpected:nfsnobody user failed to edit " "the file created by nfsnobody user") g.log.info("Successful:nfsnobody user successfully edited the " "file created by nfsnobody user")
def test_root_squash_enable(self): """ Tests to verify Nfs Ganesha rootsquash functionality when volume is restarted Steps: 1. Create some files and dirs inside mount point 2. Set permission as 777 for mount point 3. Enable root-squash on volume 4. Create some more files and dirs 5. Restart volume 6. Try to edit file created in step 1 It should not allow to edit the file 7. Try to edit the file created in step 5 It should allow to edit the file """ # Start IO on mount point. cmd = ("for i in {1..10}; do touch %s/file$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successful in getting stats of files/dirs " "from mount point") # Set mount point permission to 777 ret = set_file_permissions(self.mounts[0].client_system, self.mounts[0].mountpoint, 777) self.assertTrue(ret, "Failed to set permission for directory") g.log.info("Successfully set permissions for directory") # Enable root-squash on volume ret = set_root_squash(self.servers[0], self.volname) self.assertTrue(ret, "Failed to enable root-squash on volume") g.log.info("root-squash is enable on the volume") # Start IO on mount point. cmd = ("for i in {1..10}; do touch %s/Squashfile$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successful in getting stats of files/dirs " "from mount point") # Stopping volume ret = volume_stop(self.mnode, self.volname) self.assertTrue(ret, ("Failed to stop volume %s" % self.volname)) g.log.info("Successful in stopping volume %s" % self.volname) # Waiting for few seconds for volume unexport. Max wait time is # 120 seconds. ret = wait_for_nfs_ganesha_volume_to_get_unexported( self.mnode, self.volname) self.assertTrue(ret, ("Failed to unexport volume %s after " "stopping volume" % self.volname)) g.log.info("Volume is unexported successfully") # Starting volume ret = volume_start(self.mnode, self.volname) self.assertTrue(ret, ("Failed to start volume %s" % self.volname)) g.log.info("Successful in starting volume %s" % self.volname) # Waiting for few seconds for volume export. Max wait time is # 120 seconds. ret = wait_for_nfs_ganesha_volume_to_get_exported( self.mnode, self.volname) self.assertTrue(ret, ("Failed to export volume %s after " "starting volume" % self.volname)) g.log.info("Volume is exported successfully") # Edit file created by root user for mount_obj in self.mounts: ret = append_string_to_file(mount_obj.client_system, "%s/file10" % mount_obj.mountpoint, 'hello') self.assertFalse( ret, "Unexpected:nfsnobody user editing file " "created by root user should FAIL") g.log.info("Successful:nfsnobody user failed to edit file " "created by root user") # Edit the file created by nfsnobody user for mount_obj in self.mounts: ret = append_string_to_file( mount_obj.client_system, "%s/Squashfile5" % mount_obj.mountpoint, 'hello') self.assertTrue( ret, "Unexpected:nfsnobody user failed to edit " "the file created by nfsnobody user") g.log.info("Successful:nfsnobody user successfully edited the " "file created by nfsnobody user")
def test_heal_client_io_hang(self): mountpoint = self.mounts[0].mountpoint # disable server side heal ret = disable_heal(self.mnode, self.volname) self.assertTrue(ret, ("Failed to disable server side heal")) g.log.info("Successfully disabled server side heal") # Log Volume Info and Status after disabling client side heal g.log.info("Logging volume info and status") ret = log_volume_info_and_status(self.mnode, self.volname) self.assertTrue(ret, ("Logging volume info and status failed " "on volume %s", self.volname)) bricks_list = get_all_bricks(self.mnode, self.volname) self.assertIsNotNone(bricks_list, "Failed to get the bricks list") # Create files cmd = ("cd %s; mkdir test; cd test; for i in `seq 1 100` ;" "do touch file$i; done" % mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd) self.assertEqual(ret, 0, err) g.log.info('Finished creating files while all the bricks are UP') # Bring bricks offline ret = bring_bricks_offline(self.volname, bricks_list[0:1]) self.assertTrue(ret, "Failed to bring down the bricks") g.log.info("Successfully brought the bricks down") # Start pumping IO from client cmd = ("cd %s; mkdir test; cd test; for i in `seq 1 100` ;" "do dd if=/dev/urandom of=file$i bs=1M " "count=5;done" % mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd) self.assertEqual(ret, 0, err) g.log.info('Finished writing on files while a brick is DOWN') # Bring bricks online ret = bring_bricks_online(self.mnode, self.volname, bricks_list[0:1]) self.assertTrue(ret, "Failed to bring up the bricks") g.log.info("Successfully brought the bricks up") # Verifying all bricks online ret = are_bricks_online(self.mnode, self.volname, bricks_list) self.assertTrue(ret, "All bricks are not online") # Start client side heal by reading/writing files and directories appendcmd = ("cd %s; mkdir test; cd test; for i in `seq 1 100` ;" "do dd if=/dev/urandom of=file$i bs=1M " "count=1 oflag=append conv=notrunc;done" % mountpoint) readcmd = ("cd %s; mkdir test; cd test; for i in `seq 1 100` ;" "do dd if=file$i of=/dev/null bs=1M " "count=5;done" % mountpoint) ret = set_file_permissions(self.mounts[0].client_system, "%s/test" % mountpoint, 777) self.assertTrue(ret, "Failed to set permission for directory") g.log.info("Successfully set permissions for directory") ret, _, err = g.run(self.mounts[0].client_system, appendcmd) self.assertEqual(ret, 0, err) g.log.info('Finished append on files after bringing bricks online') ret, _, err = g.run(self.mounts[0].client_system, readcmd) self.assertEqual(ret, 0, err) g.log.info('Finished read on files after bringing bricks online') # check the heal info and completion ec_check_heal_comp(self) # Log Volume Info and Status after bringing the brick up g.log.info("Logging volume info and status") ret = log_volume_info_and_status(self.mnode, self.volname) self.assertTrue(ret, ("Logging volume info and status failed " "on volume %s", self.volname)) g.log.info( "Successful in logging volume info and status " "of volume %s", self.volname)
def test_root_squash_enable(self): """ Tests to verify Nfs Ganesha rootsquash functionality with multi client Steps: 1. Create some directories on mount point. 2. Create some files inside those directories 3. Set permission as 777 for mount point 4. Enable root-squash on volume 5. Edit file created by root user from client 2 It should not allow to edit the file 6. Create some directories on mount point. 7. Create some files inside the directories Files and directories will be created by nfsnobody user 8. Edit the file created in step 7 It should allow to edit the file 9. Disable root squash 10. Edit the file created at step 7 It should allow to edit the file """ # Create Directories on Mount point cmd = ("for i in {1..10}; do mkdir %s/dir$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Create files inside directories on mount point. cmd = ("for i in {1..10}; do touch %s/dir$i/file$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successful in getting stats of files/dirs " "from mount point") # Set mount point permission to 777 ret = set_file_permissions(self.mounts[0].client_system, self.mounts[0].mountpoint, 777) self.assertTrue(ret, "Failed to set permission for directory") g.log.info("Successfully set permissions for directory") # Enable root-squash on volume ret = set_root_squash(self.servers[0], self.volname) self.assertTrue(ret, "Failed to enable root-squash on volume") g.log.info("root-squash is enable on the volume") # Edit file created by root user from client 2 ret = append_string_to_file( self.mounts[1].client_system, "%s/dir5/file5" % self.mounts[1].mountpoint, 'hello') self.assertFalse( ret, "Unexpected:nfsnobody user editing file " "created by root user should FAIL") g.log.info("Successful:nfsnobody user failed to edit file " "created by root user") # Create Directories on Mount point cmd = ("for i in {1..10}; do mkdir %s/SquashDir$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Create files inside directories on mount point cmd = ("for i in {1..10}; do touch %s/SquashDir$i/Squashfile$i;" "done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successful in getting stats of files/dirs " "from mount point") # Edit the file created by nfsnobody user from client 2 ret = append_string_to_file( self.mounts[1].client_system, "%s/SquashDir5/Squashfile5" % self.mounts[1].mountpoint, 'hello') self.assertTrue( ret, "Unexpected:nfsnobody user failed to edit " "the file created by nfsnobody user") g.log.info("Successful:nfsnobody user successfully edited the " "file created by nfsnobody user") # Disable root-squash ret = set_root_squash(self.servers[0], self.volname, squash=False, do_refresh_config=True) self.assertTrue(ret, "Failed to disable root-squash on volume") g.log.info("root-squash is disabled on the volume") # Edit the file created by nfsnobody user from root user ret = append_string_to_file( self.mounts[1].client_system, "%s/SquashDir10/Squashfile10" % self.mounts[1].mountpoint, 'hello') self.assertTrue( ret, "Unexpected:root user failed to edit " "the file created by nfsnobody user") g.log.info("Successful:root user successfully edited the " "file created by nfsnobody user")
def test_root_squash_mount_unmount(self): """ Tests to verify Nfs Ganesha rootsquash functionality when volume is remounted Steps: 1. Set permission as 777 for mount point 2. Create some files and dirs inside mount point 3. Enable root-squash on volume 4. Create some more files and dirs inside mount point 5. Unmount the volume 6. Remount the volume 7. Try to edit file created in step 2 It should not allow to edit the file 8. Try to edit the file created in step 4 It should allow to edit the file 9. Create some more files and directory inside mount point It should be created as nobody user 10. Disable root-squash on volume 11. Edit any of the file created in step 2. It should allow to edit the file """ # Set mount point permission to 777 ret = set_file_permissions(self.mounts[0].client_system, self.mounts[0].mountpoint, 777) self.assertTrue(ret, "Failed to set permission for directory") g.log.info("Successfully set permissions for directory") # Create Directories on Mount point cmd = ("for i in {1..20}; do mkdir %s/dir$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Create multiple files inside directories on mount point. for i in range(1, 21): cmd = ("for j in {1..20}; do touch %s/dir%s/file$j; done" % (self.mounts[0].mountpoint, i)) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successful in getting stats of files/dirs " "from mount point") # Enable root-squash on volume ret = set_root_squash(self.servers[0], self.volname) self.assertTrue(ret, "Failed to enable root-squash on volume") g.log.info("root-squash is enable on the volume") # Create some more Directories after enabling root-squash cmd = ("for i in {1..20}; do mkdir %s/squashed_dir$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Create some more files inside directories for i in range(1, 21): cmd = ("for j in {1..20}; do touch " "%s/squashed_dir%s/squashed_file$j; done" % (self.mounts[0].mountpoint, i)) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successful in getting stats of files/dirs " "from mount point") # Unmount volume ret = unmount_mounts(self.mounts) self.assertTrue(ret, "Volume unmount failed for %s" % self.volname) # Remount volume ret = self.mount_volume(self.mounts) self.assertTrue(ret, "Volume mount failed for %s" % self.volname) # Edit file created by root user for mount_obj in self.mounts: ret = append_string_to_file( mount_obj.client_system, "%s/dir10/file10" % mount_obj.mountpoint, 'hello') self.assertFalse( ret, "Unexpected:nobody user editing file " "created by root user should FAIL") g.log.info("Successful:nobody user failed to edit file " "created by root user") # Edit the file created by nobody user for mount_obj in self.mounts: ret = append_string_to_file( mount_obj.client_system, "%s/squashed_dir10/squashed_file10" % mount_obj.mountpoint, 'hello') self.assertTrue( ret, "Unexpected:nobody user failed to edit " "the file created by nobody user") g.log.info("Successful:nobody user successfully edited the " "file created by nobody user") # Create some more files on mount point post remount. cmd = ("for i in {1..20}; do touch %s/remount_file$i; done" % self.mounts[0].mountpoint) ret, _, err = g.run(self.mounts[0].client_system, cmd, user=self.mounts[0].user) self.assertEqual(ret, 0, err) # Get stat of all the files/dirs created. ret = get_mounts_stat(self.mounts) self.assertTrue(ret, "Stat failed on some of the clients") g.log.info("Successful in getting stats of files/dirs " "from mount point") # Check for owner and group of all the files for mount_obj in self.mounts: for i in range(1, 21): cmd = ( "ls -l %s/remount_file%i | awk '{ print $3, $4 }' |sort" % (mount_obj.mountpoint, i)) ret, out, err = g.run(mount_obj.client_system, cmd) self.assertFalse(ret, err) if is_rhel7: self.assertIn("nobody nobody", out, "Owner and group is not nobody") else: self.assertIn("nfsnobody nfsnobody", out, "Owner and group is not nobody") g.log.info("Owner and group of file is nobody") # Disable root-squash ret = set_root_squash(self.mnode, self.volname, squash=False, do_refresh_config=True) self.assertTrue(ret, "Failed to disable root-squash on volume") g.log.info("root-squash is disable on the volume") # Edit file created by root user for mount_obj in self.mounts: ret = append_string_to_file( mount_obj.client_system, "%s/dir15/file15" % mount_obj.mountpoint, 'hello') self.assertTrue( ret, "Unexpected:root user should be allowed to " "edit the file created by root user") g.log.info("Successful:root user successful in editing file " "created by root user")