Skip to content

Commit 031fb80

Browse files
committed
feat: add kubernetes support
1 parent fd15197 commit 031fb80

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+2686
-972
lines changed

.suite-cli/cli/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"chalk": "4.1.2",
2525
"commander": "^12.0.0",
2626
"figlet": "^1.7.0",
27+
"glob": "^11.0.0",
2728
"inquirer": "8.0.0",
2829
"ora": "5.4.1"
2930
}

.suite-cli/cli/scripts/assets/index.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ module.exports.ecosystemContent = require('./ecosystemContent.asset');
22
module.exports.envContent = require('./envContent.asset');
33
module.exports.apolloServerContent = require('./apolloServerContent.asset');
44
module.exports.k8sClusterDeploymentContent = require('./k8sClusterDeploymentContent.asset');
5-
module.exports.k8sIngressServiceContent = require('./k8sIngressServiceContent.asset');
6-
module.exports.k8sClusterIpServiceContent = require('./k8sClusterIpServiceContent.asset');
7-
module.exports.k8sClientPodContent = require('./k8sClientPodContent.asset');
8-
module.exports.k8sClientNodeContent = require('./k8sClientNodeContent.asset');
5+
module.exports.k8sIngressServiceContent = require('./k8sIngressContent.asset');
6+
module.exports.k8sClusterIpServiceContent = require('./k8sClusterIpContent.asset');
7+
module.exports.k8sClientPodContent = require('./k8sLoadBalancerContent.asset');
8+
module.exports.k8sClientNodeContent = require('./k8sNodePortContent.asset');
99
module.exports.k8sReadmeContent = require('./k8sReadmeContent.asset');
1010
module.exports.snapshotTestContent = require('./snapshotTestContent.asset');
1111
module.exports.integrationTestContent = require('./integrationTestContent.asset');
@@ -59,5 +59,13 @@ module.exports.brokerWorkerQueueContent = require('./brokerWorkerQueueContent.as
5959
module.exports.subscriberContent = require('./subscriberContent.asset');
6060
module.exports.subscriberIndexContent = require('./subscriberIndexContent.asset');
6161
module.exports.krakendConfigContent = require('./krakendConfigContent.asset');
62+
module.exports.k8sClusterDeploymentContent = require('./k8sClusterDeploymentContent.asset');
63+
module.exports.k8sClusterIpContent = require('./k8sClusterIpContent.asset');
64+
module.exports.k8sComboContent = require('./k8sComboContent.asset');
65+
module.exports.k8sConfigMapContent = require('./k8sConfigMapContent.asset');
66+
module.exports.k8sIngressContent = require('./k8sIngressContent.asset');
67+
module.exports.k8sLoadBalancerContent = require('./k8sLoadBalancerContent.asset');
68+
module.exports.k8sNodePortContent = require('./k8sNodePortContent.asset');
69+
module.exports.k8sSecretContent = require('./k8sSecretContent.asset');
6270

6371

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
1-
module.exports = () => `
2-
#TODO: to add Deployment logic here
3-
`;
1+
module.exports = ({ service, image, ports }) => `
2+
apiVersion: apps/v1
3+
kind: Deployment
4+
metadata:
5+
name: ${service}
6+
spec:
7+
selector:
8+
matchLabels:
9+
app: ${service}
10+
template:
11+
metadata:
12+
labels:
13+
app: ${service}
14+
spec:
15+
containers:
16+
- name: ${service}
17+
image: ${image}
18+
resources:
19+
limits:
20+
memory: "128Mi"
21+
cpu: "500m"
22+
ports:
23+
${ports.map(port => ` - containerPort: ${port}`).join('\n')}
24+
`;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module.exports = ({ service, ports }) => `
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: ${service}
6+
spec:
7+
selector:
8+
app: ${service}
9+
ports:
10+
${ports.map(({ name, port, targetPort }) => ` - name: ${name}
11+
port: ${port}
12+
targetPort: ${targetPort}`).join('\n')}
13+
`;
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
// module.exports = ({ project_base, app, services = [] }) => {
2+
// if (!Array.isArray(services)) {
3+
// throw new Error('Services must be an array');
4+
// }
5+
6+
// // Function to generate Deployment for each service
7+
// const generateDeployment = ({ service, image, port }) => `
8+
// # Deployment for ${service}
9+
// apiVersion: apps/v1
10+
// kind: Deployment
11+
// metadata:
12+
// name: ${service}
13+
// spec:
14+
// selector:
15+
// matchLabels:
16+
// app: ${service}
17+
// template:
18+
// metadata:
19+
// labels:
20+
// app: ${service}
21+
// spec:
22+
// containers:
23+
// - name: ${service}
24+
// image: ${image}
25+
// resources:
26+
// limits:
27+
// memory: "128Mi"
28+
// cpu: "500m"
29+
// ports:
30+
// - containerPort: ${port}
31+
// ---
32+
// `;
33+
34+
// // Function to generate different types of Services for each service
35+
// const generateService = ({ service, port, targetPort, type = "ClusterIP", nodePort }) => `
36+
// # Service for ${service} (${type})
37+
// apiVersion: v1
38+
// kind: Service
39+
// metadata:
40+
// name: ${service}
41+
// spec:
42+
// type: ${type}
43+
// selector:
44+
// app: ${service}
45+
// ports:
46+
// - port: ${port}
47+
// targetPort: ${targetPort || port}
48+
// ${type === "NodePort" && nodePort ? `nodePort: ${nodePort}` : ""}
49+
// ---
50+
// `;
51+
52+
// // Function to generate Ingress rules based on services
53+
// const generateIngress = ({ app, project_base, services }) => {
54+
// const content = services.map(({ service, port }) => `
55+
// - pathType: Prefix
56+
// path: "/${service}/*"
57+
// backend:
58+
// service:
59+
// name: ${service}
60+
// port:
61+
// number: ${port}
62+
// `).join('');
63+
64+
// return `
65+
// # Ingress for ${app}
66+
// apiVersion: networking.k8s.io/v1
67+
// kind: Ingress
68+
// metadata:
69+
// name: ${project_base}
70+
// labels:
71+
// name: ${project_base}
72+
// spec:
73+
// rules:
74+
// - host: ${app}.com
75+
// http:
76+
// paths: ${content}
77+
// ---
78+
// `;
79+
// };
80+
81+
// // Generate YAML output for each service
82+
// const servicesYAML = services.map(serviceConfig => {
83+
// return (
84+
// generateDeployment(serviceConfig) +
85+
// generateService({ ...serviceConfig, type: "ClusterIP" }) +
86+
// generateService({ ...serviceConfig, type: "LoadBalancer" }) +
87+
// generateService({ ...serviceConfig, type: "NodePort", nodePort: serviceConfig.nodePort })
88+
// );
89+
// }).join('\n');
90+
91+
// // Generate final YAML with all deployments, services, and ingress
92+
// return `
93+
// # Kubernetes Configuration for ${app}
94+
// ${servicesYAML}
95+
// ${generateIngress({ app, project_base, services })}
96+
// # Add more configurations below if needed
97+
// `;
98+
// };
99+
module.exports = ({ project_base, app, services = [] }) => {
100+
if (!Array.isArray(services)) {
101+
throw new Error('Services must be an array');
102+
}
103+
104+
// Function to generate Deployment for each service
105+
const generateDeployment = ({ service, image, port }) => `
106+
# Deployment for ${service}
107+
apiVersion: apps/v1
108+
kind: Deployment
109+
metadata:
110+
name: ${service}
111+
spec:
112+
selector:
113+
matchLabels:
114+
app: ${service}
115+
template:
116+
metadata:
117+
labels:
118+
app: ${service}
119+
spec:
120+
containers:
121+
- name: ${service}
122+
image: ${image}
123+
resources:
124+
limits:
125+
memory: "128Mi"
126+
cpu: "500m"
127+
ports:
128+
- containerPort: ${port}
129+
---
130+
`;
131+
132+
// Function to generate different types of Services for each service
133+
const generateService = ({ service, port, targetPort, type = "ClusterIP", nodePort }) => `
134+
# Service for ${service} (${type})
135+
apiVersion: v1
136+
kind: Service
137+
metadata:
138+
name: ${service}
139+
spec:
140+
type: ${type}
141+
selector:
142+
app: ${service}
143+
ports:
144+
- port: ${port}
145+
targetPort: ${targetPort || port}
146+
${type === "NodePort" && nodePort ? `nodePort: ${nodePort}` : ""}
147+
---
148+
`;
149+
150+
// Function to generate Ingress rules based on services
151+
const generateIngress = ({ app, project_base, services }) => {
152+
const content = services.map(({ service, port }) => `
153+
- pathType: Prefix
154+
path: "/${service}/*"
155+
backend:
156+
service:
157+
name: ${service}
158+
port:
159+
number: ${port}
160+
`).join('');
161+
162+
return `
163+
# Ingress for ${app}
164+
apiVersion: networking.k8s.io/v1
165+
kind: Ingress
166+
metadata:
167+
name: ${project_base}
168+
labels:
169+
name: ${project_base}
170+
spec:
171+
rules:
172+
- host: ${app}.com
173+
http:
174+
paths:
175+
${content}
176+
---
177+
`;
178+
};
179+
180+
// Generate YAML output for each service
181+
const servicesYAML = services.map(serviceConfig => {
182+
return (
183+
generateDeployment(serviceConfig) +
184+
generateService({ ...serviceConfig, type: "ClusterIP" }) +
185+
generateService({ ...serviceConfig, type: "LoadBalancer" }) +
186+
generateService({ ...serviceConfig, type: "NodePort", nodePort: serviceConfig.nodePort })
187+
);
188+
}).join('\n');
189+
190+
// Generate final YAML with all deployments, services, and ingress
191+
return `
192+
# Kubernetes Configuration for ${app}
193+
${servicesYAML}
194+
${generateIngress({ app, project_base, services })}
195+
# Add more configurations below if needed
196+
`;
197+
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module.exports = ({ service, port, project_base, env, namespace, app }) => `
2+
apiVersion: v1
3+
kind: ConfigMap
4+
metadata:
5+
name: ${service}
6+
data:
7+
PORT: '${port}'
8+
DATABASE_URL: mongodb://mongodb:27017/${project_base}_${service}_${env}_db
9+
EXCHANGE: '${project_base}/k8s/${namespace}/${app}'
10+
AMQP_HOST: amqp://rabbitmq:5672
11+
`;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module.exports = ({ app, project_base, services = [] }) => {
2+
if (!Array.isArray(services)) {
3+
throw new Error('Services must be an array');
4+
}
5+
6+
const paths = services
7+
.map(({ name, port }) => ` - pathType: Prefix
8+
path: "/"
9+
backend:
10+
service:
11+
name: ${name}
12+
port:
13+
number: ${port}`)
14+
.join('\n');
15+
16+
return `
17+
# ${app}
18+
apiVersion: networking.k8s.io/v1
19+
kind: Ingress
20+
metadata:
21+
name: ${project_base}
22+
labels:
23+
name: ${project_base}
24+
spec:
25+
rules:
26+
- host: ${app}.com
27+
http:
28+
paths:
29+
${paths}
30+
`;
31+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = ({ service, ports }) => `
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: ${service}
6+
spec:
7+
type: LoadBalancer
8+
selector:
9+
app: ${service}
10+
ports:
11+
${ports.map(({ name, port, targetPort, nodePort }) => ` - name: ${name}
12+
port: ${port}
13+
targetPort: ${targetPort || port}
14+
${nodePort ? `nodePort: ${nodePort}` : ''}`).join('\n')}
15+
`;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = ({ service, ports }) => `
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: ${service}
6+
spec:
7+
type: NodePort
8+
selector:
9+
app: ${service}
10+
ports:
11+
${ports.map(({ name, port, targetPort, nodePort }) => ` - name: ${name}
12+
port: ${port}
13+
targetPort: ${targetPort || port}
14+
${nodePort ? `nodePort: ${nodePort}` : ''}`).join('\n')}
15+
`;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = ({ service }) => `
2+
apiVersion: v1
3+
kind: Secret
4+
metadata:
5+
name: ${service}
6+
type: Opaque
7+
data:
8+
password: somepassword
9+
`;

0 commit comments

Comments
 (0)