機能承認と push

receipt

コマンド 1 つがどのように終わったかを記録した receipt を読む

メッセージ、制御(interrupt・pause・resume・close・terminate・復旧判断・プロファイル変更)、push のリクエストと判断、アカウント・キーの管理といったコマンドは、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 を開き、コメントを付ける

このページ