Как реализовать эту схему терраформирования?

Я использую terraform-plugin-framework.

Это надуманный пример, но, скажем, у меня есть такой ресурс:

type R struct {

IsAdmin types.Bool `tfsdk:"isAdmin"`

F1 types.String `tfsdk:"f1"`

}

Как определить схему так, чтобы:

а. если IsAdmin истинно, F1 должна быть пустой строкой

б. если IsAdmin ложно, F1 не должно быть пустой строкой

Простым способом было бы установить F1 как Optional в схеме, а затем, скажем, в обработчике Create выполнить там проверку. Я не думаю, что это правильный путь. Разве функция Schema не должна этого делать?

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это с помощью ValidateConfig:

func (_ *RResource) ValidateConfig(ctx context.Context, req resource.ValidateConfigRequest, resp *resource.ValidateConfigResponse) {
  // determine input values
  var state R
  resp.Diagnostics.Append(req.Config.Get(ctx, &state)...)
  if resp.Diagnostics.HasError() {
    return
  }

  // return if either field member/attribute is unknown
  if state.IsAdmin.IsUnknown() || state.F1.IsUnknown() {
    return
  }

  // validate F1
  if state.IsAdmin.ValueBool() && len(state.F1.ValueString()) > 0 {
    resp.Diagnostics.AddAttributeError(
      path.Root("f1"),
      "Invalid Attribute Value",
      "Parameter 'f1' cannot be assigned a value if parameter isAdmin is assigned a value of 'true'",
    )
  } else {
    if !state.IsAdmin.ValueBool() && len(state.F1.ValueString()) == 0 {
      resp.Diagnostics.AddAttributeError(
        path.Root("f1"),
        "Invalid Attribute Value",
        "Parameter 'f1' must be assigned a value if parameter isAdmin is assigned a value of 'false'",
      )
    }
  }
}

В этом решении предполагается, что схема атрибутов для ресурса соответствует типичному соглашению о нижнем регистре для элементов поля структуры модели данных, поскольку оно не было указано в вопросе.

Обычно было бы проще выполнить проверку нескольких атрибутов ресурсов с помощью валидатора ресурсов , но в вашей ситуации описанное выше будет проще и понятнее.

Это именно то, что я ищу.

user219820 25.07.2024 20:13

Извините, мне следовало включить структурные теги. Я отредактировал пост для ясности.

user219820 25.07.2024 20:36

@user219820 user219820 Хорошо, я обновил ответ для тегов, но обратите внимание, что обычное соглашение предназначено для атрибутов TF, а не для верблюда.

Matthew Schuchard 25.07.2024 22:52

Хорошее замечание по поводу змеиного дела.

user219820 29.07.2024 22:19

Другие вопросы по теме