def test_edenfs_starting(self, mock_get_roots_for_nuclide, mock_watchman): instance = FakeEdenInstance(self.make_temporary_directory(), status=fb303_status.STARTING) instance.create_test_mount("eden-mount") out = TestOutput() dry_run = False exit_code = doctor.cure_what_ails_you( instance, dry_run, FakeMountTable(), fs_util=FakeFsUtil(), proc_utils=self.make_proc_utils(), kerberos_checker=FakeKerberosChecker(), out=out, ) self.assertEqual( """\ <yellow>- Found problem:<reset> Eden is currently still starting. Please wait for edenfs to finish starting. If Eden seems to be taking too long to start you can try restarting it with "eden restart" <yellow>1 issue requires manual attention.<reset> Ask in the Eden Users group if you need help fixing issues with Eden: https://fb.facebook.com/groups/eden.users/ """, out.getvalue(), ) self.assertEqual(1, exit_code)
def test_edenfs_stopping(self, mock_get_roots_for_nuclide, mock_watchman): instance = FakeEdenInstance(self.make_temporary_directory(), status=fb303_status.STOPPING) instance.create_test_mount("eden-mount") out = TestOutput() dry_run = False exit_code = doctor.cure_what_ails_you( instance, dry_run, FakeMountTable(), fs_util=FakeFsUtil(), proc_utils=self.make_proc_utils(), kerberos_checker=FakeKerberosChecker(), out=out, ) self.assertEqual( """\ <yellow>- Found problem:<reset> Eden is currently shutting down. Either wait for edenfs to exit, or to forcibly kill Eden, run: eden stop --kill <yellow>1 issue requires manual attention.<reset> Ask in the Eden Users group if you need help fixing issues with Eden: https://fb.facebook.com/groups/eden.users/ """, out.getvalue(), ) self.assertEqual(1, exit_code)
def test_edenfs_not_running(self, mock_get_roots_for_nuclide, mock_watchman): instance = FakeEdenInstance(self.make_temporary_directory(), status=fb303_status.DEAD) instance.create_test_mount("eden-mount") out = TestOutput() dry_run = False exit_code = doctor.cure_what_ails_you( instance, dry_run, FakeMountTable(), fs_util=FakeFsUtil(), proc_utils=self.make_proc_utils(), out=out, ) self.assertEqual( """\ <yellow>- Found problem:<reset> Eden is not running. To start Eden, run: eden start <yellow>1 issue requires manual attention.<reset> Ask in the Eden Users group if you need help fixing issues with Eden: https://fb.facebook.com/groups/eden.users/ """, out.getvalue(), ) self.assertEqual(1, exit_code)
def test_eden_not_in_use(self, mock_get_roots_for_nuclide, mock_watchman): instance = FakeEdenInstance(self.make_temporary_directory(), status=fb303_status.DEAD) out = TestOutput() dry_run = False exit_code = doctor.cure_what_ails_you( instance, dry_run, FakeMountTable(), fs_util=FakeFsUtil(), proc_utils=self.make_proc_utils(), out=out, ) self.assertEqual("EdenFS is not in use.\n", out.getvalue()) self.assertEqual(0, exit_code)
def test_eden_not_in_use(self, mock_get_roots_for_nuclide, mock_watchman) -> None: instance = FakeEdenInstance(self.make_temporary_directory(), status=fb303_status.DEAD) out = TestOutput() dry_run = False exit_code = doctor.cure_what_ails_you( # pyre-fixme[6]: For 1st param expected `EdenInstance` but got # `FakeEdenInstance`. instance, dry_run, FakeMountTable(), fs_util=FakeFsUtil(), proc_utils=self.make_proc_utils(), kerberos_checker=FakeKerberosChecker(), out=out, ) self.assertEqual("EdenFS is not in use.\n", out.getvalue()) self.assertEqual(0, exit_code)
def setUp(self) -> None: self.active_mounts: List[bytes] = [b"/mnt/active1", b"/mnt/active2"] self.mount_table = FakeMountTable() self.mount_table.add_mount("/mnt/active1") self.mount_table.add_mount("/mnt/active2")
class StaleMountsCheckTest(DoctorTestBase): maxDiff = None def setUp(self) -> None: self.active_mounts: List[bytes] = [b"/mnt/active1", b"/mnt/active2"] self.mount_table = FakeMountTable() self.mount_table.add_mount("/mnt/active1") self.mount_table.add_mount("/mnt/active2") def run_check(self, dry_run: bool) -> Tuple[doctor.ProblemFixer, str]: fixer, out = self.create_fixer(dry_run) check_stale_mounts.check_for_stale_mounts(fixer, mount_table=self.mount_table) return fixer, out.getvalue() def test_does_not_unmount_active_mounts(self): fixer, out = self.run_check(dry_run=False) self.assertEqual("", out) self.assert_results(fixer, num_problems=0) self.assertEqual([], self.mount_table.unmount_lazy_calls) self.assertEqual([], self.mount_table.unmount_force_calls) def test_working_nonactive_mount_is_not_unmounted(self): # Add a working edenfs mount that is not part of our active list self.mount_table.add_mount("/mnt/other1") fixer, out = self.run_check(dry_run=False) self.assertEqual("", out) self.assert_results(fixer, num_problems=0) self.assertEqual([], self.mount_table.unmount_lazy_calls) self.assertEqual([], self.mount_table.unmount_force_calls) def test_force_unmounts_if_lazy_fails(self): self.mount_table.add_stale_mount("/mnt/stale1") self.mount_table.add_stale_mount("/mnt/stale2") self.mount_table.fail_unmount_lazy(b"/mnt/stale1") fixer, out = self.run_check(dry_run=False) self.assertEqual( f"""\ <yellow>- Found problem:<reset> Found 2 stale edenfs mounts: /mnt/stale1 /mnt/stale2 Unmounting 2 stale edenfs mounts...<green>fixed<reset> """, out, ) self.assert_results(fixer, num_problems=1, num_fixed_problems=1) self.assertEqual([b"/mnt/stale1", b"/mnt/stale2"], self.mount_table.unmount_lazy_calls) self.assertEqual([b"/mnt/stale1"], self.mount_table.unmount_force_calls) def test_dry_run_prints_stale_mounts_and_does_not_unmount(self): self.mount_table.add_stale_mount("/mnt/stale1") self.mount_table.add_stale_mount("/mnt/stale2") fixer, out = self.run_check(dry_run=True) self.assertEqual( f"""\ <yellow>- Found problem:<reset> Found 2 stale edenfs mounts: /mnt/stale1 /mnt/stale2 Would unmount 2 stale edenfs mounts """, out, ) self.assert_results(fixer, num_problems=1) self.assertEqual([], self.mount_table.unmount_lazy_calls) self.assertEqual([], self.mount_table.unmount_force_calls) def test_fails_if_unmount_fails(self): self.mount_table.add_stale_mount("/mnt/stale1") self.mount_table.add_stale_mount("/mnt/stale2") self.mount_table.fail_unmount_lazy(b"/mnt/stale1", b"/mnt/stale2") self.mount_table.fail_unmount_force(b"/mnt/stale1") fixer, out = self.run_check(dry_run=False) self.assertEqual( f"""\ <yellow>- Found problem:<reset> Found 2 stale edenfs mounts: /mnt/stale1 /mnt/stale2 Unmounting 2 stale edenfs mounts...<red>error<reset> Failed to fix problem: Failed to unmount 1 mount point: /mnt/stale1 """, out, ) self.assert_results(fixer, num_problems=1, num_failed_fixes=1) self.assertEqual([b"/mnt/stale1", b"/mnt/stale2"], self.mount_table.unmount_lazy_calls) self.assertEqual([b"/mnt/stale1", b"/mnt/stale2"], self.mount_table.unmount_force_calls) def test_ignores_noneden_mounts(self): self.mount_table.add_mount("/", device="/dev/sda1", vfstype="ext4") fixer, out = self.run_check(dry_run=False) self.assertEqual("", out) self.assert_results(fixer, num_problems=0) self.assertEqual([], self.mount_table.unmount_lazy_calls) self.assertEqual([], self.mount_table.unmount_force_calls) def test_ignores_errors_other_than_enotconn(self): self.mount_table.fail_access("/mnt/active1", errno.EPERM) self.mount_table.fail_access("/mnt/active1/.eden", errno.EPERM) fixer, out = self.run_check(dry_run=False) self.assertEqual("", out) self.assert_results(fixer, num_problems=0) def test_does_not_unmount_if_cannot_stat_stale_mount(self): self.mount_table.add_mount("/mnt/stale1") self.mount_table.fail_access("/mnt/stale1", errno.EACCES) self.mount_table.fail_access("/mnt/stale1/.eden", errno.EACCES) with self.assertLogs() as logs_assertion: fixer, out = self.run_check(dry_run=False) self.assertEqual("", out) self.assertEqual(0, fixer.num_problems) self.assertEqual([], self.mount_table.unmount_lazy_calls) self.assertEqual([], self.mount_table.unmount_force_calls) # Verify that the reason for skipping this mount is logged. self.assertIn( "Unclear whether /mnt/stale1 is stale or not. " "lstat() failed: [Errno 13] Permission denied", "\n".join(logs_assertion.output), ) def test_does_unmount_if_stale_mount_is_unconnected(self): self.mount_table.add_stale_mount("/mnt/stale1") fixer, out = self.run_check(dry_run=False) self.assertEqual( f"""\ <yellow>- Found problem:<reset> Found 1 stale edenfs mount: /mnt/stale1 Unmounting 1 stale edenfs mount...<green>fixed<reset> """, out, ) self.assert_results(fixer, num_problems=1, num_fixed_problems=1) self.assertEqual([b"/mnt/stale1"], self.mount_table.unmount_lazy_calls) self.assertEqual([], self.mount_table.unmount_force_calls) def test_does_not_unmount_other_users_mounts(self): self.mount_table.add_mount("/mnt/stale1", uid=os.getuid() + 1) fixer, out = self.run_check(dry_run=False) self.assertEqual("", out) self.assert_results(fixer, num_problems=0) self.assertEqual([], self.mount_table.unmount_lazy_calls) self.assertEqual([], self.mount_table.unmount_force_calls) def test_does_not_unmount_mounts_with_same_device_as_active_mount(self): active1_dev = self.mount_table.lstat("/mnt/active1").st_dev self.mount_table.add_mount("/mnt/stale1", dev=active1_dev) fixer, out = self.run_check(dry_run=False) self.assertEqual("", out) self.assert_results(fixer, num_problems=0) self.assertEqual([], self.mount_table.unmount_lazy_calls) self.assertEqual([], self.mount_table.unmount_force_calls)