2023/9/9 Terraform google_monitoring_slo がおかしい
自動採番される slo_id のパターンが厳しすぎて合わない、A-Z 大文字アルファベットも含まれうる
import したけど適用できない状態に陥る
2. import したら service が null になる
ここで取り組まれていたけど放置されている
3. rolling_period_days と calendar_period は択一だけど両方 import されて次回バリデーションエラーになる
前は asdf で ruby 入れていると進まなかった気がするけど行けたわ
1. SLO 作ってみて自動採番の値を確認する
えー API ドキュメントが [a-z0-9\-]+ じゃん
コンソールから作る & API で作る
自動採番されても入力しても大文字が入る
https://gyazo.com/de29aa168f3cf17a539010d8c8c55370 https://gyazo.com/8446dfa93f39620314c8ce6f8f89428f
実際には : とかも入れられる
日本語送りつけるとエラーメッセージから実際のパターン分かる
^[a-zA-Z0-9-_:.]+$ じゃねーか
code:error.json
{
"error": {
"code": 400,
"message": "Resource names must match pattern ^[a-zA-Z0-9-_:.]+$. Got value \"日本語\"",
"status": "INVALID_ARGUMENT"
}
}
code:feedback
The serviceLevelObjectiveId pattern differs from its actual behavior on services.serviceLevelObjectives.create.
This page says
But it's actually
This can be obtained from the error message when requesting the API with multibyte characters. And when an input is omitted in the console, the auto-generated ID includes uppercase letters.
product は monitoring
$ make provider VERSION=ga OUTPUT_PATH="$GOPATH/src/github.com/hashicorp/terraform-provider-google" PRODUCT=monitoring
$ make provider VERSION=beta OUTPUT_PATH="$GOPATH/src/github.com/hashicorp/terraform-provider-google-beta" PRODUCT=monitoring
make test 2分ぐらい
これは go 内で完結していそう
受け入れテストは実際に API 叩いていそう!!
$ make testacc TEST=./google/services/monitoring TESTARGS='-run=TestAccMonitoringSlo_'
これも2分ぐらいだけどコンソールで見てるとリソース作られては消えて...となっている
これ service の id もパターンおかしいね
$ make testacc TEST=./google/services/monitoring TESTARGS='-run=TestAccMonitoringService_'
検証をよりゆるくするので breaking changes ではないはず
Self-review your PR のリンクミスってる
なんかめっちゃ大変だったな
自前でビルドしたプロバイダを使うには
magic-modules でビルドして
terraform-provider-google で make build して
code:tf-dev-override.tfrc
provider_installation {
dev_overrides {
"hashicorp/google" = "/Users/pokutuna/go/bin"
"hashicorp/google-beta" = "/Users/pokutuna/go/bin"
}
direct {}
}
$ TF_CLI_CONFIG_FILE=./tf-dev-override.tfrc terraform plan
custom_import などではおもむろに log.Printf してもいい
2. の service の import も直したい
api_name ない、これ設定したら import 時によしなにしてくれる?
default_from_api も関係ある? import 時に見られる? 生成時の話?
api_name と連携して機能する?
生成される?
カスタムインポート作るしかない?
今 self_link_as_name だけどこれ拡張できる?
別に作りつつ self_link_as_name 相当のものを入れる?
constants と encoder は何?
constants はロジックベースのバリデーション書くところ?
encoder はリクエスト時に加工するやつやな
個々の properties 以下の custom ナントカだと思うなあ
custom_flatten で resource_from_self_link みたいなのでいけないのかな
GetResourceNameFromSelfLink がそれっぽいけど、もう一段値を読まないとダメ?
これみると import 時に service_id に束縛はできている、service_id と service の名前の齟齬?
この service_id はどこからきてるんだ?
service に custom_flatten を追加して name 加工する感じかなあ
汎用の custom_flatten/name_from_self_link.erb
tpgresource.NameFromSelfLinkStateFunc(v) 呼ぶ
これはパスの末尾取るだけ
汎用の custom_import/self_link_as_name.erb
これは import id を正規表現で分解するだけ
パターンを複数配列で渡していて project, name を取り出す場合と name だけ取り出すのを順に試す
custom_import やっている例
パラメータ
API 上の name は全体
projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_NAME]
設定上のパラメータは
service: SERVICE_ID
sloId: SLO_NAME
今は
custom_import
self_link_as_name
(sloId) custom_flatten
name_from_self_link
以下の流れがある
リクエスト時
custom_expand 各パラメータを加工
encoder, update_encoder でリソース全体の値を加工
レスポンス時
decoder でリソース全体の値をバラす
custom_flatten で各パラメータ、プロパティの値を加工
schema.Resource
ここに Create, Read, Update, Delete, Importer 等のリソースがある
Importer はスカスカなので read する前段階なのかな
逆じゃね?
https://gyazo.com/309b2a268317df76901b95d115af4c7d