Add MAIN-to-RX acknowledgement channel
This commit is contained in:
@@ -20,7 +20,19 @@ ROOT = Path(__file__).resolve().parents[1]
|
||||
if str(ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(ROOT))
|
||||
|
||||
from tools.rf_handoff_channel import GitResultChannel, load_result # noqa: E402
|
||||
from tools.rf_handoff_channel import ( # noqa: E402
|
||||
EXPECTED_RX_TASK_ID,
|
||||
GitResultChannel,
|
||||
load_result,
|
||||
)
|
||||
from tools.tx_handoff_channel import ( # noqa: E402
|
||||
CHANNEL_TEST_COMPLETE_COMMIT,
|
||||
CHANNEL_TEST_COMPLETE_DIGEST,
|
||||
CHANNEL_TEST_READY_COMMIT,
|
||||
CHANNEL_TEST_READY_DIGEST,
|
||||
GitAcknowledgementChannel,
|
||||
channel_test_acknowledgements,
|
||||
)
|
||||
|
||||
|
||||
DEFAULT_TASK_PATH = "docs/handoff/NEXT_RX_TASK.md"
|
||||
@@ -81,6 +93,10 @@ class WatcherState:
|
||||
deferred_task_id: str | None = None
|
||||
running: bool = False
|
||||
pid: int | None = None
|
||||
channel_test_ready_digest: str | None = None
|
||||
channel_test_complete_digest: str | None = None
|
||||
channel_test_ready_ack_commit: str | None = None
|
||||
channel_test_complete_ack_commit: str | None = None
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -387,6 +403,70 @@ class GitTaskSource:
|
||||
return text, head
|
||||
|
||||
|
||||
def confirm_main_channel_test(
|
||||
repository: Path,
|
||||
state: WatcherState,
|
||||
*,
|
||||
remote: str = "origin",
|
||||
result_branch: str = "rx-node",
|
||||
acknowledgement_branch: str = "tx-node",
|
||||
output_function: Callable[[str], None] = print,
|
||||
) -> WatcherState:
|
||||
"""Confirm that MAIN acknowledged both exact channel-test events."""
|
||||
|
||||
rx_channel = GitResultChannel(
|
||||
repository,
|
||||
remote=remote,
|
||||
branch=result_branch,
|
||||
)
|
||||
rx_channel.fetch()
|
||||
ready_result, ready_digest, _ready_commit = rx_channel.read_commit(
|
||||
CHANNEL_TEST_READY_COMMIT
|
||||
)
|
||||
complete_result, complete_digest, _complete_commit = rx_channel.read_commit(
|
||||
CHANNEL_TEST_COMPLETE_COMMIT
|
||||
)
|
||||
if ready_digest != CHANNEL_TEST_READY_DIGEST:
|
||||
raise ValueError("historical channel-test READY digest is wrong")
|
||||
if complete_digest != CHANNEL_TEST_COMPLETE_DIGEST:
|
||||
raise ValueError("historical channel-test COMPLETE digest is wrong")
|
||||
if ready_result.source_head != complete_result.source_head:
|
||||
raise ValueError("channel-test source HEAD changed between READY and COMPLETE")
|
||||
|
||||
acknowledgement_channel = GitAcknowledgementChannel(
|
||||
repository,
|
||||
remote=remote,
|
||||
branch=acknowledgement_branch,
|
||||
)
|
||||
confirmations = channel_test_acknowledgements(
|
||||
acknowledgement_channel,
|
||||
expected_source_head=ready_result.source_head,
|
||||
ready_source_commit=CHANNEL_TEST_READY_COMMIT,
|
||||
ready_source_digest=CHANNEL_TEST_READY_DIGEST,
|
||||
complete_source_commit=CHANNEL_TEST_COMPLETE_COMMIT,
|
||||
complete_source_digest=CHANNEL_TEST_COMPLETE_DIGEST,
|
||||
)
|
||||
if not confirmations.ready_confirmed:
|
||||
raise ValueError("MAIN READY acknowledgement is not confirmed")
|
||||
if not confirmations.complete_confirmed:
|
||||
raise ValueError("MAIN COMPLETE acknowledgement is not confirmed")
|
||||
|
||||
state.channel_test_ready_digest = CHANNEL_TEST_READY_DIGEST
|
||||
state.channel_test_complete_digest = CHANNEL_TEST_COMPLETE_DIGEST
|
||||
state.channel_test_ready_ack_commit = confirmations.ready_ack_commit
|
||||
state.channel_test_complete_ack_commit = confirmations.complete_ack_commit
|
||||
output_function("MAIN READY RECEIVED = CONFIRMED")
|
||||
output_function("MAIN COMPLETE RECEIVED = CONFIRMED")
|
||||
output_function(
|
||||
f"MAIN READY ACK COMMIT = {confirmations.ready_ack_commit}"
|
||||
)
|
||||
output_function(
|
||||
f"MAIN COMPLETE ACK COMMIT = {confirmations.complete_ack_commit}"
|
||||
)
|
||||
output_function("RF TX = 0")
|
||||
return state
|
||||
|
||||
|
||||
def handle_task(
|
||||
task_text: str,
|
||||
source_head: str,
|
||||
@@ -588,6 +668,16 @@ def run_watcher(arguments: argparse.Namespace) -> int:
|
||||
else:
|
||||
source.fetch()
|
||||
task_text, source_head = source.read()
|
||||
task = parse_task(task_text)
|
||||
if task.task_id == EXPECTED_RX_TASK_ID and not arguments.dry_run:
|
||||
confirm_main_channel_test(
|
||||
arguments.repository.resolve(),
|
||||
state,
|
||||
remote=arguments.remote,
|
||||
result_branch=arguments.result_branch,
|
||||
acknowledgement_branch=arguments.acknowledgement_branch,
|
||||
)
|
||||
save_state(state_path, state)
|
||||
status, state = handle_task(
|
||||
task_text,
|
||||
source_head,
|
||||
@@ -637,6 +727,7 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
parser.add_argument("--mark-completed")
|
||||
parser.add_argument("--publish-result", type=Path)
|
||||
parser.add_argument("--result-branch", default="rx-node")
|
||||
parser.add_argument("--acknowledgement-branch", default="tx-node")
|
||||
return parser
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user