Как преобразовать структуру объекта

У меня есть один сложный объект в терраформе, структура, как показано ниже что мне нужно сделать, это преобразовать эту структуру в другую (я разместил нужную структуру), а затем создать ресурс с помощью foreach в terraform

StorageSettings{
    storage{
        fileshare{
            directories{}
        }
    }
}

реальный код здесь


locals {

  StorageSettings = {

    CoreBackup = {

      fileshare = {

        shareA = {
          name                 = "myshare"
          storage_account_name = "sa1corebackup"
          quota                = 100

          directories = {

            dirA = {
              name                 = "app"
              share_name           = "myshare"
              storage_account_name = "sa1corebackup"


            }
          }
        }
        shareB = {
          name                 = "myshare2"
          storage_account_name = "sa1corebackup"
          quota                = 150
        }
      }
    }

    MGMTackup = {

      fileshare = {
        ShareA = {
          name                 = "myshare"
          storage_account_name = "mgmtbackup"
          quota                = 200
          enabled_protocol     = "SMB"
          acl = {
            id = "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI"

            access_policy = {
              permissions = "rwdl"
              start       = "2019-07-02T09:38:21.0000000Z"
              expiry      = "2019-07-02T10:38:21.0000000Z"
            }
          }

          directories = {

            dirA = {

              name                 = "app"
              share_name           = "myshare"
              storage_account_name = "mgmtbackup"

            }

            dirB = {
              name                 = "backup"
              share_name           = "myshare"
              storage_account_name = "mgmtbackup"
            }

          }

        }

        ShareB = {
          name                 = "myshare2"
          storage_account_name = "mgmtbackup"
          quota                = 100
          enabled_protocol     = "SMB"

          acl = {
            id = "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI"

            access_policy = {
              permissions = "rwdl"
              start       = "2019-07-02T09:38:21.0000000Z"
              expiry      = "2019-07-02T10:38:21.0000000Z"
            }
          }

          directories = {

            dirA = {
              name                 = "app"
              share_name           = "myshare"
              storage_account_name = "mgmtbackup"


            }

            dirB = {
              name                 = "backup"
              share_name           = "myshare"
              storage_account_name = "mgmtbackup"
            }
          }
        }
      }
    }
  }
}




Мой вопрос: как преобразовать структуру в приведенную ниже?

storage+fileshare{
    directories{
    }
}

Я попробовал приведенный ниже код

  filesharesettings = { for p, v in local.StorageSettings : p => v.fileshare if try(v.fileshare, null) != null }

  directorysettings = {
    for Storage, FileShareSettings in local.filesharesettings : Storage =>
    { for FileShare, FileShareSetting in FileShareSettings : "${Storage} ${FileShare}" => FileShareSetting.directories if lookup(FileShareSetting, "directories", "") != "" }
  }

но получить только такой результат

storage{
  storage+fileshare{
    directories{
    }
  }
}

выходной ток, как показано ниже, обратите внимание, что это не мой ожидаемый вывод, я попытался преобразовать структуру с некоторым кодом (уже опубликованным), и ниже приведен вывод, моя ожидаемая структура вывода такова

storage+fileshare{
    directories{
    }
}
Changes to Outputs:
  + dd = {
      + CoreBackup = {
          + CoreBackup shareA = {
              + dirA = {
                  + name                 = "app"
                  + share_name           = "myshare"
                  + storage_account_name = "sa1corebackup"
                }
            }
        }
      + MGMTackup  = {
          + MGMTackup ShareA = {
              + dirA = {
                  + name                 = "app"
                  + share_name           = "myshare"
                  + storage_account_name = "mgmtbackup"
                }
              + dirB = {
                  + name                 = "backup"
                  + share_name           = "myshare"
                  + storage_account_name = "mgmtbackup"
                }
            }
          + MGMTackup ShareB = {
              + dirA = {
                  + name                 = "app"
                  + share_name           = "myshare"
                  + storage_account_name = "mgmtbackup"
                }
              + dirB = {
                  + name                 = "backup"
                  + share_name           = "myshare"
                  + storage_account_name = "mgmtbackup"
                }
            }
        }
    }


Может ли кто-нибудь помочь мне здесь?

«Вывод, как показано ниже» - это ваш ожидаемый результат или текущий вывод, который неверен?

Marcin 06.04.2022 04:00

@Marcin, извините за неправильное понимание, уже обновил описание, вывод, как показано ниже, - это только текущий вывод, а не ожидаемый

mxy 06.04.2022 04:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

  directorysettings = merge(
        flatten([for storage_name, fileshares in local.StorageSettings:
           {for share_name, share in fileshares["fileshare"]:
               "${storage_name}+${share_name}" => {
                 for directory_name, directory in share["directories"]:
                   directory_name => directory
               } if lookup(share, "directories", "") != ""
           }
        ])...) 

что дает directorysettings:

{
  "CoreBackup+shareA" = {
    "dirA" = {
      "name" = "app"
      "share_name" = "myshare"
      "storage_account_name" = "sa1corebackup"
    }
  }
  "MGMTackup+ShareA" = {
    "dirA" = {
      "name" = "app"
      "share_name" = "myshare"
      "storage_account_name" = "mgmtbackup"
    }
    "dirB" = {
      "name" = "backup"
      "share_name" = "myshare"
      "storage_account_name" = "mgmtbackup"
    }
  }
  "MGMTackup+ShareB" = {
    "dirA" = {
      "name" = "app"
      "share_name" = "myshare"
      "storage_account_name" = "mgmtbackup"
    }
    "dirB" = {
      "name" = "backup"
      "share_name" = "myshare"
      "storage_account_name" = "mgmtbackup"
    }
  }
}

довольно сложное выражение .. оно работает, большое спасибо!

mxy 08.04.2022 09:43

@mxy Да, но ваша структура данных тоже сложна. Вам придется упростить его, чтобы упростить код TF.

Marcin 08.04.2022 09:45

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

Часто ли ресурс Terraform взаимодействует с несколькими группами API или он должен быть сопоставлен 1:1?
Как я могу использовать выходные данные модулей Terraform в качестве входных данных для другого модуля Terraform?
Как обрезать имя пользователя из идентификатора электронной почты в terraform
Невозможно одновременно создать множество наборов правил брандмауэра Azure в Terraform
Вывести вывод terraform из списка списка в список строк
Какая последняя версия доступна для политики доступа AWS cloudsearch?
Не удается изменить разрешения учетной записи службы передачи хранилища из terraform
Ошибка:: Неподдерживаемый атрибут. Этот объект не имеет атрибута с именем «nsg_name»
Ошибка Terraform: ошибка: создание подсети: исходная ошибка: код = «NetcfgInvalidSubnet» сообщение = «внутренняя подсеть» недействительна в виртуальной сети
Terraform: преобразование списка переменных в один список карт