11import os
22
33project_name = "app/media/MyHelm"
4- chart_structure = {
5- "charts" : {},
6- "templates" : {
7- "web" : {}
8- }
9- }
10-
11- values_data = {
12- 'web' : {
13- 'image' : 'nginx' ,
14- 'targetPort' : 80 ,
15- 'replicaCount' : 1 ,
16- 'persistence' : {
17- 'size' : '1Gi' ,
18- 'accessModes' : 'ReadWriteOnce'
19- },
20- 'env' : [
21- {'name' : 'ENV1' , 'value' : 'Hi' }
22- ],
23- 'ingress' : {
24- 'enabled' : False ,
25- 'host' : 'www.example.com'
26- },
27- 'stateless' : True
28- }
29- }
30-
31- def create_file (path , content = "" ):
32- with open (path , 'w' ) as file :
33- file .write (content )
34-
35- os .makedirs (os .path .join (project_name , "charts" ), exist_ok = True )
36- os .makedirs (os .path .join (project_name , "templates" , "web" ), exist_ok = True )
37-
38- chart_yaml_content = """apiVersion: v2
39- name: mychart
40- description: A Helm chart for Kubernetes
41- version: 0.1.0
42- """
43-
44- values_yaml_content = """web:
45- image: nginx
46- targetPort: 80
47- replicaCount: 1
48- persistence:
49- size: 1Gi
50- accessModes:
51- - ReadWriteOnce
52- env:
53- - name: ENV1
54- value: Hi
55- ingress:
56- enabled: false
57- host: www.example.com
58- stateless: true
59- """
60-
61- create_file (os .path .join (project_name , "Chart.yaml" ), chart_yaml_content )
62- create_file (os .path .join (project_name , "values.yaml" ), values_yaml_content )
63-
64- deployment_yaml_content = """apiVersion: apps/v1
65- kind: Deployment
66- metadata:
67- name: {{ .Release.Name }}-web
68- spec:
69- replicas: {{ .Values.web.replicaCount }}
70- selector:
71- matchLabels:
72- app: {{ .Release.Name }}-web
73- template:
74- metadata:
75- labels:
76- app: {{ .Release.Name }}-web
77- spec:
78- containers:
79- - name: web
80- image: {{ .Values.web.image }}
81- ports:
82- - containerPort: {{ .Values.web.targetPort }}
83- env:
84- {{- range .Values.web.env }}
85- - name: {{ .name }}
86- value: {{ .value | quote }}
87- {{- end }}
88- """
89-
90- service_yaml_content = """apiVersion: v1
91- kind: Service
92- metadata:
93- name: {{ .Release.Name }}-web
94- spec:
95- ports:
96- - port: {{ .Values.web.targetPort }}
97- selector:
98- app: {{ .Release.Name }}-web
99- """
100-
101- secrets_yaml_content = """apiVersion: v1
102- kind: Secret
103- metadata:
104- name: {{ .Release.Name }}-secret
105- type: Opaque
106- data:
107- example-key: {{ .Values.secret.exampleKey | b64enc | quote }}
108- """
109-
110- create_file (os .path .join (project_name , "templates" , "web" , "deployment.yaml" ), deployment_yaml_content )
111- create_file (os .path .join (project_name , "templates" , "web" , "service.yaml" ), service_yaml_content )
112- create_file (os .path .join (project_name , "templates" , "web" , "secrets.yaml" ), secrets_yaml_content )
113-
114- if values_data ['web' ]['stateless' ]:
115- create_file (os .path .join (project_name , "templates" , "web" , "statefulset.yaml" ), "" )
116- else :
117- create_file (os .path .join (project_name , "templates" , "web" , "statefulset.yaml" ), "" )
118-
119- if values_data ['web' ]['ingress' ]['enabled' ]:
120- ingress_yaml_content = """apiVersion: networking.k8s.io/v1
121- kind: Ingress
122- metadata:
123- name: {{ .Release.Name }}-web
124- spec:
125- rules:
126- - host: {{ .Values.web.ingress.host }}
127- http:
128- paths:
129- - path: /
130- pathType: Prefix
131- backend:
132- service:
133- name: {{ .Release.Name }}-web
134- port:
135- number: {{ .Values.web.targetPort }}
136- """
137- create_file (os .path .join (project_name , "templates" , "web" , "ingress.yaml" ), ingress_yaml_content )
138-
139- pvc_yaml_content = """apiVersion: v1
140- kind: PersistentVolumeClaim
141- metadata:
142- name: {{ .Release.Name }}-web
143- spec:
144- accessModes:
145- - {{ .Values.web.persistence.accessModes | first }}
146- resources:
147- requests:
148- storage: {{ .Values.web.persistence.size }}
149- """
150-
151- create_file (os .path .join (project_name , "templates" , "web" , "pvc.yaml" ), pvc_yaml_content )
152-
153- helpers_tpl_content = """{{/*
154- Common utility functions for templates
155- */}}
156-
157- {{- define "mychart.name" -}}
158- {{ .Release.Name }}-{{ .Chart.Name }}
159- {{- end -}}
160- """
161-
162- create_file (os .path .join (project_name , "templates" , "web" , "helpers.tpl" ), helpers_tpl_content )
4+ charts_dir = os .path .join (project_name , "charts" )
5+ templates_dir = os .path .join (project_name , "templates" )
6+ web_dir = os .path .join (templates_dir , "web" )
7+
8+ # Create project directories
9+ os .makedirs (charts_dir , exist_ok = True )
10+ os .makedirs (templates_dir , exist_ok = True )
11+ os .makedirs (web_dir , exist_ok = True )
12+
13+ # Create Chart.yaml
14+ with open (os .path .join (project_name , "Chart.yaml" ), "w" ) as chart_file :
15+ chart_file .write ("apiVersion: v2\n " )
16+ chart_file .write ("name: MyHelm\n " )
17+ chart_file .write ("description: A Helm chart for Kubernetes\n " )
18+ chart_file .write ("version: 0.1.0\n " )
19+
20+ # Create values.yaml
21+ with open (os .path .join (project_name , "values.yaml" ), "w" ) as values_file :
22+ values_file .write ("web:\n " )
23+ values_file .write (" image: nginx\n " )
24+ values_file .write (" targetPort: 80\n " )
25+ values_file .write (" replicas: 1\n " )
26+ values_file .write (" persistence:\n " )
27+ values_file .write (" size: 1Gi\n " )
28+ values_file .write (" accessModes:\n " )
29+ values_file .write (" - ReadWriteOnce\n " )
30+ values_file .write (" env:\n " )
31+ values_file .write (" - name: ENV1\n " )
32+ values_file .write (" value: Hi\n " )
33+ values_file .write (" ingress:\n " )
34+ values_file .write (" enabled: false\n " )
35+ values_file .write (" host: www.example.com\n " )
36+ values_file .write (" stateless:\n " )
37+ values_file .write (" enabled: false\n " )
38+
39+ # Create service.yaml
40+ with open (os .path .join (web_dir , "service.yaml" ), "w" ) as service_file :
41+ service_file .write ("apiVersion: v1\n " )
42+ service_file .write ("kind: Service\n " )
43+ service_file .write ("metadata:\n " )
44+ service_file .write (" name: web-service\n " )
45+ service_file .write ("spec:\n " )
46+ service_file .write (" type: ClusterIP\n " )
47+ service_file .write (" ports:\n " )
48+ service_file .write (" - port: 80\n " )
49+ service_file .write (" targetPort: {{ .Values.web.targetPort }}\n " )
50+ service_file .write (" selector:\n " )
51+ service_file .write (" app: web\n " )
52+
53+ # Create statefulset.yaml (since stateless is false)
54+ with open (os .path .join (web_dir , "statefulset.yaml" ), "w" ) as statefulset_file :
55+ statefulset_file .write ("apiVersion: apps/v1\n " )
56+ statefulset_file .write ("kind: StatefulSet\n " )
57+ statefulset_file .write ("metadata:\n " )
58+ statefulset_file .write (" name: web\n " )
59+ statefulset_file .write ("spec:\n " )
60+ statefulset_file .write (" serviceName: web-service\n " )
61+ statefulset_file .write (" replicas: {{ .Values.web.replicas }}\n " )
62+ statefulset_file .write (" selector:\n " )
63+ statefulset_file .write (" matchLabels:\n " )
64+ statefulset_file .write (" app: web\n " )
65+ statefulset_file .write (" template:\n " )
66+ statefulset_file .write (" metadata:\n " )
67+ statefulset_file .write (" labels:\n " )
68+ statefulset_file .write (" app: web\n " )
69+ statefulset_file .write (" spec:\n " )
70+ statefulset_file .write (" containers:\n " )
71+ statefulset_file .write (" - name: web\n " )
72+ statefulset_file .write (" image: {{ .Values.web.image }}\n " )
73+ statefulset_file .write (" ports:\n " )
74+ statefulset_file .write (" - containerPort: {{ .Values.web.targetPort }}\n " )
75+ statefulset_file .write (" env:\n " )
76+ statefulset_file .write (" - name: {{ .Values.web.env[0].name }}\n " )
77+ statefulset_file .write (" value: {{ .Values.web.env[0].value }}\n " )
78+ statefulset_file .write (" volumeClaimTemplates:\n " )
79+ statefulset_file .write (" - metadata:\n " )
80+ statefulset_file .write (" name: web-pvc\n " )
81+ statefulset_file .write (" spec:\n " )
82+ statefulset_file .write (" accessModes:\n " )
83+ statefulset_file .write (" - {{ .Values.web.persistence.accessModes[0] }}\n " )
84+ statefulset_file .write (" resources:\n " )
85+ statefulset_file .write (" requests:\n " )
86+ statefulset_file .write (" storage: {{ .Values.web.persistence.size }}\n " )
87+
88+ # Create pvc.yaml
89+ with open (os .path .join (web_dir , "pvc.yaml" ), "w" ) as pvc_file :
90+ pvc_file .write ("apiVersion: v1\n " )
91+ pvc_file .write ("kind: PersistentVolumeClaim\n " )
92+ pvc_file .write ("metadata:\n " )
93+ pvc_file .write (" name: web-pvc\n " )
94+ pvc_file .write ("spec:\n " )
95+ pvc_file .write (" accessModes:\n " )
96+ pvc_file .write (" - {{ .Values.web.persistence.accessModes[0] }}\n " )
97+ pvc_file .write (" resources:\n " )
98+ pvc_file .write (" requests:\n " )
99+ pvc_file .write (" storage: {{ .Values.web.persistence.size }}\n " )
100+
101+ # Create secrets.yaml
102+ with open (os .path .join (web_dir , "secrets.yaml" ), "w" ) as secrets_file :
103+ secrets_file .write ("apiVersion: v1\n " )
104+ secrets_file .write ("kind: Secret\n " )
105+ secrets_file .write ("metadata:\n " )
106+ secrets_file .write (" name: web-secrets\n " )
107+ secrets_file .write ("type: Opaque\n " )
108+ secrets_file .write ("data:\n " )
109+ secrets_file .write (" # Add your base64 encoded secrets here\n " )
110+
111+ # Create helpers.tpl
112+ with open (os .path .join (web_dir , "helpers.tpl" ), "w" ) as helpers_file :
113+ helpers_file .write ("# Define any helpers here\n " )
114+ helpers_file .write ("define \" web.fullname\" \n " )
115+ helpers_file .write (" {{ .Release.Name }}-{{ .Values.web.name }} \n " )
116+ helpers_file .write ("end\n " )
0 commit comments