Я нашел туториал Ресурсы - Государственная миграция, в котором описывается процесс реализации миграции состояний для ресурсов, и он отлично сработал для меня, когда я реализовал его для foo
ресурс.
Однако, когда я попытался реализовать то же самое для foo
источник данных, где я буквально повторно использованный использовал те же методы обновления (поскольку миграция одинакова как для ресурса, так и для источника данных):
SchemaVersion: 1,
StateUpgraders: []schema.StateUpgrader{
{
Type: resourceExampleInstanceResourceV0().CoreConfigSchema().ImpliedType(),
Upgrade: resourceExampleInstanceStateUpgradeV0,
Version: 0,
},
},
Я сталкиваюсь с ошибкой .bar: missing expected [
при попытке запустить terraform plan
для существующего состояния TF с источником данных (версия 0) и обновленным main.tf
, содержащим обновленное определение foo
источника данных, которое соответствует его обновленной схеме.
Вот
func resourceExampleInstanceStateUpgradeV0(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) {
barString := rawState["bar"].(string)
rawState["bar"] = []interface{}{map[string]interface{}{
"name": barString,
}}
return rawState, nil
}
Возможно, я смогу придумать полностью воспроизводимый пример, который будет включать больше кода, но я подумал, что может быть полезно спросить об этом в более общем плане, поскольку учебник называется «Ресурсы — миграция состояний», а не «Источники данных — миграция состояний».
С другой стороны,
"resources": [
{
"mode": "data",
"type": "bar",
"name": "example",
...
"instances": [
{
"schema_version": 0,
содержат schema_version
все еще, поэтому он может поддерживаться.
Data resources do not require state migrations. They are read-only resources, so the action of reading them updates the state to the latest version. For this reason, Terraform does not call the
UpgradeResourceState
method for data sources.
I’m not sure what is going on the legacy SDK when using
StateUpgraders
on a data source, the error looks like it might be from json decoding? That may be something they can prevent in the schema validation.