기능승인과 push

receipt

명령 하나가 어떻게 끝났는지 남는 기록을 읽는다

메시지, 제어(interrupt·pause·resume·close·terminate·복구 결정·프로필 변경), push 요청과 결정, 계정·key 관리 같은 명령은 receipt를 남긴다. receipt는 누가(actor), 무엇을(operation, target_ref) 했고 어떻게 끝났는지(status, result, error)를 담는다. 비동기 명령은 응답의 receipt_status가 accepted이고, 끝났는지는 receipt를 다시 읽어 본다. scope는 sessions:read다.

status뜻
accepted받았고 아직 끝나지 않았다
succeeded끝났다. 결과는 result
failed거절되거나 실패했다. 이유는 error와 result.refusal
unknown결과를 알 수 없다

읽기

응답의 receipt_id로 receipts.get(GET /v1/receipts/{id})을 부른다. 거부에서 만든 요청의 receipt를 읽는다.

const pr = await werft.sessions.pushRequests.get(sessionId, second.id);
for (const id of [pr.request_receipt_id, pr.resolution_receipt_id]) {
  if (!id) continue;
  const receipt = await werft.receipts.get(id);
  const result = receipt.result as { action?: string | null } | null;
  console.log(receipt.operation, receipt.status, result?.action);
}
request_push succeeded null
resolve_push succeeded reject

거절된 요청은 오류 본문의 error.details.receipt_id가 그 receipt를 가리킨다. 거절도 기록이 남는다는 뜻이다.

이름을 바꾸기 전 버전의 서버가 남긴 승인·거절 receipt는 operation이 decide_push이고 값이 result.decision에 있다. 다시 결정한 시도의 refusal은 already_decided다. 지난 receipt는 그대로 읽힌다.

끝날 때까지 기다리기

비동기 제어의 receipt는 accepted에서 succeeded나 failed로 바뀐다. 기다리는 동안 다른 결과가 나와도 멈추도록 둘 다 본다. SDK의 waitForReceipt는 accepted가 아닌 값이 될 때까지 기다린다.

import { waitForReceipt } from "@werft-ai/sdk";

const { revision } = await werft.sessions.get(sessionId);
const paused = await werft.sessions.pause(sessionId, {
  expected_revision: revision,
  reason: "lunch",
});
const receipt = await waitForReceipt(werft, paused.receipt_id);
const state = receipt.result as { resulting_admission_state?: string } | null;
console.log(receipt.operation, receipt.status, state?.resulting_admission_state);
pause succeeded paused

receipt에는 비밀 값이 들어가지 않는다. 남의 범위에 있는 receipt는 404다.

다음 단계

  • GitHub: push한 브랜치로 PR을 열고 코멘트를 단다

이 페이지