@fairmint/canton-node-sdk
Version:
Canton Node SDK
252 lines (248 loc) • 10 kB
YAML
# Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
{{- $sequencerLabel := (printf "%s-sequencer" .Release.Name) }}
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
{{- include "splice-util-lib.default-labels" (set . "app" $sequencerLabel) | nindent 4 }}
splice-component: sequencer
app.kubernetes.io/component: sequencer
name: {{ .Release.Name }}-sequencer
namespace: {{ .Release.Namespace }}
spec:
replicas: 1
selector:
matchLabels:
app: {{ $sequencerLabel }}
strategy:
type: Recreate
template:
metadata:
annotations:
{{- toYaml .Values.pod.annotations | nindent 8 }}
labels:
{{- include "splice-util-lib.default-labels" (set . "app" $sequencerLabel) | nindent 8 }}
splice-component: sequencer
app.kubernetes.io/component: sequencer
{{- with $.Values.metrics.migration }}
migration_id: {{ .id | quote }}
{{- end }}
spec:
{{- include "splice-util-lib.service-account" .Values | nindent 6 }}
containers:
- name: sequencer
{{- if eq .Values.sequencer.driver.type "cometbft"}}
image: "{{ .Values.imageRepo }}/canton-cometbft-sequencer:{{ .Chart.AppVersion }}{{ ((.Values.imageDigests).canton_cometbft_sequencer) }}"
{{- else}}
image: "{{ .Values.imageRepo }}/canton-sequencer:{{ .Chart.AppVersion }}{{ ((.Values.imageDigests).canton_sequencer) }}"
{{- end}}
env:
- name: JAVA_TOOL_OPTIONS
value: {{ .Values.defaultJvmOptions }} {{ .Values.additionalJvmOptions }}
- name: CANTON_DOMAIN_POSTGRES_SERVER
value: {{ .Values.sequencer.persistence.host }}
- name: CANTON_DOMAIN_POSTGRES_PORT
value: {{ .Values.sequencer.persistence.port | quote }}
- name: CANTON_DOMAIN_POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Values.sequencer.persistence.secretName }}
key: postgresPassword
{{- if .Values.sequencer.persistence.databaseName }}
- name: CANTON_SEQUENCER_POSTGRES_DB
value: {{ .Values.sequencer.persistence.databaseName }}
{{- end }}
{{- if eq .Values.sequencer.driver.type "postgres"}}
- name: ADDITIONAL_CONFIG_SEQUENCER_DRIVER_REFERENCE
value: |
canton.sequencers.sequencer.sequencer {
config {
storage = ${_storage}
storage.config.properties.serverName = ${?SEQUENCER_DRIVER_DATABASE_ADDRESS}
storage.config.properties.password = ${?SEQUENCER_DRIVER_DATABASE_PASSWORD}
storage.config.properties.currentSchema = "sequencer_driver"
storage.config.properties.databaseName = ${?CANTON_SEQUENCER_POSTGRES_DB}
}
type = "reference"
}
- name: SEQUENCER_DRIVER_DATABASE_ADDRESS
value: {{ .Values.sequencer.driver.address }}
- name: SEQUENCER_DRIVER_DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Values.sequencer.persistence.secretName }}
key: postgresPassword
{{- else if eq .Values.sequencer.driver.type "cometbft"}}
- name: ADDITIONAL_CONFIG_SEQUENCER_DRIVER_COMETBFT
value: |
canton.sequencers.sequencer.sequencer {
config {
cometbft-node-host = {{ .Values.sequencer.driver.host }}
cometbft-node-port = {{ .Values.sequencer.driver.port }}
health-check-attempts = 100000
}
type = "CometBFT"
}
{{- else if eq .Values.sequencer.driver.type "cantonbft"}}
# TODO(#930) - use a different database for the bft storage
- name: ADDITIONAL_CONFIG_SEQUENCER_DRIVER_BFT
value: |
canton.sequencers.sequencer.sequencer {
config {
storage = ${_storage}
storage.config.properties.serverName = ${?CANTON_DOMAIN_POSTGRES_SERVER}
storage.config.properties.password = ${?CANTON_DOMAIN_POSTGRES_PASSWORD}
storage.config.properties.currentSchema = "sequencer"
storage.config.properties.databaseName = ${?CANTON_SEQUENCER_POSTGRES_DB}
initial-network {
endpoint-authentication {
enabled = true
}
server-endpoint {
address="0.0.0.0"
port=5010
external-address="{{ .Values.sequencer.driver.externalAddress }}"
external-port={{ .Values.sequencer.driver.externalPort }}
}
peer-endpoints = []
}
}
type = "BFT"
}
{{- end}}
{{- with .Values.sequencer.tokenExpirationTime }}
- name: SEQUENCER_TOKEN_EXPIRATION_TIME
value: "{{ . }}"
{{- end }}
{{- include "splice-util-lib.additional-env-vars" .Values.additionalEnvVars | indent 12}}
{{- include "splice-util-lib.additional-env-vars" .Values.sequencer.additionalEnvVars | indent 12}}
{{- include "splice-util-lib.log-level" .Values | indent 12}}
{{- with .Values.imagePullPolicy }}
imagePullPolicy: {{ . }}
{{- end }}
ports:
- containerPort: 5008
name: cs-pub-api
protocol: TCP
- containerPort: 5009
name: cs-adm-api
protocol: TCP
{{- if .Values.sequencer.resources }}
resources: {{- toYaml .Values.sequencer.resources | nindent 12 }}
{{- else }}
{{- with .Values.resources }}
resources: {{- toYaml . | nindent 12 }}
{{- end }}
{{- end }}
{{- if .Values.enableHealthProbes }}
livenessProbe:
grpc:
port: 5061
service: liveness
initialDelaySeconds: {{ .Values.livenessProbeInitialDelaySeconds | default 600 }}
periodSeconds: 60
failureThreshold: 5
timeoutSeconds: 10
readinessProbe:
grpc:
port: 5061
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3
timeoutSeconds: 10
{{- end }}
{{- if .Values.pvc }}
volumeMounts:
- name: sequencer-volume
mountPath: /persistent-data
{{- end }}
restartPolicy: Always
initContainers:
- name: pg-init
image: postgres:14
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
key: postgresPassword
name: {{ .Values.sequencer.persistence.secretName }}
command:
- 'bash'
- '-c'
- |
until errmsg=$(psql -h {{ .Values.sequencer.persistence.host }} -p {{ .Values.sequencer.persistence.port }} --username=cnadmin --dbname=cantonnet -c 'create database {{ .Values.sequencer.persistence.databaseName }}' 2>&1); do
if [[ $errmsg == *"already exists"* ]]; then
echo "Database {{ .Values.sequencer.persistence.databaseName }} already exists. Done."
break
fi
echo "trying to create postgres database {{ .Values.sequencer.persistence.databaseName }}, last error: $errmsg";
sleep 2;
done
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- include "splice-util-lib.affinity" (set .Values "app" "sequencer") | nindent 6 }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
volumes:
{{- if .Values.pvc }}
- name: sequencer-volume
persistentVolumeClaim:
claimName: {{ .Release.Name }}-sequencer-pvc
{{- end }}
apiVersion: v1
kind: Service
metadata:
name: {{ $sequencerLabel }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "splice-util-lib.default-labels" (set . "app" $sequencerLabel) | nindent 4 }}
{{- with $.Values.metrics.migration }}
migration_id: {{ .id | quote }}
{{- end }}
spec:
selector:
app: {{ $sequencerLabel }}
ports:
- name: grpc-cs-pub-api
port: 5008
protocol: TCP
- name: grpc-cs-adm-api
port: 5009
protocol: TCP
{{- if eq .Values.sequencer.driver.type "cantonbft"}}
- name: grpc-cs-p2p-api
port: 5010
protocol: TCP
{{- end }}
- name: cs-metrics
port: 10013
protocol: TCP
{{- if .Values.enablePostgresMetrics }}
{{- include "splice-util-lib.postgres-metrics" (dict "name" (print "postgres-" (.Values.sequencer.persistence.databaseName | replace "_" "-" ) "-e") "namespace" .Release.Namespace "persistence" .Values.sequencer.persistence "nodeSelector" .Values.nodeSelector "affinity" .Values.affinity "tolerations" .Values.tolerations ) }}
{{- end}}
{{- if .Values.pvc }}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Release.Name }}-sequencer-pvc
namespace: {{ .Release.Namespace }}
labels:
{{- include "splice-util-lib.default-labels" (set . "app" $sequencerLabel) | nindent 4 }}
annotations:
helm.sh/resource-policy: keep
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .Values.pvc.size }}
storageClassName: {{ .Values.pvc.volumeStorageClass }}
{{- end }}