【问题标题】:Terraform test for null or false value of object key对象键的空值或假值的 Terraform 测试
【发布时间】:2022-12-01 01:36:50
【问题描述】:

希望是一个相对简单的。我有一个使用实验性可选属性功能的对象。

这意味着不需要存在对象属性/键之一。然后,我需要使用 for 循环测试对象组合中所述对象键的空值或假值。

在使用 module_variable_optional_attrs 实验时,似乎如果您使用 lookup() 查找不存在的对象键,它将始终返回 null,而不是默认值,正如您可能期望的那样。

我现在必须使用有条件的 (lookup(connection, "auto_accept", false) == false || lookup(connection, "auto_accept", false) == null) 进行测试

这看起来不是很干净。寻找改进建议。

编辑

主程序

  terraform {
    # Optional attributes and the defaults function are
    # both experimental, so we must opt in to the experiment.
    experiments = [module_variable_optional_attrs]
  }

  variable "example_var" {
    type = list(object({
      name                   = string
      auto_accept            = optional(bool)
    }))
    description = "Some variable"
    default = [{
      name                   = "example-name"
    }]
  }

下面的命令是从terraform console运行的

> lookup(var.example_var[0], "auto_accept")
false
# now lets make the key undefined
> lookup(var.example_var[0], "auto_accept")
tobool(null)
> lookup(var.example_var[0], "auto_accept", false)
tobool(null)
> tobool(null)
null

【问题讨论】:

  • 还有try选项。
  • lookup 键不存在时返回默认值,值不存在时不返回。除此之外,@MarkoE 评论是正确答案。
  • @MarkoE try 没有用,因为如果键未定义,try 将返回 null,如果键已定义但等于 false,则返回 false
  • @MattSchuchard,我在帖子中添加了一个编辑,这应该可以说明为什么 lookup() 也不是合适的解决方案。
  • @David 我的评论解释了为什么 lookup 不起作用,以及为什么您观察到您所做的行为。另外,我现在看到您正在寻找基于价值真实性的条件,而不是价值解析。为什么不只是connection.auto_accept == null

标签: terraform


【解决方案1】:

我遇到过类似的情况,我有以下输入映射:

payload = {
  name     = "SomeTestName"
  optional_attr = "SomeOptionalAttribue"
}

上面的有效载荷可能有以下可能的输入:

payload = {
  name     = "SomeTestName"
  optional_attr = "SomeOptionalAttribue"
}

或者

payload = {
  name     = "SomeTestName"
}

或者

payload = {
  name     = "SomeTestName"
  optional_attr = null
}

我的用例是在有效负载中查找 optional_attr 并将其值作为键并从以下映射中获取相应的值。如果 optional_attr 为 null 或未提供,则我从以下映射中获取 mydefault 键的默认值:

master_data = {
  optional_attr_value1     = "value1"
  optional_attr_value2     = "value2"
  mydefault                = "default_value"
}

以下查找与空检查的组合对我有用:

value = lookup(master_data, can(coalesce(payload.optional_attr)) ? lookup(tomap(payload), "optional_attr", "mydefault") : "mydefault" , "default_value")

上面的代码首先检查有效载荷中是否根本没有提供 optional_attr 或者它是否提供了 null 值。如果这是真的,则三元语句返回 false 并提供“mydefault”值,外部查找函数使用该值从 master_data 获取 mydefault 键的对应值。如果三元运算符返回 true(optional_attry 提供了一个值),那么内部查找函数将被触发,它将从 master_data 返回对应于作为 optional_attr 值提供的任何键的值。同样,如果 optional_attr 值与 master_data 中的任何键都不匹配,则内部查找函数返回 my_default 的默认键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多