From 542bfd1263a991aadcacedea20276fca38f650e2 Mon Sep 17 00:00:00 2001 From: abolfazl1381 Date: Fri, 8 Nov 2024 17:40:05 +0330 Subject: [PATCH 1/2] fix(helm): fix helm prompt --- app/__pycache__/gpt_services.cpython-311.pyc | Bin 1195 -> 1195 bytes .../prompt_generators.cpython-311.pyc | Bin 7845 -> 7996 bytes app/__pycache__/services.cpython-311.pyc | Bin 2636 -> 2634 bytes app/directory_generators/helm_generator.py | 117 ++++++++------- .../terraform_generator.py | 136 +++++++++++------- app/media/MyHelm/templates/web/_helpers.tpl | 8 ++ .../MyHelm/templates/web/deployment.yaml | 15 +- app/media/MyHelm/templates/web/helpers.tpl | 17 --- app/media/MyHelm/templates/web/ingress.yaml | 16 +++ app/media/MyHelm/templates/web/secret.yaml | 4 +- app/media/MyHelm/templates/web/service.yaml | 7 +- .../{terraform-ci.yml => terraform.yml} | 14 +- .../MyTerraform/env/dev/terraform.tfvars | 4 + .../MyTerraform/env/prod/terraform.tfvars | 4 + app/media/MyTerraform/main.tf | 24 ++-- .../MyTerraform/modules/ec2-module/main.tf | 13 ++ app/media/MyTerraform/outputs.tf | 3 + app/media/MyTerraform/variables.tf | 24 ++-- .../__pycache__/helm_models.cpython-311.pyc | Bin 6011 -> 6011 bytes .../terraform_models.cpython-311.pyc | Bin 4725 -> 4725 bytes app/models/__pycache__/utils.cpython-311.pyc | Bin 2297 -> 2297 bytes app/prompt_generators.py | 3 +- .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 168 bytes ...helm_template.cpython-311-pytest-7.4.0.pyc | Bin 0 -> 11128 bytes ...helm_template.cpython-311-pytest-8.3.3.pyc | Bin 0 -> 11136 bytes ...est_iac_basic.cpython-311-pytest-7.4.0.pyc | Bin 0 -> 8811 bytes ...est_iac_basic.cpython-311-pytest-8.3.3.pyc | Bin 0 -> 8811 bytes ...st_iac_bugfix.cpython-311-pytest-7.4.0.pyc | Bin 0 -> 8828 bytes ...st_iac_bugfix.cpython-311-pytest-8.3.3.pyc | Bin 0 -> 8828 bytes ...t_iac_install.cpython-311-pytest-7.4.0.pyc | Bin 0 -> 9105 bytes ...t_iac_install.cpython-311-pytest-8.3.3.pyc | Bin 0 -> 9105 bytes ..._iac_template.cpython-311-pytest-7.4.0.pyc | Bin 0 -> 7704 bytes ..._iac_template.cpython-311-pytest-8.3.3.pyc | Bin 0 -> 7704 bytes 33 files changed, 250 insertions(+), 159 deletions(-) create mode 100644 app/media/MyHelm/templates/web/_helpers.tpl delete mode 100644 app/media/MyHelm/templates/web/helpers.tpl create mode 100644 app/media/MyHelm/templates/web/ingress.yaml rename app/media/MyTerraform/.github/workflows/{terraform-ci.yml => terraform.yml} (56%) create mode 100644 app/media/MyTerraform/env/dev/terraform.tfvars create mode 100644 app/media/MyTerraform/env/prod/terraform.tfvars create mode 100644 app/media/MyTerraform/modules/ec2-module/main.tf create mode 100644 app/media/MyTerraform/outputs.tf create mode 100644 app/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 app/tests/__pycache__/test_helm_template.cpython-311-pytest-7.4.0.pyc create mode 100644 app/tests/__pycache__/test_helm_template.cpython-311-pytest-8.3.3.pyc create mode 100644 app/tests/__pycache__/test_iac_basic.cpython-311-pytest-7.4.0.pyc create mode 100644 app/tests/__pycache__/test_iac_basic.cpython-311-pytest-8.3.3.pyc create mode 100644 app/tests/__pycache__/test_iac_bugfix.cpython-311-pytest-7.4.0.pyc create mode 100644 app/tests/__pycache__/test_iac_bugfix.cpython-311-pytest-8.3.3.pyc create mode 100644 app/tests/__pycache__/test_iac_install.cpython-311-pytest-7.4.0.pyc create mode 100644 app/tests/__pycache__/test_iac_install.cpython-311-pytest-8.3.3.pyc create mode 100644 app/tests/__pycache__/test_iac_template.cpython-311-pytest-7.4.0.pyc create mode 100644 app/tests/__pycache__/test_iac_template.cpython-311-pytest-8.3.3.pyc diff --git a/app/__pycache__/gpt_services.cpython-311.pyc b/app/__pycache__/gpt_services.cpython-311.pyc index 6862230efc247d6813dc69e7659cc9fd07c76194..d529c24294e7c36230bb632673b7da8c1d82c32c 100644 GIT binary patch delta 64 zcmZ3@xtf!AIWI340}wo4sgvHjkyo3UQE;*)vm)b-&C$#zj55NEHXj%;i6T{?761w> B4*>uG delta 64 zcmZ3@xtf!AIWI340}vcHmQL^6$g9oFC^XrUS&{L<=4fUUMi~)Cn-2__M3E{`3jpgm B4ru@Y diff --git a/app/__pycache__/prompt_generators.cpython-311.pyc b/app/__pycache__/prompt_generators.cpython-311.pyc index f95ef9726e5436d37163ea9d16c843770db8221d..2ae13e4378abdccf2ebe74ddfeb2c9316e450d80 100644 GIT binary patch delta 398 zcmZ2#yT^`qIWI340}yCP>!qLG$h(z=F?aJ}mU>3U;>pfzI*fBC7qFFVe#+*`$arhA zHb)Yp&SWbQCnhVd$sajHH!tCM$;GYA#K54Sz@-2Ln$GC^#3TCYGcsBnJEe-sksFpR}HQLKr{D!vz!=d>I27KPbWlv=|aJ7&90@ zXv0N}7(5t#7(W=p1whVeaQooIxLH;ZF@)| p{9p_h06C|@?StLsEwT}e23m|l7gVf1FaYTt#b632Q6vHkJ^)yHRuupM diff --git a/app/__pycache__/services.cpython-311.pyc b/app/__pycache__/services.cpython-311.pyc index 27edc7876f268f996ec7054928ce964efe529f5b..fce921b7ec61ce0802f0806a22dd6d5d1f6a5909 100644 GIT binary patch delta 81 zcmX>ja!Q1EIWI340}wo4sgqu_k#`mor#+C@!0laz=!AIWI340}$w&D5uwM.fullname" . }} spec: type: ClusterIP ports: - - port: {{ .Values.web.service.targetPort }} + - port: 80 + targetPort: {{ .Values.web.service.targetPort }} selector: - app: {{ include "MyHelm.name" . }} + app: {{ include "<.Release.Name>.name" . }} """ + with open(os.path.join(base_path, "templates/web/service.yaml"), "w") as f: + f.write(service_yaml_content) deployment_yaml_content = """apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "MyHelm.fullname" . }}-web + name: {{ include "<.Release.Name>.fullname" . }} spec: replicas: {{ .Values.web.replicas }} + selector: + matchLabels: + app: {{ include "<.Release.Name>.name" . }} template: metadata: labels: - app: {{ include "MyHelm.name" . }} + app: {{ include "<.Release.Name>.name" . }} spec: containers: - - name: web + - name: {{ include "<.Release.Name>.name" . }} image: {{ .Values.web.image }} ports: - containerPort: {{ .Values.web.service.targetPort }} env: - {{- range .Values.web.env }} - - name: {{ .name }} - value: {{ .value }} - {{- end }} + - name: ENV1 + value: Hi +""" + with open(os.path.join(base_path, "templates/web/deployment.yaml"), "w") as f: + f.write(deployment_yaml_content) + + if True: # Ingress enabled condition + ingress_yaml_content = """apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "<.Release.Name>.fullname" . }} +spec: + rules: + - host: {{ .Values.web.ingress.host }} + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: {{ include "<.Release.Name>.fullname" . }} + port: + number: 80 """ + with open(os.path.join(base_path, "templates/web/ingress.yaml"), "w") as f: + f.write(ingress_yaml_content) secret_yaml_content = """apiVersion: v1 kind: Secret metadata: - name: {{ include "MyHelm.fullname" . }}-web-env + name: {{ include "<.Release.Name>.fullname" . }}-secret type: Opaque data: - ENV1: {{ .Values.web.env | toJson | b64enc | quote }} + ENV1: {{ .Values.web.env[0].value | b64enc | quote }} """ + with open(os.path.join(base_path, "templates/web/secret.yaml"), "w") as f: + f.write(secret_yaml_content) - helpers_tpl_content = """{{/* -Expand the name of the chart. -*/}} -{{- define "MyHelm.name" -}} -{{- .Chart.Name | replace "-" "_" | lower -}} + helpers_tpl_content = """{{/* Place helper variables here */}} +{{- define "<.Release.Name>.fullname" -}} +{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}} {{- end -}} -{{/* -Create a default fully qualified domain name -*/}} -{{- define "MyHelm.fullname" -}} -{{- if .Chart.Name -}} -{{- .Release.Name | lower | replace "-" "_" | trimSuffix "-" | append (include "MyHelm.name" . | lower) | toLower -}} -{{- else -}} -{{- .Release.Name | lower -}} -{{- end -}} +{{- define "<.Release.Name>.name" -}} +{{- .Chart.Name | lower -}} {{- end -}} """ + with open(os.path.join(base_path, "templates/web/_helpers.tpl"), "w") as f: + f.write(helpers_tpl_content) - with open(os.path.join(project_path, 'Chart.yaml'), 'w') as file: - file.write(chart_yaml_content) - - with open(os.path.join(project_path, 'values.yaml'), 'w') as file: - file.write(values_yaml_content) - - with open(os.path.join(project_path, 'templates', 'web', 'service.yaml'), 'w') as file: - file.write(service_yaml_content) - - with open(os.path.join(project_path, 'templates', 'web', 'deployment.yaml'), 'w') as file: - file.write(deployment_yaml_content) - - with open(os.path.join(project_path, 'templates', 'web', 'secret.yaml'), 'w') as file: - file.write(secret_yaml_content) - - with open(os.path.join(project_path, 'templates', 'web', 'helpers.tpl'), 'w') as file: - file.write(helpers_tpl_content) - -create_helm_project_structure('.') \ No newline at end of file +create_helm_structure("app/media/MyHelm") \ No newline at end of file diff --git a/app/directory_generators/terraform_generator.py b/app/directory_generators/terraform_generator.py index ae23fedb..379d9b65 100644 --- a/app/directory_generators/terraform_generator.py +++ b/app/directory_generators/terraform_generator.py @@ -1,60 +1,101 @@ import os project_name = "app/media/MyTerraform" -base_directory = project_name.replace("/", os.sep) -modules_directory = os.path.join(base_directory, "modules") -ci_directory = os.path.join(base_directory, ".github", "workflows") - -os.makedirs(modules_directory, exist_ok=True) -os.makedirs(ci_directory, exist_ok=True) - -terraform_main = f"""provider "aws" {{ - region = "us-east-1" -}} - -resource "aws_instance" "web" {{ - ami = "ami-0c55b159cbfafe1f0" - instance_type = "t2.micro" - - tags = {{ - Name = "MyEC2Instance" - }} -}} -""" - -terraform_variables = """variable "region" {{ - description = "AWS region" +module_name = "ec2-module" + +directories = [ + project_name, + os.path.join(project_name, "modules"), + os.path.join(project_name, "modules", module_name), + os.path.join(project_name, "env"), + os.path.join(project_name, "env", "dev"), + os.path.join(project_name, "env", "prod"), + os.path.join(project_name, ".github"), + os.path.join(project_name, ".github", "workflows") +] + +files = { + os.path.join(project_name, "main.tf"): """terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 3.0" + } + } + required_version = ">= 0.12" +} + +provider "aws" { + region = var.aws_region +} + +module "ec2_module" { + source = "./modules/ec2-module" + instance_type = var.instance_type + ami = var.ami + key_name = var.key_name +} +""", + os.path.join(project_name, "variables.tf"): """variable "aws_region" { + description = "The AWS region to deploy to" type = string default = "us-east-1" -}} +} -variable "instance_type" {{ - description = "EC2 Instance type" +variable "instance_type" { + description = "EC2 instance type" type = string default = "t2.micro" -}} +} -variable "ami" {{ - description = "AMI ID" +variable "ami" { + description = "AMI to use for the EC2 instance" type = string - default = "ami-0c55b159cbfafe1f0" -}} -""" +} -github_actions = """name: Terraform CI +variable "key_name" { + description = "Key pair name to access the instance" + type = string +} +""", + os.path.join(project_name, "outputs.tf"): """output "instance_id" { + value = module.ec2_module.instance_id +} +""", + os.path.join(project_name, "modules", module_name, "main.tf"): """resource "aws_instance" "example" { + ami = var.ami + instance_type = var.instance_type + key_name = var.key_name + + tags = { + Name = "MyInstance" + } +} + +output "instance_id" { + value = aws_instance.example.id +} +""", + os.path.join(project_name, "env", "dev", "terraform.tfvars"): """aws_region = "us-east-1" +instance_type = "t2.micro" +ami = "" +key_name = "" +""", + os.path.join(project_name, "env", "prod", "terraform.tfvars"): """aws_region = "us-east-1" +instance_type = "t2.micro" +ami = "" +key_name = "" +""", + os.path.join(project_name, ".github", "workflows", "terraform.yml"): """name: Terraform on: push: branches: - main - pull_request: - branches: - - main jobs: terraform: runs-on: ubuntu-latest - steps: - name: Checkout code uses: actions/checkout@v2 @@ -68,21 +109,16 @@ run: terraform init - name: Terraform Plan - run: terraform plan + run: terraform plan -var-file=env/dev/terraform.tfvars - name: Terraform Apply - run: terraform apply -auto-approve - env: - TF_VAR_region: ${{ secrets.AWS_REGION }} - TF_VAR_instance_type: ${{ secrets.AWS_INSTANCE_TYPE }} - TF_VAR_ami: ${{ secrets.AWS_AMI }} + run: terraform apply -auto-approve -var-file=env/dev/terraform.tfvars """ +} -with open(os.path.join(base_directory, "main.tf"), "w") as f: - f.write(terraform_main) - -with open(os.path.join(base_directory, "variables.tf"), "w") as f: - f.write(terraform_variables) +for directory in directories: + os.makedirs(directory, exist_ok=True) -with open(os.path.join(ci_directory, "terraform-ci.yml"), "w") as f: - f.write(github_actions) \ No newline at end of file +for file_path, file_content in files.items(): + with open(file_path, 'w') as file: + file.write(file_content) \ No newline at end of file diff --git a/app/media/MyHelm/templates/web/_helpers.tpl b/app/media/MyHelm/templates/web/_helpers.tpl new file mode 100644 index 00000000..872281b7 --- /dev/null +++ b/app/media/MyHelm/templates/web/_helpers.tpl @@ -0,0 +1,8 @@ +{{/* Place helper variables here */}} +{{- define "<.Release.Name>.fullname" -}} +{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "<.Release.Name>.name" -}} +{{- .Chart.Name | lower -}} +{{- end -}} diff --git a/app/media/MyHelm/templates/web/deployment.yaml b/app/media/MyHelm/templates/web/deployment.yaml index 236c68b5..e8642803 100644 --- a/app/media/MyHelm/templates/web/deployment.yaml +++ b/app/media/MyHelm/templates/web/deployment.yaml @@ -1,21 +1,22 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "MyHelm.fullname" . }}-web + name: {{ include "<.Release.Name>.fullname" . }} spec: replicas: {{ .Values.web.replicas }} + selector: + matchLabels: + app: {{ include "<.Release.Name>.name" . }} template: metadata: labels: - app: {{ include "MyHelm.name" . }} + app: {{ include "<.Release.Name>.name" . }} spec: containers: - - name: web + - name: {{ include "<.Release.Name>.name" . }} image: {{ .Values.web.image }} ports: - containerPort: {{ .Values.web.service.targetPort }} env: - {{- range .Values.web.env }} - - name: {{ .name }} - value: {{ .value }} - {{- end }} + - name: ENV1 + value: Hi diff --git a/app/media/MyHelm/templates/web/helpers.tpl b/app/media/MyHelm/templates/web/helpers.tpl deleted file mode 100644 index ed3d9146..00000000 --- a/app/media/MyHelm/templates/web/helpers.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "MyHelm.name" -}} -{{- .Chart.Name | replace "-" "_" | lower -}} -{{- end -}} - -{{/* -Create a default fully qualified domain name -*/}} -{{- define "MyHelm.fullname" -}} -{{- if .Chart.Name -}} -{{- .Release.Name | lower | replace "-" "_" | trimSuffix "-" | append (include "MyHelm.name" . | lower) | toLower -}} -{{- else -}} -{{- .Release.Name | lower -}} -{{- end -}} -{{- end -}} diff --git a/app/media/MyHelm/templates/web/ingress.yaml b/app/media/MyHelm/templates/web/ingress.yaml new file mode 100644 index 00000000..37f445d0 --- /dev/null +++ b/app/media/MyHelm/templates/web/ingress.yaml @@ -0,0 +1,16 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "<.Release.Name>.fullname" . }} +spec: + rules: + - host: {{ .Values.web.ingress.host }} + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: {{ include "<.Release.Name>.fullname" . }} + port: + number: 80 diff --git a/app/media/MyHelm/templates/web/secret.yaml b/app/media/MyHelm/templates/web/secret.yaml index 9232ac65..d06709ab 100644 --- a/app/media/MyHelm/templates/web/secret.yaml +++ b/app/media/MyHelm/templates/web/secret.yaml @@ -1,7 +1,7 @@ apiVersion: v1 kind: Secret metadata: - name: {{ include "MyHelm.fullname" . }}-web-env + name: {{ include "<.Release.Name>.fullname" . }}-secret type: Opaque data: - ENV1: {{ .Values.web.env | toJson | b64enc | quote }} + ENV1: {{ .Values.web.env[0].value | b64enc | quote }} diff --git a/app/media/MyHelm/templates/web/service.yaml b/app/media/MyHelm/templates/web/service.yaml index e715851b..3b8d624b 100644 --- a/app/media/MyHelm/templates/web/service.yaml +++ b/app/media/MyHelm/templates/web/service.yaml @@ -1,10 +1,11 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "MyHelm.fullname" . }}-web + name: {{ include "<.Release.Name>.fullname" . }} spec: type: ClusterIP ports: - - port: {{ .Values.web.service.targetPort }} + - port: 80 + targetPort: {{ .Values.web.service.targetPort }} selector: - app: {{ include "MyHelm.name" . }} + app: {{ include "<.Release.Name>.name" . }} diff --git a/app/media/MyTerraform/.github/workflows/terraform-ci.yml b/app/media/MyTerraform/.github/workflows/terraform.yml similarity index 56% rename from app/media/MyTerraform/.github/workflows/terraform-ci.yml rename to app/media/MyTerraform/.github/workflows/terraform.yml index 8c6e977e..edddcb54 100644 --- a/app/media/MyTerraform/.github/workflows/terraform-ci.yml +++ b/app/media/MyTerraform/.github/workflows/terraform.yml @@ -1,17 +1,13 @@ -name: Terraform CI +name: Terraform on: push: branches: - main - pull_request: - branches: - - main jobs: terraform: runs-on: ubuntu-latest - steps: - name: Checkout code uses: actions/checkout@v2 @@ -25,11 +21,7 @@ jobs: run: terraform init - name: Terraform Plan - run: terraform plan + run: terraform plan -var-file=env/dev/terraform.tfvars - name: Terraform Apply - run: terraform apply -auto-approve - env: - TF_VAR_region: ${{ secrets.AWS_REGION }} - TF_VAR_instance_type: ${{ secrets.AWS_INSTANCE_TYPE }} - TF_VAR_ami: ${{ secrets.AWS_AMI }} + run: terraform apply -auto-approve -var-file=env/dev/terraform.tfvars diff --git a/app/media/MyTerraform/env/dev/terraform.tfvars b/app/media/MyTerraform/env/dev/terraform.tfvars new file mode 100644 index 00000000..c2c7538a --- /dev/null +++ b/app/media/MyTerraform/env/dev/terraform.tfvars @@ -0,0 +1,4 @@ +aws_region = "us-east-1" +instance_type = "t2.micro" +ami = "" +key_name = "" diff --git a/app/media/MyTerraform/env/prod/terraform.tfvars b/app/media/MyTerraform/env/prod/terraform.tfvars new file mode 100644 index 00000000..c2c7538a --- /dev/null +++ b/app/media/MyTerraform/env/prod/terraform.tfvars @@ -0,0 +1,4 @@ +aws_region = "us-east-1" +instance_type = "t2.micro" +ami = "" +key_name = "" diff --git a/app/media/MyTerraform/main.tf b/app/media/MyTerraform/main.tf index 71842c53..e540c0ca 100644 --- a/app/media/MyTerraform/main.tf +++ b/app/media/MyTerraform/main.tf @@ -1,12 +1,20 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 3.0" + } + } + required_version = ">= 0.12" +} + provider "aws" { - region = "us-east-1" + region = var.aws_region } -resource "aws_instance" "web" { - ami = "ami-0c55b159cbfafe1f0" - instance_type = "t2.micro" - - tags = { - Name = "MyEC2Instance" - } +module "ec2_module" { + source = "./modules/ec2-module" + instance_type = var.instance_type + ami = var.ami + key_name = var.key_name } diff --git a/app/media/MyTerraform/modules/ec2-module/main.tf b/app/media/MyTerraform/modules/ec2-module/main.tf new file mode 100644 index 00000000..0a48ce45 --- /dev/null +++ b/app/media/MyTerraform/modules/ec2-module/main.tf @@ -0,0 +1,13 @@ +resource "aws_instance" "example" { + ami = var.ami + instance_type = var.instance_type + key_name = var.key_name + + tags = { + Name = "MyInstance" + } +} + +output "instance_id" { + value = aws_instance.example.id +} diff --git a/app/media/MyTerraform/outputs.tf b/app/media/MyTerraform/outputs.tf new file mode 100644 index 00000000..d4a4603d --- /dev/null +++ b/app/media/MyTerraform/outputs.tf @@ -0,0 +1,3 @@ +output "instance_id" { + value = module.ec2_module.instance_id +} diff --git a/app/media/MyTerraform/variables.tf b/app/media/MyTerraform/variables.tf index e3b293c4..1dc2e809 100644 --- a/app/media/MyTerraform/variables.tf +++ b/app/media/MyTerraform/variables.tf @@ -1,17 +1,21 @@ -variable "region" {{ - description = "AWS region" +variable "aws_region" { + description = "The AWS region to deploy to" type = string default = "us-east-1" -}} +} -variable "instance_type" {{ - description = "EC2 Instance type" +variable "instance_type" { + description = "EC2 instance type" type = string default = "t2.micro" -}} +} -variable "ami" {{ - description = "AMI ID" +variable "ami" { + description = "AMI to use for the EC2 instance" type = string - default = "ami-0c55b159cbfafe1f0" -}} +} + +variable "key_name" { + description = "Key pair name to access the instance" + type = string +} diff --git a/app/models/__pycache__/helm_models.cpython-311.pyc b/app/models/__pycache__/helm_models.cpython-311.pyc index 79446c5ac339b206311139e9ea61f4e4b8092b15..5ebbfc3694b6519dcfb8cf99ce672cfed855f707 100644 GIT binary patch delta 144 zcmeyZ_gjy5IWI340}%AR&`p245y<7V2l9%HfW+hke(A{{*bOIh^0_g(P7dIE!00{M zkpBr|;ASxa2Sye)1~&f5iQGz?YXo(f7^63@5>{tqOq_g4q?0jxbByR-MlD4~(GLum SM2F@_kmwhLl-p!yaSH%2Iwq0; delta 144 zcmeyZ_gjy5IWI340}vFH>7;+$2;_1)0C`15Kw@$Nzx3n}?1qy$`P>-YCI|36VDy=6 z$p3^fXtS7r10xFu0~`P3L~fPXPXultH#{mF7Dg}oC diff --git a/app/prompt_generators.py b/app/prompt_generators.py index f9d39177..599dfe2e 100644 --- a/app/prompt_generators.py +++ b/app/prompt_generators.py @@ -90,13 +90,14 @@ def helm_template_generator(input : HelmTemplateGeneration) -> str: ) initialize ingress with a default host for pod if the pod ingress is true in here {ingress_}. - if environment variable is considered for pod, then create secret.yaml in the related template. creating secret.yaml based on environemt variables in the {envs} in the template is very important. creating deployment.yaml based on our pods in the template is very important. please set a something default in chart.yaml and values.yaml based on the requirement. + at the last, Create all related templates following values.yaml. + in the final stage, put helpers.tpl in all templates and set the content based on information given. """ return prompt diff --git a/app/tests/__pycache__/__init__.cpython-311.pyc b/app/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cf4c1bb128de9628d1f2810c7c78ee77912d80a GIT binary patch literal 168 zcmZ3^%ge<81f}nE(?RrO5CH>>P{wCAAY(d13PUi1CZpdzDsIxc1eB#kS@zFD2{i|NGwUpFVRmdD9|rSEiNh6kB`sH%PfhH*DI*} k#bJ}1pHiBWYFESxGz(-~F+Y&_z|6?V_<;dN6fpzE0Av0rUjP6A literal 0 HcmV?d00001 diff --git a/app/tests/__pycache__/test_helm_template.cpython-311-pytest-7.4.0.pyc b/app/tests/__pycache__/test_helm_template.cpython-311-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aee2c3e14d2a06c14de5d162d1d9130177dcebe6 GIT binary patch literal 11128 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 S#^6R8x;~RwDX*FDaQ^|QmN3`= literal 0 HcmV?d00001 diff --git a/app/tests/__pycache__/test_helm_template.cpython-311-pytest-8.3.3.pyc b/app/tests/__pycache__/test_helm_template.cpython-311-pytest-8.3.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5253aca7b0c6f3871dc7cd318ca5748c7b1aa144 GIT binary patch literal 11136 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 E0rd+7?f?J) literal 0 HcmV?d00001 diff --git a/app/tests/__pycache__/test_iac_basic.cpython-311-pytest-8.3.3.pyc b/app/tests/__pycache__/test_iac_basic.cpython-311-pytest-8.3.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85aaff70fd5d4b0d443b3fbe0d1e0ee5f0b3075a GIT binary patch literal 8811 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 E2>@yZ*Z=?k literal 0 HcmV?d00001 diff --git a/app/tests/__pycache__/test_iac_bugfix.cpython-311-pytest-7.4.0.pyc b/app/tests/__pycache__/test_iac_bugfix.cpython-311-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a8a335fba3a6401d4b461b002800be8742201c5 GIT binary patch literal 8828 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 J!iw4Q{0mQ`2%`W1 literal 0 HcmV?d00001 diff --git a/app/tests/__pycache__/test_iac_bugfix.cpython-311-pytest-8.3.3.pyc b/app/tests/__pycache__/test_iac_bugfix.cpython-311-pytest-8.3.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a8a335fba3a6401d4b461b002800be8742201c5 GIT binary patch literal 8828 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 J!iw4Q{0mQ`2%`W1 literal 0 HcmV?d00001 diff --git a/app/tests/__pycache__/test_iac_install.cpython-311-pytest-7.4.0.pyc b/app/tests/__pycache__/test_iac_install.cpython-311-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21346ca6cd4d2dd48c26750f25fd53e856af8a90 GIT binary patch literal 9105 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 F{{q$O@09=m literal 0 HcmV?d00001 diff --git a/app/tests/__pycache__/test_iac_template.cpython-311-pytest-8.3.3.pyc b/app/tests/__pycache__/test_iac_template.cpython-311-pytest-8.3.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9b96cd78186f7f5e1206998235e1df3da37c8bb GIT binary patch literal 7704 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 F{{q$O@09=m literal 0 HcmV?d00001 From 715089c40e978c3f7b6ccc8420685650137a832b Mon Sep 17 00:00:00 2001 From: abolfazl1381 Date: Fri, 8 Nov 2024 18:32:54 +0330 Subject: [PATCH 2/2] fix(helm): fix helm prompt --- .../prompt_generators.cpython-311.pyc | Bin 7996 -> 7961 bytes app/directory_generators/helm_generator.py | 213 ++++++++++-------- app/media/MyHelm/Chart.yaml | 3 - app/media/MyHelm/templates/web/_helpers.tpl | 8 - .../MyHelm/templates/web/deployment.yaml | 22 -- app/media/MyHelm/templates/web/helpers.tpl | 4 + app/media/MyHelm/templates/web/ingress.yaml | 16 -- app/media/MyHelm/templates/web/pvc.yaml | 11 + app/media/MyHelm/templates/web/secret.yaml | 7 - app/media/MyHelm/templates/web/secrets.yaml | 8 + app/media/MyHelm/templates/web/service.yaml | 9 +- .../MyHelm/templates/web/statefulset.yaml | 26 +++ app/media/MyHelm/values.yaml | 10 +- app/prompt_generators.py | 13 +- 14 files changed, 178 insertions(+), 172 deletions(-) delete mode 100644 app/media/MyHelm/templates/web/_helpers.tpl delete mode 100644 app/media/MyHelm/templates/web/deployment.yaml create mode 100644 app/media/MyHelm/templates/web/helpers.tpl delete mode 100644 app/media/MyHelm/templates/web/ingress.yaml create mode 100644 app/media/MyHelm/templates/web/pvc.yaml delete mode 100644 app/media/MyHelm/templates/web/secret.yaml create mode 100644 app/media/MyHelm/templates/web/secrets.yaml create mode 100644 app/media/MyHelm/templates/web/statefulset.yaml diff --git a/app/__pycache__/prompt_generators.cpython-311.pyc b/app/__pycache__/prompt_generators.cpython-311.pyc index 2ae13e4378abdccf2ebe74ddfeb2c9316e450d80..32d46678764948b33777536154656d6be8646b26 100644 GIT binary patch delta 612 zcmZ{i%}T>S6ou!y5h4-)tJdmO`~i(Y1S^P$3sGDsiXylX(`HfwX(nW*f~)!tUHJrV z1d(oB_yX<}dk(HSSZ7uPa<(s<*{;aylRAA?31peZK#k`ffva?*+~{7s71tngcL{dY7%9pA|;PHCOnlP z1&+%+b0~{A2rIRe;!^Ro7uC3IH8o+9>+*MsHZ$2d17E}o3ImZ=Xc$WTK0|VPkNUPF zEL_Vfv`r3693^%BQ#6M2*evE30L~g06OZ-j-ag&OcHjVXe|BftHo(?5KZ<*L(2x5bXlVVP(V^jV^wbASj70qF^8-5`q{76$2uAOS@C+G|Y65J-rKiT7Q6t zz@G98auNx9@!-j8E(-Y}{S(r?aa#!p_My7^6|df_qJOMiuSGwjsKnfvAFrJJ{uS{E zUUXD+*WY(jDV5rbBjuK;A<2f&N@gStHnDUG>`7tkamv8st1 z!h&34DoviHD5Ni;rqoqpG?e8&tCaB3>GFg;dBkj`c+3mOP_pNPvIiSQuQ9&>#(Ixl zcW<&mx``sol{Q?OC-h>SI0Hz#eAMA7hknO-%urmR8!@kWy t0`_e{mf0q3gIx)Lw{x~(KX<-Q9>LNA4BgJYx6IvFMfZ9#=wbIM{{m^F&td=o diff --git a/app/directory_generators/helm_generator.py b/app/directory_generators/helm_generator.py index f70b7d5e..1243bffc 100644 --- a/app/directory_generators/helm_generator.py +++ b/app/directory_generators/helm_generator.py @@ -1,129 +1,142 @@ import os -class Persistance: - def __init__(self, size, accessModes): - self.size = size - self.accessModes = accessModes +# Define project structure +project_name = 'app/media/MyHelm' +directories = ['charts', 'templates/web'] +files = ['Chart.yaml', 'values.yaml'] +template_files = ['service.yaml', 'secrets.yaml', 'helpers.tpl'] +stateless = False +persistence = True +docker_images = {'web': 'nginx'} +target_ports = {'web': 80} +replicas = {'web': 1} +pvc = {'web': {'size': '1Gi', 'accessModes': ['ReadWriteOnce']}} +environment = {'web': [{'name': 'ENV1', 'value': 'Hi'}]} +ingress = {'web': {'enabled': False, 'host': 'www.example.com'}} -class Environment: - def __init__(self, name, value): - self.name = name - self.value = value +# Create directories +for directory in directories: + os.makedirs(os.path.join(project_name, directory), exist_ok=True) -def create_helm_structure(base_path): - os.makedirs(os.path.join(base_path, "charts"), exist_ok=True) - os.makedirs(os.path.join(base_path, "templates/web"), exist_ok=True) +# Create base files +with open(os.path.join(project_name, 'Chart.yaml'), 'w') as chart_file: + chart_file.write("apiVersion: v2\n") - chart_yaml_content = """apiVersion: v2 -name: MyHelm -description: A Helm chart for Kubernetes -version: 0.1.0 -""" - with open(os.path.join(base_path, "Chart.yaml"), "w") as f: - f.write(chart_yaml_content) +with open(os.path.join(project_name, 'values.yaml'), 'w') as values_file: + values_content = f"web:\n image: {docker_images['web']}\n service:\n port: {target_ports['web']}\n" + values_content += f" replicaCount: {replicas['web']}\n" + if persistence: + values_content += f" persistence:\n size: {pvc['web']['size']}\n accessModes: {pvc['web']['accessModes'][0]}\n" + values_content += " env:\n" + for env in environment['web']: + values_content += f" - name: {env['name']}\n value: {env['value']}\n" + values_content += f" ingress:\n enabled: {ingress['web']['enabled']}\n host: {ingress['web']['host']}\n" + values_content += f" stateless: {stateless}\n" + values_file.write(values_content) - values_yaml_content = """web: - image: nginx - service: - targetPort: 80 - replicas: 1 - persistence: - size: 1Gi - accessModes: - - ReadWriteOnce - env: - - name: ENV1 - value: Hi - ingress: - enabled: false - host: www.example.com -""" - with open(os.path.join(base_path, "values.yaml"), "w") as f: - f.write(values_yaml_content) - - service_yaml_content = """apiVersion: v1 +# Create template files +for template in template_files: + with open(os.path.join(project_name, 'templates/web', template), 'w') as temp_file: + if template == 'service.yaml': + temp_file.write(""" +apiVersion: v1 kind: Service metadata: - name: {{ include "<.Release.Name>.fullname" . }} + name: {{ .Release.Name }}-web spec: - type: ClusterIP ports: - - port: 80 - targetPort: {{ .Values.web.service.targetPort }} + - port: {{ .Values.web.service.port }} selector: - app: {{ include "<.Release.Name>.name" . }} -""" - with open(os.path.join(base_path, "templates/web/service.yaml"), "w") as f: - f.write(service_yaml_content) + app: {{ .Release.Name }}-web +""") + elif template == 'secrets.yaml': + temp_file.write(""" +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Release.Name }}-web-secrets +type: Opaque +data: + ENV1: {{ .Values.web.env[0].value | b64enc }} +""") + elif template == 'helpers.tpl': + temp_file.write(""" +{{- define "app.media.MyHelm.fullname" -}} +{{- .Release.Name }}-web +{{- end -}} +""") - deployment_yaml_content = """apiVersion: apps/v1 +# Create StatefulSet or Deployment based on statefulness +if stateless: + with open(os.path.join(project_name, 'templates/web/deployment.yaml'), 'w') as deploy_file: + deploy_file.write(""" +apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "<.Release.Name>.fullname" . }} + name: {{ include "app.media.MyHelm.fullname" . }} spec: - replicas: {{ .Values.web.replicas }} + replicas: {{ .Values.web.replicaCount }} selector: matchLabels: - app: {{ include "<.Release.Name>.name" . }} + app: {{ include "app.media.MyHelm.fullname" . }} template: metadata: labels: - app: {{ include "<.Release.Name>.name" . }} + app: {{ include "app.media.MyHelm.fullname" . }} spec: containers: - - name: {{ include "<.Release.Name>.name" . }} + - name: web image: {{ .Values.web.image }} ports: - - containerPort: {{ .Values.web.service.targetPort }} + - containerPort: {{ .Values.web.service.port }} env: - - name: ENV1 - value: Hi -""" - with open(os.path.join(base_path, "templates/web/deployment.yaml"), "w") as f: - f.write(deployment_yaml_content) - - if True: # Ingress enabled condition - ingress_yaml_content = """apiVersion: networking.k8s.io/v1 -kind: Ingress + {{- range .Values.web.env }} + - name: {{ .name }} + value: {{ .value }} + {{- end }} +""") +else: + with open(os.path.join(project_name, 'templates/web/statefulset.yaml'), 'w') as stateful_file: + stateful_file.write(""" +apiVersion: apps/v1 +kind: StatefulSet metadata: - name: {{ include "<.Release.Name>.fullname" . }} + name: {{ include "app.media.MyHelm.fullname" . }} spec: - rules: - - host: {{ .Values.web.ingress.host }} - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "<.Release.Name>.fullname" . }} - port: - number: 80 -""" - with open(os.path.join(base_path, "templates/web/ingress.yaml"), "w") as f: - f.write(ingress_yaml_content) + serviceName: {{ include "app.media.MyHelm.fullname" . }} + replicas: {{ .Values.web.replicaCount }} + selector: + matchLabels: + app: {{ include "app.media.MyHelm.fullname" . }} + template: + metadata: + labels: + app: {{ include "app.media.MyHelm.fullname" . }} + spec: + containers: + - name: web + image: {{ .Values.web.image }} + ports: + - containerPort: {{ .Values.web.service.port }} + env: + {{- range .Values.web.env }} + - name: {{ .name }} + value: {{ .value }} + {{- end }} +""") - secret_yaml_content = """apiVersion: v1 -kind: Secret +# Create PVC if persistence is configured +if persistence: + with open(os.path.join(project_name, 'templates/web/pvc.yaml'), 'w') as pvc_file: + pvc_file.write(""" +apiVersion: v1 +kind: PersistentVolumeClaim metadata: - name: {{ include "<.Release.Name>.fullname" . }}-secret -type: Opaque -data: - ENV1: {{ .Values.web.env[0].value | b64enc | quote }} -""" - with open(os.path.join(base_path, "templates/web/secret.yaml"), "w") as f: - f.write(secret_yaml_content) - - helpers_tpl_content = """{{/* Place helper variables here */}} -{{- define "<.Release.Name>.fullname" -}} -{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- define "<.Release.Name>.name" -}} -{{- .Chart.Name | lower -}} -{{- end -}} -""" - with open(os.path.join(base_path, "templates/web/_helpers.tpl"), "w") as f: - f.write(helpers_tpl_content) - -create_helm_structure("app/media/MyHelm") \ No newline at end of file + name: {{ include "app.media.MyHelm.fullname" . }}-pvc +spec: + accessModes: + - {{ .Values.web.persistence.accessModes }} + resources: + requests: + storage: {{ .Values.web.persistence.size }} +""") \ No newline at end of file diff --git a/app/media/MyHelm/Chart.yaml b/app/media/MyHelm/Chart.yaml index 95e441a0..833d5767 100644 --- a/app/media/MyHelm/Chart.yaml +++ b/app/media/MyHelm/Chart.yaml @@ -1,4 +1 @@ apiVersion: v2 -name: MyHelm -description: A Helm chart for Kubernetes -version: 0.1.0 diff --git a/app/media/MyHelm/templates/web/_helpers.tpl b/app/media/MyHelm/templates/web/_helpers.tpl deleted file mode 100644 index 872281b7..00000000 --- a/app/media/MyHelm/templates/web/_helpers.tpl +++ /dev/null @@ -1,8 +0,0 @@ -{{/* Place helper variables here */}} -{{- define "<.Release.Name>.fullname" -}} -{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- define "<.Release.Name>.name" -}} -{{- .Chart.Name | lower -}} -{{- end -}} diff --git a/app/media/MyHelm/templates/web/deployment.yaml b/app/media/MyHelm/templates/web/deployment.yaml deleted file mode 100644 index e8642803..00000000 --- a/app/media/MyHelm/templates/web/deployment.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "<.Release.Name>.fullname" . }} -spec: - replicas: {{ .Values.web.replicas }} - selector: - matchLabels: - app: {{ include "<.Release.Name>.name" . }} - template: - metadata: - labels: - app: {{ include "<.Release.Name>.name" . }} - spec: - containers: - - name: {{ include "<.Release.Name>.name" . }} - image: {{ .Values.web.image }} - ports: - - containerPort: {{ .Values.web.service.targetPort }} - env: - - name: ENV1 - value: Hi diff --git a/app/media/MyHelm/templates/web/helpers.tpl b/app/media/MyHelm/templates/web/helpers.tpl new file mode 100644 index 00000000..6a037aaa --- /dev/null +++ b/app/media/MyHelm/templates/web/helpers.tpl @@ -0,0 +1,4 @@ + +{{- define "app.media.MyHelm.fullname" -}} +{{- .Release.Name }}-web +{{- end -}} diff --git a/app/media/MyHelm/templates/web/ingress.yaml b/app/media/MyHelm/templates/web/ingress.yaml deleted file mode 100644 index 37f445d0..00000000 --- a/app/media/MyHelm/templates/web/ingress.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "<.Release.Name>.fullname" . }} -spec: - rules: - - host: {{ .Values.web.ingress.host }} - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: {{ include "<.Release.Name>.fullname" . }} - port: - number: 80 diff --git a/app/media/MyHelm/templates/web/pvc.yaml b/app/media/MyHelm/templates/web/pvc.yaml new file mode 100644 index 00000000..1f54dad1 --- /dev/null +++ b/app/media/MyHelm/templates/web/pvc.yaml @@ -0,0 +1,11 @@ + +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "app.media.MyHelm.fullname" . }}-pvc +spec: + accessModes: + - {{ .Values.web.persistence.accessModes }} + resources: + requests: + storage: {{ .Values.web.persistence.size }} diff --git a/app/media/MyHelm/templates/web/secret.yaml b/app/media/MyHelm/templates/web/secret.yaml deleted file mode 100644 index d06709ab..00000000 --- a/app/media/MyHelm/templates/web/secret.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "<.Release.Name>.fullname" . }}-secret -type: Opaque -data: - ENV1: {{ .Values.web.env[0].value | b64enc | quote }} diff --git a/app/media/MyHelm/templates/web/secrets.yaml b/app/media/MyHelm/templates/web/secrets.yaml new file mode 100644 index 00000000..aae75db9 --- /dev/null +++ b/app/media/MyHelm/templates/web/secrets.yaml @@ -0,0 +1,8 @@ + +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Release.Name }}-web-secrets +type: Opaque +data: + ENV1: {{ .Values.web.env[0].value | b64enc }} diff --git a/app/media/MyHelm/templates/web/service.yaml b/app/media/MyHelm/templates/web/service.yaml index 3b8d624b..1b596633 100644 --- a/app/media/MyHelm/templates/web/service.yaml +++ b/app/media/MyHelm/templates/web/service.yaml @@ -1,11 +1,10 @@ + apiVersion: v1 kind: Service metadata: - name: {{ include "<.Release.Name>.fullname" . }} + name: {{ .Release.Name }}-web spec: - type: ClusterIP ports: - - port: 80 - targetPort: {{ .Values.web.service.targetPort }} + - port: {{ .Values.web.service.port }} selector: - app: {{ include "<.Release.Name>.name" . }} + app: {{ .Release.Name }}-web diff --git a/app/media/MyHelm/templates/web/statefulset.yaml b/app/media/MyHelm/templates/web/statefulset.yaml new file mode 100644 index 00000000..1332fc9b --- /dev/null +++ b/app/media/MyHelm/templates/web/statefulset.yaml @@ -0,0 +1,26 @@ + +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "app.media.MyHelm.fullname" . }} +spec: + serviceName: {{ include "app.media.MyHelm.fullname" . }} + replicas: {{ .Values.web.replicaCount }} + selector: + matchLabels: + app: {{ include "app.media.MyHelm.fullname" . }} + template: + metadata: + labels: + app: {{ include "app.media.MyHelm.fullname" . }} + spec: + containers: + - name: web + image: {{ .Values.web.image }} + ports: + - containerPort: {{ .Values.web.service.port }} + env: + {{- range .Values.web.env }} + - name: {{ .name }} + value: {{ .value }} + {{- end }} diff --git a/app/media/MyHelm/values.yaml b/app/media/MyHelm/values.yaml index d86070fa..baf76332 100644 --- a/app/media/MyHelm/values.yaml +++ b/app/media/MyHelm/values.yaml @@ -1,15 +1,15 @@ web: image: nginx service: - targetPort: 80 - replicas: 1 + port: 80 + replicaCount: 1 persistence: size: 1Gi - accessModes: - - ReadWriteOnce + accessModes: ReadWriteOnce env: - name: ENV1 value: Hi ingress: - enabled: false + enabled: False host: www.example.com + stateless: False diff --git a/app/prompt_generators.py b/app/prompt_generators.py index 599dfe2e..b74db9bd 100644 --- a/app/prompt_generators.py +++ b/app/prompt_generators.py @@ -89,14 +89,15 @@ def helm_template_generator(input : HelmTemplateGeneration) -> str: name=value ) initialize ingress with a default host for pod if the pod ingress is true in here {ingress_}. + set stateless in pod based on {status}. + + - - if environment variable is considered for pod, then create secret.yaml in the related template. - creating secret.yaml based on environemt variables in the {envs} in the template is very important. - creating deployment.yaml based on our pods in the template is very important. - please set a something default in chart.yaml and values.yaml based on the requirement. + at the last, Create all related templates following values.yaml. if stateless of pod is true, create deployment.yaml and if + it is false, create Statefullset.yaml in template or if persistance is configured in values.yaml, create pvc.yaml in templates. + don't forget to create secrets.yaml too. - at the last, Create all related templates following values.yaml. + be sure to create templates following values.yaml in the final stage, put helpers.tpl in all templates and set the content based on information given. """