locals { sorted-station-names = reverse(distinct(sort([ for station in var.stations: station.name ]))) sorted-stations = flatten([ for name in local.sorted-station-names: [ for station in var.stations: station if station.name == name ] ]) // le tableau de toutes les BDs requises dans toutes les devstations (aka de toutes les orga dont la devstation depend) triƩes par station/orga/ds sorted-datasets = flatten([ for station in local.sorted-stations: flatten([ for name in distinct(sort(station.organisations)):[ for org in local.sorted-organisations: flatten([ for dsname in reverse(distinct(sort([for d in org.datasets: d.name]))): [ for ds in org.datasets: merge(ds, { "name" = "${org.name}-${ds.name}" "namespace" = "${var.domain}-devspaces-${station.name}" "organisation" = org "usage" = "station" "station" = station "sub_domain" = "${station.name}.stations" }) if ds.name == dsname ] ]) if org.name == name ] ]) ]) } resource "kubernetes_namespace_v1" "dev-ns" { count = length(local.sorted-stations) metadata { annotations = local.annotations labels = merge(local.common_labels, local.annotations) name = "${var.domain}-devspaces-${local.sorted-stations[count.index].name}" } } resource "kubectl_manifest" "devstations" { count = length(local.sorted-stations) depends_on = [kubernetes_namespace_v1.dev-ns] yaml_body = <<-EOF apiVersion: "vynil.solidite.fr/v1" kind: "Install" metadata: name: "${local.sorted-stations[count.index].name}" namespace: "${var.domain}-devspaces-${local.sorted-stations[count.index].name}" labels: ${jsonencode(local.common_labels)} spec: distrib: "${var.distributions.domain}" category: "apps" component: "code-server" options: ${jsonencode(merge(local.global, { for k, v in local.sorted-stations[count.index] : k => v if !contains(["name"], k) }))} EOF } resource "kubectl_manifest" "datasets" { count = length(local.sorted-datasets) depends_on = [kubernetes_namespace_v1.dev-ns] yaml_body = <<-EOF apiVersion: "vynil.solidite.fr/v1" kind: "Install" metadata: name: "${local.sorted-datasets[count.index].name}" namespace: "${local.sorted-datasets[count.index].namespace}" labels: ${jsonencode(local.common_labels)} spec: distrib: "${var.distributions.domain}" category: "share" component: "dataset-${local.sorted-datasets[count.index].engine}" options: ${jsonencode(merge(local.global, { for k, v in local.sorted-datasets[count.index] : k => v if !contains(["name", "namespace", "engine", "organisation", "station", "usage"], k) }))} EOF }