release_state_machine.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from ray_release.test_automation.state_machine import (
  2. TestStateMachine,
  3. WEEKLY_RELEASE_BLOCKER_TAG,
  4. )
  5. from ray_release.test import Test, TestState
  6. CONTINUOUS_FAILURE_TO_JAIL = 3 # Number of continuous failures before jailing
  7. UNSTABLE_RELEASE_TEST_TAG = "unstable-release-test"
  8. class ReleaseTestStateMachine(TestStateMachine):
  9. """
  10. State transition logic
  11. """
  12. def _move_hook(self, from_state: TestState, to_state: TestState) -> None:
  13. change = (from_state, to_state)
  14. if change == (TestState.PASSING, TestState.CONSITENTLY_FAILING):
  15. self._create_github_issue()
  16. elif change == (TestState.FAILING, TestState.CONSITENTLY_FAILING):
  17. self._create_github_issue()
  18. elif change == (TestState.CONSITENTLY_FAILING, TestState.PASSING):
  19. self._close_github_issue()
  20. elif change == (TestState.PASSING, TestState.FAILING):
  21. self._trigger_bisect()
  22. elif change == (TestState.CONSITENTLY_FAILING, TestState.JAILED):
  23. self._jail_test()
  24. elif change == (TestState.JAILED, TestState.PASSING):
  25. self._close_github_issue()
  26. def _state_hook(self, state: TestState) -> None:
  27. if state == TestState.JAILED:
  28. self._keep_github_issue_open()
  29. if state == TestState.PASSING:
  30. self.test.pop(Test.KEY_BISECT_BUILD_NUMBER, None)
  31. self.test.pop(Test.KEY_BISECT_BLAMED_COMMIT, None)
  32. def _consistently_failing_to_jailed(self) -> bool:
  33. return len(self.test_results) >= CONTINUOUS_FAILURE_TO_JAIL and all(
  34. result.is_failing()
  35. for result in self.test_results[:CONTINUOUS_FAILURE_TO_JAIL]
  36. )
  37. def _passing_to_flaky(self) -> bool:
  38. return False
  39. def _consistently_failing_to_flaky(self) -> bool:
  40. return False
  41. def _flaky_to_passing(self) -> bool:
  42. return False
  43. def _flaky_to_jailed(self) -> bool:
  44. return False
  45. """
  46. Action hooks performed during state transitions
  47. """
  48. def _create_github_issue(self) -> None:
  49. labels = [
  50. "P0",
  51. "bug",
  52. "release-test",
  53. "ray-test-bot",
  54. "stability",
  55. "triage",
  56. self.test.get_oncall(),
  57. ]
  58. if not self.test.is_stable():
  59. labels.append(UNSTABLE_RELEASE_TEST_TAG)
  60. else:
  61. labels.append(WEEKLY_RELEASE_BLOCKER_TAG)
  62. issue_number = self.ray_repo.create_issue(
  63. title=f"Release test {self.test.get_name()} failed",
  64. body=(
  65. f"Release test **{self.test.get_name()}** failed. "
  66. f"See {self.test_results[0].url} for more details.\n\n"
  67. f"Managed by OSS Test Policy"
  68. ),
  69. labels=labels,
  70. ).number
  71. self.test[Test.KEY_GITHUB_ISSUE_NUMBER] = issue_number