I tried few tests on how to use dynamic
, try
, and yamldecode
on google_artifact_registry_repository
to configure remote_repository_config
.
# repos.yaml
- name: new-team
description: Container image repo for New team
repo_owners:
- group1@test.com
labels:
owner: new-team
region: us-east1
repo_format: DOCKER
- name: pypi
description: Repository of software for the Python programming language
repo_owners:
- group1@test.com
- group2@test.com
- group3@test.com
labels:
owner: group1
region: us-east1
repo_format: PYPI
cleanup_policy_dry_run: true
mode: REMOTE_REPOSITORY
repo:
- description: "PyPi Remote Repository"
repository: PYPI
# vars.tf
locals {
repositories = flatten([
for each_repo in yamldecode(file("repos.yaml")) : {
name = each_repo.name
description = each_repo.description
region = each_repo.region
repo_format = each_repo.repo_format
labels = each_repo.labels
repo_owners = each_repo.repo_owners
cleanup_policy_dry_run = tobool(each_repo.cleanup_policy_dry_run)
mode = lookup(each_repo, "mode", "STANDARD_REPOSITORY")
repo = try(each_repo.repo, [])
}
])
xrepos = distinct(flatten([
for each_repo in local.repositories : [
for repo in each_repo.repo : {
repo = try(repo, [])
}
]
]))
}
# repositories.yaml
resource "google_artifact_registry_repository" "repository" {
for_each = { for repo in local.repositories : "${repo.name}" => repo }
location = each.value.region
repository_id = each.value.name
description = each.value.description
format = each.value.repo_format
labels = each.value.labels
cleanup_policy_dry_run = each.value.cleanup_policy_dry_run
mode = each.value.mode
dynamic "remote_repository_config" {
for_each = try(local.xrepos, {})
content {
description = remote_repository_config.value.repo["description"]
python_repository {
public_repository = remote_repository_config.value.repo["repository"]
}
}
}
...
...
From the above, in repos.yaml, the new-team
was created a while back, and at that time, we did not consider REMOTE_REPOSITORY, so, I refactored repositories.yaml
to add mode
, repo
and xrepos
.
The problem with that code is the existing new-team
will be deleted and recreated. Sample of terraform plan
# google_artifact_registry_repository.repository["pypi"] will be created
+ resource "google_artifact_registry_repository" "repository" {
+ cleanup_policy_dry_run = true
+ create_time = (known after apply)
+ description = "Repository of software for the Python programming language"
+ effective_labels = {
+ "owner" = "cloud-engineering"
}
+ format = "PYPI"
+ id = (known after apply)
+ labels = {
+ "owner" = "group1"
}
+ location = "us-east1"
+ mode = "REMOTE_REPOSITORY"
+ name = (known after apply)
+ project = "GOOGLE-PROJECT-1"
+ repository_id = "pypi"
+ terraform_labels = {
+ "owner" = "group1"
}
+ update_time = (known after apply)
+ cleanup_policies {
+ action = "DELETE"
+ id = "delete-untagged"
+ condition {
+ package_name_prefixes = []
+ tag_prefixes = []
+ tag_state = "UNTAGGED"
+ version_name_prefixes = []
}
}
+ cleanup_policies {
+ action = "KEEP"
+ id = "keep-3-tagged"
+ most_recent_versions {
+ keep_count = 3
+ package_name_prefixes = []
}
}
+ remote_repository_config {
+ description = "PyPi Remote Repository"
+ python_repository {
+ public_repository = "PYPI"
}
}
}
# google_artifact_registry_repository.repository["new-team"] must be replaced
-/+ resource "google_artifact_registry_repository" "repository" {
~ create_time = "2023-06-30T18:08:14.610188Z" -> (known after apply)
~ id = "projects/GOOGLE-PROJECT-1/locations/us-central1/repositories/new-team" -> (known after apply)
~ name = "new-team" -> (known after apply)
~ update_time = "2024-01-09T15:36:24.318084Z" -> (known after apply)
# (10 unchanged attributes hidden)
+ remote_repository_config { # forces replacement
+ description = "PyPi Remote Repository" # forces replacement
+ python_repository { # forces replacement
+ public_repository = "PYPI" # forces replacement
}
}
# (2 unchanged blocks hidden)
}
I hope I explained the problem clear enough.
Any helps is highly appreciated.