import os
import time
import traceback
+import stat
from io import BytesIO, StringIO
from collections import namedtuple, defaultdict
from textwrap import dedent
-from teuthology.orchestra.run import CommandFailedError
+from teuthology.exceptions import CommandFailedError
from tasks.cephfs.cephfs_test_case import CephFSTestCase, for_teuthology
log = logging.getLogger(__name__)
ValidationError(e, traceback.format_exc(3))
)
+ def assert_true(self, a):
+ try:
+ if not a:
+ raise AssertionError("{0} is not true".format(a))
+ except AssertionError as e:
+ self._errors.append(
+ ValidationError(e, traceback.format_exc(3))
+ )
+
def write(self):
"""
Write the workload files to the mount
return self._errors
+class SymlinkWorkload(Workload):
+ """
+ Symlink file, check that it gets recovered as symlink
+ """
+ def write(self):
+ self._mount.run_shell(["mkdir", "symdir"])
+ self._mount.write_n_mb("symdir/onemegs", 1)
+ self._mount.run_shell(["ln", "-s", "onemegs", "symdir/symlink_onemegs"])
+ self._mount.run_shell(["ln", "-s", "symdir/onemegs", "symlink1_onemegs"])
+
+ def validate(self):
+ self._mount.run_shell(["ls", "symdir"], sudo=True)
+ st = self._mount.lstat("symdir/symlink_onemegs")
+ self.assert_true(stat.S_ISLNK(st['st_mode']))
+ target = self._mount.readlink("symdir/symlink_onemegs")
+ self.assert_equal(target, "onemegs")
+
+ st = self._mount.lstat("symlink1_onemegs")
+ self.assert_true(stat.S_ISLNK(st['st_mode']))
+ target = self._mount.readlink("symlink1_onemegs")
+ self.assert_equal(target, "symdir/onemegs")
+ return self._errors
+
+
class MovedFile(Workload):
def write(self):
# Create a file whose backtrace disagrees with his eventual position
def test_rebuild_simple(self):
self._rebuild_metadata(SimpleWorkload(self.fs, self.mount_a))
+ def test_rebuild_symlink(self):
+ self._rebuild_metadata(SymlinkWorkload(self.fs, self.mount_a))
+
def test_rebuild_moved_file(self):
self._rebuild_metadata(MovedFile(self.fs, self.mount_a))