Skip to content

Commit 2e67c20

Browse files
committed
feat(demeter-fabric): add demeter fabric daemon helm chart
Signed-off-by: Ales Verbic <verbotenj@blinklabs.io>
1 parent 68eeb71 commit 2e67c20

9 files changed

Lines changed: 345 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
name: publish-demeter-fabric-helm-chart
2+
3+
on:
4+
push:
5+
branches: ["main"]
6+
paths:
7+
[
8+
"charts/demeter-fabric/**",
9+
".github/workflows/publish-demeter-fabric-helm-chart.yml",
10+
]
11+
12+
jobs:
13+
build-and-push-demeter-fabric-helm-chart:
14+
runs-on: ubuntu-latest
15+
permissions:
16+
contents: read
17+
packages: write
18+
steps:
19+
- uses: actions/checkout@v6.0.2
20+
- name: Install Helm
21+
uses: azure/setup-helm@v4
22+
- name: Package and upload chart
23+
shell: bash
24+
env:
25+
REGISTRY: "ghcr.io"
26+
REPOSITORY: "${{ github.repository }}"
27+
TOKEN: "${{ secrets.GITHUB_TOKEN }}"
28+
USER: "${{ github.repository_owner }}"
29+
run: |
30+
rm -rf dist
31+
mkdir dist
32+
helm package charts/demeter-fabric/ -d dist/
33+
echo "${TOKEN}" | helm registry login "${REGISTRY}" -u "${USER}" --password-stdin
34+
for file in dist/*; do
35+
helm push "$file" "oci://${REGISTRY}/${REPOSITORY,,}/charts"
36+
done

charts/demeter-fabric/Chart.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apiVersion: v2
2+
name: demeter-fabric
3+
description: Demeter Fabric Daemon - Kafka-based monitoring daemon for Demeter platform
4+
version: 0.1.0
5+
appVersion: "0.1.0"
6+
7+
sources:
8+
- https://github.com/demeter-run/fabric
9+
10+
maintainers:
11+
- name: aurora
12+
email: aurora@blinklabs.io
13+
- name: verbotenj
14+
email: verbotenj@blinklabs.io
15+
- name: wolf31o2
16+
email: wolf31o2@blinklabs.io
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
{{/*
2+
Expand the name of the chart.
3+
*/}}
4+
{{- define "demeter-fabric.name" -}}
5+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
6+
{{- end -}}
7+
8+
{{/*
9+
Create a default fully qualified app name.
10+
*/}}
11+
{{- define "demeter-fabric.fullname" -}}
12+
{{- if .Values.fullnameOverride -}}
13+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" | lower -}}
14+
{{- else -}}
15+
{{- $name := default .Chart.Name .Values.nameOverride -}}
16+
{{- if contains $name .Release.Name -}}
17+
{{- .Release.Name | trunc 63 | trimSuffix "-" | lower -}}
18+
{{- else -}}
19+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" | lower -}}
20+
{{- end -}}
21+
{{- end -}}
22+
{{- end -}}
23+
24+
{{/*
25+
Create chart name and version as used by the chart label.
26+
*/}}
27+
{{- define "demeter-fabric.chart" -}}
28+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
29+
{{- end -}}
30+
31+
{{/*
32+
Common labels
33+
*/}}
34+
{{- define "demeter-fabric.labels" -}}
35+
helm.sh/chart: {{ include "demeter-fabric.chart" . }}
36+
app.kubernetes.io/instance: {{ .Release.Name }}
37+
app.kubernetes.io/name: {{ include "demeter-fabric.name" . }}
38+
{{ include "demeter-fabric.selectorLabels" . }}
39+
{{- if .Chart.AppVersion }}
40+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
41+
{{- end }}
42+
app.kubernetes.io/managed-by: {{ .Release.Service }}
43+
{{- end }}
44+
45+
{{/*
46+
Selector labels – must match the live StatefulSet's immutable selector exactly.
47+
*/}}
48+
{{- define "demeter-fabric.selectorLabels" -}}
49+
role: fabric-daemon
50+
{{- end }}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: {{ .Release.Name }}-config
5+
namespace: {{ .Release.Namespace }}
6+
labels: {{- include "demeter-fabric.labels" . | nindent 4 }}
7+
data:
8+
daemon.toml: |
9+
db_path="/var/cache/{{ required "config.kafka.consumerCacheName is required" .Values.config.kafka.consumerCacheName }}.db"
10+
topic_events = "{{ required "config.kafka.topicEvents is required" .Values.config.kafka.topicEvents }}"
11+
topic_usage = "{{ required "config.kafka.topicUsage is required" .Values.config.kafka.topicUsage }}"
12+
cluster_id = "{{ required "config.clusterId is required" .Values.config.clusterId }}"
13+
delay_sec = {{ required "config.prometheus.delaySec is required" .Values.config.prometheus.delaySec }}
14+
mode = "{{ required "config.mode is required" .Values.config.mode }}"
15+
16+
[metrics]
17+
addr = "0.0.0.0:{{ .Values.ports.metrics }}"
18+
19+
[prometheus]
20+
url = "{{ .Values.config.prometheus.url }}"
21+
query_step = "{{ .Values.config.prometheus.queryStep }}"
22+
23+
[kafka_producer]
24+
"bootstrap.servers" = "{{ required "config.kafka.brokerUrls is required" .Values.config.kafka.brokerUrls }}"
25+
"security.protocol" = "SASL_SSL"
26+
"message.timeout.ms" = "30000"
27+
"sasl.mechanisms" = "SCRAM-SHA-256"
28+
"sasl.username" = "{{ required "config.kafka.username is required" .Values.config.kafka.username }}"
29+
"sasl.password" = "{{ required "config.kafka.password is required" .Values.config.kafka.password }}"
30+
31+
[kafka_monitor]
32+
"bootstrap.servers" = "{{ required "config.kafka.brokerUrls is required" .Values.config.kafka.brokerUrls }}"
33+
"group.id"= "{{ required "config.kafka.consumerMonitorName is required" .Values.config.kafka.consumerMonitorName }}"
34+
"auto.offset.reset" = "earliest"
35+
"security.protocol" = "SASL_SSL"
36+
"sasl.mechanisms" = "SCRAM-SHA-256"
37+
"sasl.username" = "{{ required "config.kafka.username is required" .Values.config.kafka.username }}"
38+
"sasl.password" = "{{ required "config.kafka.password is required" .Values.config.kafka.password }}"
39+
40+
[kafka_cache]
41+
"bootstrap.servers" = "{{ required "config.kafka.brokerUrls is required" .Values.config.kafka.brokerUrls }}"
42+
"group.id"= "{{ required "config.kafka.consumerCacheName is required" .Values.config.kafka.consumerCacheName }}"
43+
"auto.offset.reset" = "earliest"
44+
"security.protocol" = "SASL_SSL"
45+
"sasl.mechanisms" = "SCRAM-SHA-256"
46+
"sasl.username" = "{{ required "config.kafka.username is required" .Values.config.kafka.username }}"
47+
"sasl.password" = "{{ required "config.kafka.password is required" .Values.config.kafka.password }}"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: {{ .Values.service.name | default .Release.Name }}
5+
namespace: {{ .Release.Namespace }}
6+
labels: {{- include "demeter-fabric.labels" . | nindent 4 }}
7+
spec:
8+
clusterIP: None
9+
selector: {{- include "demeter-fabric.selectorLabels" . | nindent 4 }}
10+
ports:
11+
- name: metrics
12+
port: {{ .Values.ports.metrics }}
13+
targetPort: {{ .Values.ports.metrics }}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{{- if .Values.podMonitor.enabled }}
2+
apiVersion: monitoring.coreos.com/v1
3+
kind: PodMonitor
4+
metadata:
5+
name: {{ .Release.Name }}
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
{{- include "demeter-fabric.labels" . | nindent 4 }}
9+
{{- with .Values.podMonitor.labels }}
10+
{{- toYaml . | nindent 4 }}
11+
{{- end }}
12+
spec:
13+
selector:
14+
matchLabels:
15+
{{- include "demeter-fabric.selectorLabels" . | nindent 6 }}
16+
podMetricsEndpoints:
17+
- port: metrics
18+
path: /metrics
19+
{{- end }}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{{- if .Values.rbac.enabled }}
2+
apiVersion: v1
3+
kind: ServiceAccount
4+
metadata:
5+
name: {{ include "demeter-fabric.fullname" . }}
6+
namespace: {{ .Release.Namespace }}
7+
labels: {{- include "demeter-fabric.labels" . | nindent 4 }}
8+
---
9+
apiVersion: rbac.authorization.k8s.io/v1
10+
kind: ClusterRole
11+
metadata:
12+
name: {{ include "demeter-fabric.fullname" . }}
13+
labels: {{- include "demeter-fabric.labels" . | nindent 4 }}
14+
rules:
15+
- apiGroups: ["", "demeter.run", "networking.k8s.io", "gateway.networking.k8s.io", "configuration.konghq.com", "coordination.k8s.io"]
16+
resources: ["*"]
17+
verbs: ["*"]
18+
---
19+
apiVersion: rbac.authorization.k8s.io/v1
20+
kind: ClusterRoleBinding
21+
metadata:
22+
name: {{ include "demeter-fabric.fullname" . }}
23+
labels: {{- include "demeter-fabric.labels" . | nindent 4 }}
24+
roleRef:
25+
apiGroup: rbac.authorization.k8s.io
26+
kind: ClusterRole
27+
name: {{ include "demeter-fabric.fullname" . }}
28+
subjects:
29+
- kind: ServiceAccount
30+
name: {{ include "demeter-fabric.fullname" . }}
31+
namespace: {{ .Release.Namespace }}
32+
{{- end }}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
apiVersion: apps/v1
2+
kind: StatefulSet
3+
metadata:
4+
name: {{ .Release.Name }}
5+
namespace: {{ .Release.Namespace }}
6+
labels: {{- include "demeter-fabric.labels" . | nindent 4 }}
7+
spec:
8+
replicas: {{ .Values.replicaCount }}
9+
revisionHistoryLimit: 0
10+
serviceName: {{ .Values.service.name | default .Release.Name }}
11+
{{- with .Values.updateStrategy }}
12+
updateStrategy:
13+
{{- toYaml . | nindent 4 }}
14+
{{- end }}
15+
persistentVolumeClaimRetentionPolicy:
16+
whenDeleted: Retain
17+
whenScaled: Retain
18+
selector:
19+
matchLabels: {{- include "demeter-fabric.selectorLabels" . | nindent 6 }}
20+
template:
21+
metadata:
22+
annotations:
23+
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
24+
{{- with .Values.podAnnotations }}
25+
{{- toYaml . | nindent 8 }}
26+
{{- end }}
27+
labels: {{- include "demeter-fabric.selectorLabels" . | nindent 8 -}}
28+
{{- if .Values.podLabels }}
29+
{{- toYaml .Values.podLabels | nindent 8 -}}
30+
{{- end }}
31+
spec:
32+
serviceAccountName: {{ if .Values.rbac.enabled }}{{ include "demeter-fabric.fullname" . }}{{ else }}default{{ end }}
33+
automountServiceAccountToken: true
34+
terminationGracePeriodSeconds: 30
35+
{{- if .Values.tolerations }}
36+
tolerations: {{ toYaml .Values.tolerations | nindent 8 }}
37+
{{- end }}
38+
{{- if .Values.affinity }}
39+
affinity: {{ toYaml .Values.affinity | nindent 8 }}
40+
{{- end }}
41+
volumes:
42+
- name: config
43+
configMap:
44+
name: {{ .Release.Name }}-config
45+
containers:
46+
- name: daemon
47+
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
48+
imagePullPolicy: {{ .Values.image.pullPolicy }}
49+
env:
50+
- name: DAEMON_CONFIG
51+
value: /fabric/daemon.toml
52+
- name: RUST_LOG
53+
value: {{ .Values.config.rustLog | quote }}
54+
resources:
55+
{{- toYaml .Values.resources | nindent 12 }}
56+
volumeMounts:
57+
- name: cache
58+
mountPath: /var/cache
59+
- name: config
60+
mountPath: /fabric
61+
ports:
62+
- name: metrics
63+
containerPort: {{ .Values.ports.metrics }}
64+
protocol: TCP
65+
volumeClaimTemplates:
66+
- metadata:
67+
name: cache
68+
spec:
69+
accessModes: [ "ReadWriteOnce" ]
70+
resources:
71+
requests:
72+
storage: {{ .Values.storage.size }}
73+
{{- if not (kindIs "invalid" .Values.storage.storageClassName) }}
74+
storageClassName: {{ .Values.storage.storageClassName }}
75+
{{- end }}

charts/demeter-fabric/values.yaml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
replicaCount: 1
2+
3+
updateStrategy:
4+
type: RollingUpdate
5+
6+
image:
7+
repository: ghcr.io/demeter-run/fabric-daemon
8+
tag: "6077ca0335291f668a4cbe122759c310cb46a4f1"
9+
pullPolicy: IfNotPresent
10+
11+
podAnnotations: {}
12+
podLabels: {}
13+
14+
resources: {}
15+
16+
storage:
17+
size: 10Gi
18+
storageClassName: ""
19+
20+
tolerations: []
21+
22+
affinity: {}
23+
24+
ports:
25+
metrics: 9946
26+
27+
service:
28+
# Optional custom service name. If not set, release name will be used.
29+
name: ""
30+
31+
# Daemon TOML configuration
32+
config:
33+
clusterId: ""
34+
mode: "full"
35+
rustLog: "error"
36+
prometheus:
37+
url: "http://prometheus-operated.dmtr-system.svc.cluster.local:9090/api/v1"
38+
delaySec: 3600
39+
queryStep: "10m"
40+
kafka:
41+
brokerUrls: ""
42+
username: ""
43+
password: ""
44+
topicEvents: "events"
45+
topicUsage: "usage"
46+
consumerMonitorName: ""
47+
consumerCacheName: ""
48+
49+
# RBAC - grants cluster-wide permissions to the default ServiceAccount.
50+
# Names are scoped to the namespace, so only one release per namespace is supported.
51+
rbac:
52+
enabled: true
53+
54+
# PodMonitor for Prometheus Operator
55+
podMonitor:
56+
enabled: false
57+
labels: {}

0 commit comments

Comments
 (0)