Как обрабатывать неподдерживаемый атрибут в Terraform

У меня есть код терраформа, как указано ниже

         locals {
    file_path = format("%s-%s", var.test1, var.test2)
    test_decode  =  yamldecode((data.github_repository_file.test.content))
   }
    data "github_repository_file" "test" {
     repository = "test-repo"
     branch     = "develop"
    file       = "${local.file_path}/local/test.yaml"
    }
  test_encode = ${yamlencode(local.test_decode.spec.names)}

Это работает нормально, когда атрибут « .spec.names » присутствует в файле test.yaml. Поскольку мы выбираем test.yaml на основе local.file_path, иногда атрибут .spec.names может отсутствовать в test.yaml, и план терпит неудачу с ошибкой: «Неподдерживаемый атрибут» . Как проверить наличие атрибута « .spec.names » в test.yaml?

Обновление вопроса для добавления примера yaml

Yaml с атрибутом имен

      apiVersion: helm.toolkit.gitops.io/v2beta1
kind: HelmRelease
metadata:
  name: "test"
  namespace: "test-system"
spec:
  chart:
    spec:
      chart: "test-environment"
      version: "0.1.10"
  names:
    key1: "value1"
    key2: "value2"
    key3: "value3"
    key4: "value4"

YAML без атрибута имен

      apiVersion: helm.toolkit.gitops.io/v2beta1
kind: HelmRelease
metadata:
  name: "test"
  namespace: "test-system"
spec:
  chart:
    spec:
      chart: "test-environment"
      version: "0.1.10"

2 ответа

Вы можете использовать попытку :

        test_encode = yamlencode(try(local.test_decode.spec.names, "some_default_value"))

Я не знаю, существует ли более элегантный способ, но вы можете проверить, существует ли такое свойство:

      contains([for k, v in local.test_decode : k], "spec")

объединение этого, чтобы проверить, существуют ли спецификация и имена, как это, не сработало для меня, поскольку второе условие все еще оценивалось, даже если первое условие не удалось:

      contains([for k, v in local.test_decode : k], "spec") && contains([for k, v in local.test_decode.spec : k], "names")

это помогает, но мне это не нравится, потому что я считаю это довольно хакерским:

      contains([for k, v in local.test_decode : k], "spec") ? contains([for k, v in local.test_decode.spec : k], "names") : false