TL; DR
- フィールド名が
PascalCase
->camelCase
に変更
$ govc vm.info -json DC0_H0_VM0 | jq .VirtualMachines[].Self
{
"Type": "VirtualMachine",
"Value": "vm-55"
}
$ ./govc vm.info -json DC0_H0_VM0 | jq .virtualMachines[].Self
{
"type": "VirtualMachine",
"value": "vm-55"
}
はじめに
9/25にgovmomi 0.31が、そして間をおかず9/29に 0.32 が実装されました1。このリリースは影響範囲の広い破壊的変更を含みます。
破壊的変更:フィールド名がPascalCaseからcamelCaseに変更
冒頭の例の通り、vCenterレスポンスモデルをJSON化する際にフィールド名の先頭が大文字から小文字になりました。
これに伴い、govcの -json
オプションによる出力結果が変わります。
$ govc version
govc 0.30.0
$ govc vm.info -json DC0_H0_VM0 | jq .VirtualMachines[].Self
{
"Type": "VirtualMachine",
"Value": "vm-55"
}
$ ./govc version
govc 0.32.0
# キーがcamelCaseになっている(jqのフィルタも変えていることに注意!)
$ ./govc vm.info -json DC0_H0_VM0 | jq .virtualMachines[].Self
{
"type": "VirtualMachine",
"value": "vm-55"
}
スクリプト等でgovcが出力しているJSONを使っていた場合、0.31以上に上げると動かなくなってしまいます。
$ govc vm.info -json DC0_H0_VM0 | jq .VirtualMachines[].Self
jq: error (at <stdin>:494): Cannot iterate over null (null)
対応
上記のように、キーをcamelCaseに変えることで対応可能です。
しかし、スクリプト全体のフィールド名を逐一書き換えると手間がかかります。
別のアイデアとして、本記事ではjqで 「フィールド名をPascalCaseに戻すフィルタ」 を噛ませます。
$ ./govc vm.info -json DC0_H0_VM0 | jq 'walk(if type=="object" then with_entries(.key|=(.[0:1] | ascii_upcase) + .[1:]) else . end)' | jq '.Virtua
lMachines[].Self'
{
"Type": "VirtualMachine",
"Value": "vm-55"
}
フィルタ jq 'walk(if type=="object" then with_entries(.key|=(.[0:1] | ascii_upcase) + .[1:]) else . end)'
で、キーの先頭を大文字にしています。
仕組みは以下の通りです。(jq
の話なので使うだけであれば気にしなくてokです)
-
with_entries
でオブジェクトの各キー、値に対しmap処理を適用 - キーの一文字目だけ大文字化して自身に代入 (
|=
)
-
0.31から1週間たたずに0.32がリリースされフィールド名変更範囲が追加されたため、改修は完了していないかもしれません。 ↩