Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modificar o agrupamento dos recursos #9

Open
lukerops opened this issue Oct 6, 2023 · 4 comments
Open

Modificar o agrupamento dos recursos #9

lukerops opened this issue Oct 6, 2023 · 4 comments
Labels
enhancement New feature or request
Milestone

Comments

@lukerops
Copy link
Owner

lukerops commented Oct 6, 2023

Hoje o mapeamento leva em consideração apenas o apiGroup e kind, porém, para fazer a criação dos recursos é preciso fazer uma lógica para cada apiVersionName. Para facilitar essa lógica adicional, vamos mudar o agrupamento para:

resources = {
  (apiGroup) = {
    (kind) = {
      (apiVersionName) = {
        (metadata.name) = resource
      }
    }
  }
}
@lukerops lukerops added the enhancement New feature or request label Oct 6, 2023
@lukerops lukerops added this to the v0.2.0 milestone Oct 6, 2023
@daltonmatos
Copy link
Collaborator

Depois coloca aqui exemplos de uso desse novo agrupamento em comparação com o antigo.

Dúvida: O antigo será removido?

@lukerops
Copy link
Owner Author

lukerops commented Oct 9, 2023

Dúvida: O antigo será removido?

Sim. A ideia por trás do agrupamento inicial era usar o próprio manifesto como um objeto comum entre as versões, porém, isso obrigaria a ter múltiplos recursos separando a criação do recurso, já que versões diferentes podem lógicas diferentes para criação do recurso. Isso se tornou um problema devido à obrigatoriedade de um state mv sempre que houver a mudança de versão de algum recurso.

Como o recomendado agora é usar um objeto comum entre as versões, que não é mais o próprio manifesto, então, sempre vamos criar alguma lógica de mapeamento para cada versão do CRD. Devido a esse mapeamento, estou mudando o agrupamento dos manifestos, e assim, não forçar sempre o filtro por apiVersionNmae.


Formato de uso atual:

locals {
  resources = merge(
    {
      for name, resource in local.tf_gapi.resources["<apiGroup>"]["<kind>"] :
      name => {
        name  = name
        param = resource.spec.param
      }
      if resource.apiVersionName == "v1alpha1"
    },
    {
      for name, resource in local.tf_gapi.resources["<apiGroup>"]["<kind>"] :
      name => {
        name  = name
        param = resource.spec.enable_param ? "fixed" : null
      }
      if resource.apiVersionName == "v1alpha2"
    }
  )
}

resource "tf_resource" "example" {
  for_each = local.resources

  name  = each.value.name
  param = each.value.param
}

Formato de uso da proposta:

locals {
  resources = merge(
    {
      for name, resource in local.tf_gapi.resources["<apiGroup>"]["<kind>"]["v1alpha1"] :
      name => {
        name  = name
        param = resource.spec.param
      }
    },
    {
      for name, resource in local.tf_gapi.resources["<apiGroup>"]["<kind>"]["v1alpha2"] :
      name => {
        name  = name
        param = resource.spec.enable_param ? "fixed" : null
      }
    }
  )
}

resource "tf_resource" "example" {
  for_each = local.resources

  name  = each.value.name
  param = each.value.param
}

@lukerops lukerops modified the milestones: v0.2.0, v0.3.0 Jul 1, 2024
@daltonmatos
Copy link
Collaborator

Um dúvida aqui: Essa mudança é uma breaking change? Pergunto isso pois se for temos que pensar no caminho de atualização de projetos que já estão rodando. Imagina ter que ajustar um projeto, todo de uma vez, que possua uns 30 CRDs por exemplo.

Se podermos fazer algo nessa linha:

locals {
  resources = merge(
    {
      for name, resource in local.tf_gapi.resources["<apiGroup>"]["<kind>"][*] :
      name => {
        name  = name
        param = # Aqui vai um código que suporta as duas versions
      }
    }
  )
}

resource "tf_resource" "example" {
  for_each = local.resources

  name  = each.value.name
  param = each.value.param
}

Se quisermos ignorar as versions, tudo bem. Se não pudermos fazer acho que o ideal seria criar um segundo output para dar tempo para os projetos atualizarem.

Nesse caso os projetos poderiam ir, progressivamente, usando o output novo e depois de um tempo podemos de fato remover o output antigo e deixar apenas o novo. O que acha?

@lukerops
Copy link
Owner Author

Acho válido, só pensar em um nome que faça sentido para esse output novo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants