Carinaの
carina plan
コマンドの表示を最近まとめて改善したので、その内容を書いておく。
plan表示の改善を始める前に、まずテストの仕組みを整えた。plan表示は目視で確認するのが面倒だし、変更のたびに既存の表示が壊れていないか確認するのも大変なので、 insta を使ったスナップショットテストを導入した。
仕組みはシンプルで、テスト用の
.crn
ファイル(とオプションでstateファイル)をfixtureとして用意し、それに対して
format_plan()
を実行した結果をスナップショットとして保存する。テスト実行時にスナップショットと一致しなければ失敗する。表示を変更した場合は
cargo insta review
で差分を確認してスナップショットを更新すれば良い。
plan表示はANSIカラーコードを含むので、スナップショットの可読性のためにカラーコードをstripしてからスナップショットに保存している。
これにより、表示の改善を安心してガンガン進められるようになった。実際のスナップショットは こちら にあるので、どんな表示になるのかはここを見るとわかる。
Terraformの
terraform plan
はリソースをフラットなリストで表示する。リソース間に依存関係があっても、出力上はすべて同じ階層にフラットに並ぶ。さらにリソース名のアルファベット順でソートされるので、依存関係のあるリソース同士が離れた位置に表示されることもある。結果として、どのリソースがどのリソースに依存しているかは人間が属性値を見て判断する必要がある。
Carinaではリソース間の依存関係をツリー構造で表示するようにした。
VPCの下にroute_tableとsubnetがぶら下がっているのが視覚的にわかる。Create、Update、Destroyが混在する場合でも、依存関係の中で何が起きるかがひと目でわかる。
リソースを作成する際、ARNやIDのようなread-only属性はAWS側が自動的に割り当てる。以前のplan表示ではこれらは完全に省略されていたが、Terraformと同様に
(known after apply)
として表示するようにした。
これにより、リソース作成後にどんな属性が生えてくるのかがplanの時点でわかるようになった。
スキーマにデフォルト値が定義されている属性も、ユーザが明示的に指定していなければplanに表示されていなかった。これを
# default
アノテーション付きで表示するようにした。
ユーザが指定した属性、デフォルト値が適用される属性、apply後に確定するread-only属性、という3層が一目でわかる。
Update/Replaceの際、変更されない属性がいくつあるかを
# (3 unchanged attributes hidden)
のようなサマリ行で表示するようにした。
--detail
フラグによる表示レベルの制御
--detail
フラグで表示レベルを制御できるようにした。3つのモードがある。
.crn
ファイルで明示的に指定した属性のみ表示
デフォルトの
--detail full
だとこう。
--detail explicit
だとこうなる。
--detail none
だとリソース名と依存ツリーのみになる。リソース数が多いときに全体の構造だけさくっと確認したい場合に便利。
CLIの表示とは別に、
--tui
フラグでTUI(Terminal UI)も使えるようにした。ratatuiとcrosstermで実装している。
主な機能は以下の通り。
/
キーで検索モードに入り、リソース名やタイプでフィルタ。Tabキーで補完、
n
/
N
でマッチ間を移動
vpc_id: vpc.vpc_id
のようなリソース参照をEnterキーで辿れる。Backspaceで戻る
これらの改善は、Terraformのplan表示を参考にしつつ、ツリー表示やTUIのようなCarina独自の機能も加えている。applyする前にリソースの全体像を把握しやすくなった。