Joseph
Joseph

Reputation: 348

Converting a list(map(list(map(string)))) into a map(list(map(string))) with terraform

Hi there is there any neat way to convert a list(map(list(map(string)))) into a map(list(map(string))) with terraform .

Here's what my input structure looks like

`variable "data" {
  type = list(map(list(map(string))))
  default = [
    {
      secrets = [
        {
          secret-name   = "secret1"
          secret-label  = "label1"
        },
        {
          secret-name   = "secret2"
          secret-label  = "label2"
        }
      ],
      config-maps = [
        {
          config-map-name =  "conf1"
          java-options    = "-Xmx256m"
          config-label    = "develop"
        }
      ]
    },
    {
      secrets = [
        {
          secret-name   = "secret3"
          secret-label  = "label3"
        }
      ],
      config-maps = [
        {
          config-map-name =  "conf2"
          java-options = "-Xmx256m"
          config-label = "develop"
        }
      ]
    }
  ]
}`

and here's what i want it to look like

`data = {
        secrets     = [
                        {
                          secret-name   = "secret1"
                          secret-label  = "label1"
                        },
                        {
                          secret-name   = "secret2"
                          secret-label  = "label2"
                        },
                        {
                          secret-name   = "secret3"
                          secret-label  = "label3"
                        },
                      ],
        config-maps = [
                        {
                          config-map-name =  "conf1"
                          java-options    = "-Xmx256m"
                          config-label    = "develop"
                        },
                        {
                          config-map-name =  "conf2"
                          java-options = "-Xmx256m"
                          config-label = "develop"
                        }
                      ]
      }

Can you guys help me achieve this please ? Ps : preferably in the locals part

Upvotes: 2

Views: 1523

Answers (1)

seiji
seiji

Reputation: 349

Then, how about this?

locals {
  values = flatten([
    for d in var.data : [
      for _, v in d : v
    ]
  ])
  keys = flatten([
    for d in var.data : [
      for k, v in d : [
        for _ in v : k
      ]
    ]
  ])
}

output data {
  value = {
    for k in distinct(local.keys) :
    k => matchkeys(local.values, local.keys, [k])
  }
}

I hope this will help.

Upvotes: 3

Related Questions