feat: add grpc ports as well
Some checks failed
continuous-integration/drone/push Build is failing

Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
2024-05-29 21:21:34 +02:00
parent c08dcb049d
commit 36aea1c05c
6 changed files with 249 additions and 102 deletions

View File

@@ -17,7 +17,7 @@ uuid = { version = "1.7.0", features = ["v4"] }
serde_yaml = "0.9.34"
tokio-stream = { version = "0.1.15", features = ["full"] }
walkdir = "2.5.0"
minijinja = "2.0.1"
minijinja = { version = "2.0.1", features = ["custom_syntax"] }
futures = "0.3.30"
flux-releaser.workspace = true

View File

@@ -1,5 +1,7 @@
use std::path::Path;
use minijinja::{context, syntax::SyntaxConfig};
use crate::Component;
use super::cuddle_vars::{load_cuddle_file, CuddleVariable, CuddleVariables};
@@ -7,6 +9,8 @@ use super::cuddle_vars::{load_cuddle_file, CuddleVariable, CuddleVariables};
pub enum IngressType {
External,
Internal,
ExternalGrpc,
InternalGrpc,
}
pub struct Ingress {
@@ -19,6 +23,94 @@ impl Ingress {
Ok(Self { variables })
}
fn render_ingress_types(
&self,
ingress_types: Vec<IngressType>,
) -> anyhow::Result<(String, String)> {
let mut templates = Vec::new();
let internal_template = r#"
{%- set service_name = vars.cuddle_vars.service %}
{%- set host_name = vars.cuddle_vars.service | replace("_", "-") | replace(".", "-") %}
<%- macro host() -%>
<% if connection_type is defined %><<connection_type>>.<% endif %>{{ host_name }}.{{ environment }}.<< base_host >>
<%- endmacro %>
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/issuer: << issuer >>
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.tls: "true"
labels:
app: {{ service_name }}
cluster: {{ vars.cluster_vars.name }}
name: {{ service_name }}-<< name >>
namespace: {{ vars.cluster_vars.namespace }}
spec:
rules:
- host: << host() >>
http:
paths:
- backend:
service:
name: {{ service_name }}
port:
name: << name >>
path: /
pathType: Prefix
tls:
- hosts:
- << host() >>
secretName: tls-{{ service_name }}-<< issuer >>-<< name >>-ingress-dns
"#;
let get_template = |name, base_host, connection_type| {
let mut env = minijinja::Environment::new();
env.set_syntax(
SyntaxConfig::builder()
.block_delimiters("<%", "%>")
.variable_delimiters("<<", ">>")
.comment_delimiters("<#", "#>")
.build()
.expect("to be able to build minijinja syntax"),
);
env.add_global("name", name);
env.add_global("base_host", base_host);
if let Some(connection_type) = connection_type {
env.add_global("connection_type", connection_type);
}
env.add_global("issuer", "kjuulh-app");
env.render_named_str("ingress.yaml", internal_template, context! {})
};
for ingress_type in ingress_types {
match ingress_type {
IngressType::External => {
templates.push(get_template("external-http", "kjuulh.app", None)?)
}
IngressType::Internal => {
templates.push(get_template("internal-http", "internal.kjuulh.app", None)?)
}
IngressType::ExternalGrpc => {
templates.push(get_template("external-grpc", "kjuulh.app", Some("grpc"))?)
}
IngressType::InternalGrpc => templates.push(get_template(
"internal-grpc",
"internal.kjuulh.app",
Some("grpc"),
)?),
}
}
Ok(("ingress.yaml".into(), templates.join("\n")))
}
}
impl Component for Ingress {
@@ -49,6 +141,10 @@ impl Component for Ingress {
types.push(IngressType::External)
} else if o.0.contains_key("internal") {
types.push(IngressType::Internal)
} else if o.0.contains_key("external_grpc") {
types.push(IngressType::ExternalGrpc)
} else if o.0.contains_key("internal_grpc") {
types.push(IngressType::InternalGrpc)
} else {
continue;
}
@@ -60,83 +156,7 @@ impl Component for Ingress {
types
})
{
let mut templates = Vec::new();
for ingress_type in ingress_types {
match ingress_type {
IngressType::External => templates.push(
r#"
{%- set service_name = vars.cuddle_vars.service %}
{%- set host_name = vars.cuddle_vars.service | replace("_", "-") | replace(".", "-") %}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/issuer: kjuulh-app
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.tls: "true"
labels:
app: {{ service_name }}
cluster: {{ vars.cluster_vars.namespace }}
name: {{ service_name }}-external-http
namespace: {{ vars.cluster_vars.namespace }}
spec:
rules:
- host: {{ host_name }}.{{ environment }}.kjuulh.app
http:
paths:
- backend:
service:
name: {{ service_name }}
port:
name: external-http
path: /
pathType: Prefix
tls:
- hosts:
- {{ host_name }}.{{ environment }}.kjuulh.app
secretName: tls-{{ service_name }}-kjuulh-app-external-ingress-dns
"#,
),
IngressType::Internal => templates.push(
r#"
{%- set service_name = vars.cuddle_vars.service %}
{%- set host_name = vars.cuddle_vars.service | replace("_", "-") | replace(".", "-") %}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/issuer: kjuulh-app
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.tls: "true"
labels:
app: {{ service_name }}
cluster: {{ vars.cluster_vars.namespace }}
name: {{ service_name }}-internal-http
namespace: {{ vars.cluster_vars.namespace }}
spec:
rules:
- host: {{ host_name }}.{{ environment }}.internal.kjuulh.app
http:
paths:
- backend:
service:
name: {{ service_name }}
port:
name: internal-http
path: /
pathType: Prefix
tls:
- hosts:
- {{ host_name }}.{{ environment }}.internal.kjuulh.app
secretName: tls-{{ service_name }}-kjuulh-app-internal-ingress-dns
"#,
),
}
}
return Some(Ok(("ingress.yaml".into(), templates.join("\n"))));
return Some(self.render_ingress_types(ingress_types));
}
None

View File

@@ -3,6 +3,8 @@ vars:
ingress:
- external: "true"
- internal: "true"
- external_grpc: "true"
- internal_grpc: "true"
cuddle/clusters:
dev:

View File

@@ -1,4 +1,5 @@
---
apiVersion: networking.k8s.io/v1
kind: Ingress
@@ -27,7 +28,8 @@ spec:
tls:
- hosts:
- service.dev.kjuulh.app
secretName: tls-service-kjuulh-app-external-ingress-dns
secretName: tls-service-kjuulh-app-external-http-ingress-dns
---
apiVersion: networking.k8s.io/v1
kind: Ingress
@@ -56,4 +58,64 @@ spec:
tls:
- hosts:
- service.dev.internal.kjuulh.app
secretName: tls-service-kjuulh-app-internal-ingress-dns
secretName: tls-service-kjuulh-app-internal-http-ingress-dns
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/issuer: kjuulh-app
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.tls: "true"
labels:
app: service
cluster: dev
name: service-external-grpc
namespace: dev
spec:
rules:
- host: grpc.service.dev.kjuulh.app
http:
paths:
- backend:
service:
name: service
port:
name: external-grpc
path: /
pathType: Prefix
tls:
- hosts:
- grpc.service.dev.kjuulh.app
secretName: tls-service-kjuulh-app-external-grpc-ingress-dns
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/issuer: kjuulh-app
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.tls: "true"
labels:
app: service
cluster: dev
name: service-internal-grpc
namespace: dev
spec:
rules:
- host: grpc.service.dev.internal.kjuulh.app
http:
paths:
- backend:
service:
name: service
port:
name: internal-grpc
path: /
pathType: Prefix
tls:
- hosts:
- grpc.service.dev.internal.kjuulh.app
secretName: tls-service-kjuulh-app-internal-grpc-ingress-dns

View File

@@ -1,4 +1,5 @@
---
apiVersion: networking.k8s.io/v1
kind: Ingress
@@ -27,7 +28,8 @@ spec:
tls:
- hosts:
- service.prod.kjuulh.app
secretName: tls-service-kjuulh-app-external-ingress-dns
secretName: tls-service-kjuulh-app-external-http-ingress-dns
---
apiVersion: networking.k8s.io/v1
kind: Ingress
@@ -56,4 +58,64 @@ spec:
tls:
- hosts:
- service.prod.internal.kjuulh.app
secretName: tls-service-kjuulh-app-internal-ingress-dns
secretName: tls-service-kjuulh-app-internal-http-ingress-dns
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/issuer: kjuulh-app
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.tls: "true"
labels:
app: service
cluster: prod
name: service-external-grpc
namespace: prod
spec:
rules:
- host: grpc.service.prod.kjuulh.app
http:
paths:
- backend:
service:
name: service
port:
name: external-grpc
path: /
pathType: Prefix
tls:
- hosts:
- grpc.service.prod.kjuulh.app
secretName: tls-service-kjuulh-app-external-grpc-ingress-dns
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/issuer: kjuulh-app
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.tls: "true"
labels:
app: service
cluster: prod
name: service-internal-grpc
namespace: prod
spec:
rules:
- host: grpc.service.prod.internal.kjuulh.app
http:
paths:
- backend:
service:
name: service
port:
name: internal-grpc
path: /
pathType: Prefix
tls:
- hosts:
- grpc.service.prod.internal.kjuulh.app
secretName: tls-service-kjuulh-app-internal-grpc-ingress-dns