lukerops / tf-gapi Goto Github PK
View Code? Open in Web Editor NEWUm validador de manifestos kubernetes-like para facilitar e padronizar a entrada de dados em seus projetos Terraform.
License: GNU General Public License v3.0
Um validador de manifestos kubernetes-like para facilitar e padronizar a entrada de dados em seus projetos Terraform.
License: GNU General Public License v3.0
Hoje apenas os CRDs que possuem manifestos de recursos aparecem no agrupamento do output. Isso obriga quem está usando o módulo a fazer o acesso usando o try
para garantir que o código não quebre.
Um comportamento melhor seria todos os CRDs estarem nesse output e caso não exista nenhum manifesto desse CRD, adicionar apenas um objeto vazio.
Exemplo do uso atual:
locals {
v1alpha1 = {
for name, resource in try(module.tf_gapi.resources["<apiGroup>"]["<kind>"], {}) : name => resource
if resource.apiVersionName == "v1alpha1"
}
}
Hoje o projeto usa a mesmo interface do Kubernetes para o CustomResourceDefinition
, porém, chegamos aos seguintes problemas:
scope: Cluster
).Devido a esses pontos é melhor criar um schema novo para o CustomResourceDefinition
.
Com a modificação do projeto os exemplos de uso precisam ser corrigidos.
O output do projeto precisa ser modificado para agrupar os recursos, assim, gerando um map na seguinte ordem:
resources = {
(apiGroup): {
(kind): {
(metadata.name): resource
}
}
}
O módulo de validação, e o próprio projeto, vão retornar uma lista de recursos, porém, é necessário definir o formato do objeto terraform que será exportado.
O processamento dos manifestos é separado em 2 fluxos diferentes:
CustomResourceDefinitions
Consiste na leitura do manifesto, verificando a estrutura do mesmo e gerando o schema
que será utilizado na validação de outros manifestos.
Consiste na validação do manifesto utilizando as regras presentes nos schemas
gerados no passo anterior.
Como se é percebido, o resultado de um passo está completamente acoplado com o próximo, o que torna necessário o casamento dos dados entre eles, porém, da forma que está sendo implementado pelo PR #14, as regras dos dois fluxos ficarão separadas, deixando a manutenção desses códigos mais complicada.
A ideia proposta nessa issue é a adição de um novo conceito chamado de Schema Processor
. O Schema Processor
será um bloco de código, único para cada tipo de dado, que terá a função de ler as regras do CustomResourceDefinition
, gerar um schema
e depois validar se um manifesto cumpre as regras do schema
gerado.
Como antes, isso ocorrerá em 2 etapas, como descrito no diagrama:
Essa proposta resolve o espalhamento das regras de validação pelo código, além de tornar possível a reutilização do código de processamento do CustomResourceDefinition
, tornando a criação de uma nova versão da interface YAML mais rápida, simples e fácil, evitando um "copia e cola" de vários arquivos.
A ideia é podermos definir um valor default para um campo qualquer. Essa possibilidade habilitará o uso de campo opcionais em um manifesto. Muitas vezes facilitando a escrita desse yaml.
apiVersion: tf-gapi.lukerops.com/v1alpha1
kind: CustomResourceDefinition
metadata:
name: serviceaccount.gcp.iam.stone.co
spec:
group: gcp.iam.stone.co
kind: ServiceAccount
versions:
- name: v1alpha1
specSchema:
type: object
properties:
id:
type: string
create:
type: bool
default: false
Acima uma proposta de como esse valor pode ser definido. Junto com o campo type:
teríamos o campo default:
com o valor padrão para esse campo.
default:
ele precisa ter um valor. Não podemos definir um default vazio;default: true
para um campo type: integer
;type: object
e type: array
. Talvez array até seja comum ter default: []
, talvez seja mais comum do que defaul: {}
para type: object
.
default: []
.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
}
}
}
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.