디렉토리 구조 및 각 서비스 추가
This commit is contained in:
25
helm/openebs/templates/ndm/cluster-exporter-service.yaml
Normal file
25
helm/openebs/templates/ndm/cluster-exporter-service.yaml
Normal file
@@ -0,0 +1,25 @@
|
||||
{{- if not .Values.mayastor.enabled -}}
|
||||
{{- if .Values.ndm.enabled }}
|
||||
{{- if and .Values.ndmExporter.enabled .Values.ndmExporter.clusterExporter.metricsPort }}
|
||||
{{- $ndmValues := index .Values "openebs-ndm" }}
|
||||
{{- if not $ndmValues.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ template "openebs.ndm-cluster-exporter.fullname" . }}-service
|
||||
labels:
|
||||
{{- include "openebs.ndm-cluster-exporter.labels" . | nindent 4 }}
|
||||
spec:
|
||||
clusterIP: None
|
||||
ports:
|
||||
- name: metrics
|
||||
port: {{ .Values.ndmExporter.clusterExporter.metricsPort }}
|
||||
targetPort: {{ .Values.ndmExporter.clusterExporter.metricsPort }}
|
||||
selector:
|
||||
{{- with .Values.ndmExporter.clusterExporter.podLabels }}
|
||||
{{ toYaml . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
53
helm/openebs/templates/ndm/cluster-exporter.yaml
Normal file
53
helm/openebs/templates/ndm/cluster-exporter.yaml
Normal file
@@ -0,0 +1,53 @@
|
||||
{{- if not .Values.mayastor.enabled -}}
|
||||
{{- if and (.Values.ndm.enabled) (.Values.ndmExporter.enabled) }}
|
||||
{{- $ndmValues := index .Values "openebs-ndm" }}
|
||||
{{- if not $ndmValues.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ template "openebs.ndm-cluster-exporter.fullname" . }}
|
||||
labels:
|
||||
{{- include "openebs.ndm-cluster-exporter.labels" . | nindent 4 }}
|
||||
spec:
|
||||
replicas: 1
|
||||
strategy:
|
||||
type: Recreate
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "openebs.ndm-cluster-exporter.matchLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "openebs.ndm-cluster-exporter.labels" . | nindent 8 }}
|
||||
{{- with .Values.ndmExporter.clusterExporter.podLabels }}
|
||||
{{ toYaml . }}
|
||||
{{- end }}
|
||||
spec:
|
||||
serviceAccountName: {{ template "openebs.serviceAccountName" . }}
|
||||
containers:
|
||||
- name: {{ template "openebs.ndm-cluster-exporter.fullname" . }}
|
||||
image: "{{ .Values.ndmExporter.image.registry }}{{ .Values.ndmExporter.image.repository }}:{{ .Values.ndmExporter.image.tag }}"
|
||||
command:
|
||||
- /usr/local/bin/exporter
|
||||
args:
|
||||
- "start"
|
||||
- "--mode=cluster"
|
||||
- "--port=$(METRICS_LISTEN_PORT)"
|
||||
- "--metrics=/metrics"
|
||||
ports:
|
||||
- containerPort: {{ .Values.ndmExporter.clusterExporter.metricsPort }}
|
||||
protocol: TCP
|
||||
name: metrics
|
||||
imagePullPolicy: {{ .Values.ndmExporter.image.pullPolicy }}
|
||||
env:
|
||||
- name: NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
{{- if .Values.ndmExporter.clusterExporter.metricsPort }}
|
||||
- name: METRICS_LISTEN_PORT
|
||||
value: :{{ .Values.ndmExporter.clusterExporter.metricsPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
50
helm/openebs/templates/ndm/cm-node-disk-manager.yaml
Normal file
50
helm/openebs/templates/ndm/cm-node-disk-manager.yaml
Normal file
@@ -0,0 +1,50 @@
|
||||
{{- if not .Values.mayastor.enabled -}}
|
||||
{{- if .Values.ndm.enabled }}
|
||||
{{- $ndmValues := index .Values "openebs-ndm" }}
|
||||
{{- if not $ndmValues.enabled }}
|
||||
# This is the node-disk-manager related config.
|
||||
# It can be used to customize the disks probes and filters
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ template "openebs.fullname" . }}-ndm-config
|
||||
labels:
|
||||
app: {{ template "openebs.name" . }}
|
||||
chart: {{ template "openebs.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Release.Service }}
|
||||
component: ndm-config
|
||||
openebs.io/component-name: ndm-config
|
||||
data:
|
||||
# udev-probe is default or primary probe which should be enabled to run ndm
|
||||
# filterconfigs contains configs of filters - in the form of include
|
||||
# and exclude comma separated strings
|
||||
node-disk-manager.config: |
|
||||
probeconfigs:
|
||||
- key: udev-probe
|
||||
name: udev probe
|
||||
state: true
|
||||
- key: seachest-probe
|
||||
name: seachest probe
|
||||
state: {{ .Values.ndm.probes.enableSeachest }}
|
||||
- key: smart-probe
|
||||
name: smart probe
|
||||
state: true
|
||||
filterconfigs:
|
||||
- key: os-disk-exclude-filter
|
||||
name: os disk exclude filter
|
||||
state: {{ .Values.ndm.filters.enableOsDiskExcludeFilter }}
|
||||
exclude: "{{ .Values.ndm.filters.osDiskExcludePaths }}"
|
||||
- key: vendor-filter
|
||||
name: vendor filter
|
||||
state: {{ .Values.ndm.filters.enableVendorFilter }}
|
||||
include: ""
|
||||
exclude: "{{ .Values.ndm.filters.excludeVendors }}"
|
||||
- key: path-filter
|
||||
name: path filter
|
||||
state: {{ .Values.ndm.filters.enablePathFilter }}
|
||||
include: "{{ .Values.ndm.filters.includePaths }}"
|
||||
exclude: "{{ .Values.ndm.filters.excludePaths }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
188
helm/openebs/templates/ndm/daemonset-ndm.yaml
Normal file
188
helm/openebs/templates/ndm/daemonset-ndm.yaml
Normal file
@@ -0,0 +1,188 @@
|
||||
{{- if not .Values.mayastor.enabled -}}
|
||||
{{- if .Values.ndm.enabled }}
|
||||
{{- $ndmValues := index .Values "openebs-ndm" }}
|
||||
{{- if not $ndmValues.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: DaemonSet
|
||||
metadata:
|
||||
name: {{ template "openebs.fullname" . }}-ndm
|
||||
labels:
|
||||
app: {{ template "openebs.name" . }}
|
||||
chart: {{ template "openebs.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Release.Service }}
|
||||
component: ndm
|
||||
openebs.io/component-name: ndm
|
||||
openebs.io/version: {{ .Values.release.version }}
|
||||
spec:
|
||||
updateStrategy:
|
||||
type: "RollingUpdate"
|
||||
selector:
|
||||
matchLabels:
|
||||
app: {{ template "openebs.name" . }}
|
||||
release: {{ .Release.Name }}
|
||||
component: ndm
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: {{ template "openebs.name" . }}
|
||||
release: {{ .Release.Name }}
|
||||
component: ndm
|
||||
openebs.io/component-name: ndm
|
||||
name: openebs-ndm
|
||||
openebs.io/version: {{ .Values.release.version }}
|
||||
spec:
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ template "openebs.serviceAccountName" . }}
|
||||
hostNetwork: true
|
||||
# host PID is used to check status of iSCSI Service when the NDM
|
||||
# API service is enabled
|
||||
{{- if .Values.featureGates.enabled }}
|
||||
{{- if .Values.featureGates.APIService.enabled }}
|
||||
hostPID: true
|
||||
{{- end}}
|
||||
{{- end}}
|
||||
containers:
|
||||
- name: {{ template "openebs.name" . }}-ndm
|
||||
image: "{{ .Values.image.repository }}{{ .Values.ndm.image }}:{{ .Values.ndm.imageTag }}"
|
||||
args:
|
||||
- -v=4
|
||||
{{- if .Values.featureGates.enabled }}
|
||||
{{- if .Values.featureGates.GPTBasedUUID.enabled }}
|
||||
- --feature-gates={{ .Values.featureGates.GPTBasedUUID.featureGateFlag }}
|
||||
{{- end}}
|
||||
{{- if .Values.featureGates.APIService.enabled }}
|
||||
- --feature-gates={{ .Values.featureGates.APIService.featureGateFlag }}
|
||||
- --api-service-address={{ .Values.featureGates.APIService.address }}
|
||||
{{- end}}
|
||||
{{- if .Values.featureGates.UseOSDisk.enabled }}
|
||||
- --feature-gates={{ .Values.featureGates.UseOSDisk.featureGateFlag }}
|
||||
{{- end}}
|
||||
{{- if .Values.featureGates.ChangeDetection.enabled }}
|
||||
- --feature-gates={{ .Values.featureGates.ChangeDetection.featureGateFlag }}
|
||||
{{- end}}
|
||||
{{- if .Values.featureGates.PartitionTableUUID.enabled }}
|
||||
- --feature-gates={{ .Values.featureGates.PartitionTableUUID.featureGateFlag }}
|
||||
{{- end}}
|
||||
{{- end}}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
{{- if .Values.ndm.resources }}
|
||||
resources:
|
||||
{{ toYaml .Values.ndm.resources | trimSuffix "\n" | indent 10 }}
|
||||
{{- end }}
|
||||
securityContext:
|
||||
privileged: true
|
||||
env:
|
||||
# namespace in which NDM is installed will be passed to NDM Daemonset
|
||||
# as environment variable
|
||||
- name: NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
# pass hostname as env variable using downward API to the NDM container
|
||||
- name: NODE_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: spec.nodeName
|
||||
{{- if .Values.ndm.sparse }}
|
||||
{{- if .Values.ndm.sparse.path }}
|
||||
# specify the directory where the sparse files need to be created.
|
||||
# if not specified, then sparse files will not be created.
|
||||
- name: SPARSE_FILE_DIR
|
||||
value: "{{ .Values.ndm.sparse.path }}"
|
||||
{{- end }}
|
||||
{{- if .Values.ndm.sparse.size }}
|
||||
# Size(bytes) of the sparse file to be created.
|
||||
- name: SPARSE_FILE_SIZE
|
||||
value: "{{ .Values.ndm.sparse.size }}"
|
||||
{{- end }}
|
||||
{{- if .Values.ndm.sparse.count }}
|
||||
# Specify the number of sparse files to be created
|
||||
- name: SPARSE_FILE_COUNT
|
||||
value: "{{ .Values.ndm.sparse.count }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
# Process name used for matching is limited to the 15 characters
|
||||
# present in the pgrep output.
|
||||
# So fullname can be used here with pgrep (cmd is < 15 chars).
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- pgrep
|
||||
- "ndm"
|
||||
initialDelaySeconds: {{ .Values.ndm.healthCheck.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.ndm.healthCheck.periodSeconds }}
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /host/node-disk-manager.config
|
||||
subPath: node-disk-manager.config
|
||||
readOnly: true
|
||||
- name: udev
|
||||
mountPath: /run/udev
|
||||
- name: procmount
|
||||
mountPath: /host/proc
|
||||
readOnly: true
|
||||
- name: devmount
|
||||
mountPath: /dev
|
||||
- name: basepath
|
||||
mountPath: /var/openebs/ndm
|
||||
{{- if .Values.ndm.sparse }}
|
||||
{{- if .Values.ndm.sparse.path }}
|
||||
- name: sparsepath
|
||||
mountPath: {{ .Values.ndm.sparse.path }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: config
|
||||
configMap:
|
||||
name: {{ template "openebs.fullname" . }}-ndm-config
|
||||
- name: udev
|
||||
hostPath:
|
||||
path: /run/udev
|
||||
type: Directory
|
||||
# mount /proc (to access mount file of process 1 of host) inside container
|
||||
# to read mount-point of disks and partitions
|
||||
- name: procmount
|
||||
hostPath:
|
||||
path: /proc
|
||||
type: Directory
|
||||
# the /dev directory is mounted so that we have access to the devices that
|
||||
# are connected at runtime of the pod.
|
||||
- name: devmount
|
||||
hostPath:
|
||||
path: /dev
|
||||
type: Directory
|
||||
- name: basepath
|
||||
hostPath:
|
||||
path: "{{ .Values.varDirectoryPath.baseDir }}/ndm"
|
||||
type: DirectoryOrCreate
|
||||
{{- if .Values.ndm.sparse }}
|
||||
{{- if .Values.ndm.sparse.path }}
|
||||
- name: sparsepath
|
||||
hostPath:
|
||||
path: {{ .Values.ndm.sparse.path }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
# By default the node-disk-manager will be run on all kubernetes nodes
|
||||
# If you would like to limit this to only some nodes, say the nodes
|
||||
# that have storage attached, you could label those node and use
|
||||
# nodeSelector.
|
||||
#
|
||||
# e.g. label the storage nodes with - "openebs.io/nodegroup"="storage-node"
|
||||
# kubectl label node <node-name> "openebs.io/nodegroup"="storage-node"
|
||||
#nodeSelector:
|
||||
# "openebs.io/nodegroup": "storage-node"
|
||||
{{- if .Values.ndm.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{ toYaml .Values.ndm.nodeSelector | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.ndm.tolerations }}
|
||||
tolerations:
|
||||
{{ toYaml .Values.ndm.tolerations | indent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
93
helm/openebs/templates/ndm/deployment-ndm-operator.yaml
Normal file
93
helm/openebs/templates/ndm/deployment-ndm-operator.yaml
Normal file
@@ -0,0 +1,93 @@
|
||||
{{- if not .Values.mayastor.enabled -}}
|
||||
{{- if .Values.ndmOperator.enabled }}
|
||||
{{- $ndmValues := index .Values "openebs-ndm" }}
|
||||
{{- if not $ndmValues.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ template "openebs.fullname" . }}-ndm-operator
|
||||
labels:
|
||||
app: {{ template "openebs.name" . }}
|
||||
chart: {{ template "openebs.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Release.Service }}
|
||||
component: ndm-operator
|
||||
openebs.io/component-name: ndm-operator
|
||||
openebs.io/version: {{ .Values.release.version }}
|
||||
name: ndm-operator
|
||||
spec:
|
||||
replicas: {{ .Values.ndmOperator.replicas }}
|
||||
strategy:
|
||||
type: "Recreate"
|
||||
rollingUpdate: null
|
||||
selector:
|
||||
matchLabels:
|
||||
app: {{ template "openebs.name" . }}
|
||||
release: {{ .Release.Name }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: {{ template "openebs.name" . }}
|
||||
release: {{ .Release.Name }}
|
||||
component: ndm-operator
|
||||
name: ndm-operator
|
||||
openebs.io/component-name: ndm-operator
|
||||
openebs.io/version: {{ .Values.release.version }}
|
||||
spec:
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ template "openebs.serviceAccountName" . }}
|
||||
containers:
|
||||
- name: {{ template "openebs.fullname" . }}-ndm-operator
|
||||
image: "{{ .Values.image.repository }}{{ .Values.ndmOperator.image }}:{{ .Values.ndmOperator.imageTag }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
{{- if .Values.ndmOperator.resources }}
|
||||
resources:
|
||||
{{ toYaml .Values.ndmOperator.resources | trimSuffix "\n" | indent 10 }}
|
||||
{{- end }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8585
|
||||
initialDelaySeconds: {{ .Values.ndmOperator.healthCheck.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.ndmOperator.healthCheck.periodSeconds }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /readyz
|
||||
port: 8585
|
||||
initialDelaySeconds: {{ .Values.ndmOperator.readinessCheck.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.ndmOperator.readinessCheck.periodSeconds }}
|
||||
env:
|
||||
- name: WATCH_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: SERVICE_ACCOUNT
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: spec.serviceAccountName
|
||||
- name: OPERATOR_NAME
|
||||
value: "node-disk-operator"
|
||||
- name: CLEANUP_JOB_IMAGE
|
||||
value: "{{ .Values.image.repository }}{{ .Values.helper.image }}:{{ .Values.helper.imageTag }}"
|
||||
{{- if .Values.imagePullSecrets }}
|
||||
- name: OPENEBS_IO_IMAGE_PULL_SECRETS
|
||||
value: "{{- range $index, $secret := .Values.imagePullSecrets}}{{if $index}},{{end}}{{ $secret.name }}{{- end}}"
|
||||
{{- end }}
|
||||
{{- if .Values.ndmOperator.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{ toYaml .Values.ndmOperator.nodeSelector | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.ndmOperator.tolerations }}
|
||||
tolerations:
|
||||
{{ toYaml .Values.ndmOperator.tolerations | indent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
25
helm/openebs/templates/ndm/node-exporter-service.yaml
Normal file
25
helm/openebs/templates/ndm/node-exporter-service.yaml
Normal file
@@ -0,0 +1,25 @@
|
||||
{{- if not .Values.mayastor.enabled -}}
|
||||
{{- if .Values.ndm.enabled }}
|
||||
{{- if and .Values.ndmExporter.enabled .Values.ndmExporter.nodeExporter.metricsPort }}
|
||||
{{- $ndmValues := index .Values "openebs-ndm" }}
|
||||
{{- if not $ndmValues.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ template "openebs.ndm-node-exporter.fullname" . }}-service
|
||||
labels:
|
||||
{{- include "openebs.ndm-node-exporter.labels" . | nindent 4 }}
|
||||
spec:
|
||||
clusterIP: None
|
||||
ports:
|
||||
- name: metrics
|
||||
port: {{ .Values.ndmExporter.nodeExporter.metricsPort }}
|
||||
targetPort: {{ .Values.ndmExporter.nodeExporter.metricsPort }}
|
||||
selector:
|
||||
{{- with .Values.ndmExporter.nodeExporter.podLabels }}
|
||||
{{ toYaml . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
54
helm/openebs/templates/ndm/node-exporter.yaml
Normal file
54
helm/openebs/templates/ndm/node-exporter.yaml
Normal file
@@ -0,0 +1,54 @@
|
||||
{{- if not .Values.mayastor.enabled -}}
|
||||
{{- if and .Values.ndm.enabled .Values.ndmExporter.enabled }}
|
||||
{{- $ndmValues := index .Values "openebs-ndm" }}
|
||||
{{- if not $ndmValues.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: DaemonSet
|
||||
metadata:
|
||||
name: {{ template "openebs.ndm-node-exporter.fullname" . }}
|
||||
labels:
|
||||
{{- include "openebs.ndm-node-exporter.labels" . | nindent 4 }}
|
||||
spec:
|
||||
updateStrategy:
|
||||
type: RollingUpdate
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "openebs.ndm-node-exporter.matchLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "openebs.ndm-node-exporter.labels" . | nindent 8 }}
|
||||
{{- with .Values.ndmExporter.nodeExporter.podLabels }}
|
||||
{{ toYaml . }}
|
||||
{{- end }}
|
||||
spec:
|
||||
serviceAccountName: {{ template "openebs.serviceAccountName" . }}
|
||||
containers:
|
||||
- name: {{ template "openebs.ndm-node-exporter.fullname" . }}
|
||||
image: "{{ .Values.ndmExporter.image.registry }}{{ .Values.ndmExporter.image.repository }}:{{ .Values.ndmExporter.image.tag }}"
|
||||
command:
|
||||
- /usr/local/bin/exporter
|
||||
args:
|
||||
- "start"
|
||||
- "--mode=node"
|
||||
- "--port=$(METRICS_LISTEN_PORT)"
|
||||
- "--metrics=/metrics"
|
||||
ports:
|
||||
- containerPort: {{ .Values.ndmExporter.nodeExporter.metricsPort }}
|
||||
protocol: TCP
|
||||
name: metrics
|
||||
imagePullPolicy: {{ .Values.ndmExporter.image.pullPolicy }}
|
||||
securityContext:
|
||||
privileged: true
|
||||
env:
|
||||
- name: NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
{{- if .Values.ndmExporter.nodeExporter.metricsPort }}
|
||||
- name: METRICS_LISTEN_PORT
|
||||
value: :{{ .Values.ndmExporter.nodeExporter.metricsPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
Reference in New Issue
Block a user