@yarkivaev/scada 2.3.90 → 2.3.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +6 -1
  2. package/charts/scada/Chart.yaml +6 -0
  3. package/charts/scada/templates/_helpers.tpl +88 -0
  4. package/charts/scada/templates/clickhouse.yaml +62 -0
  5. package/charts/scada/templates/collector.yaml +114 -0
  6. package/charts/scada/templates/postgres.yaml +67 -0
  7. package/charts/scada/templates/rabbitmq.yaml +174 -0
  8. package/charts/scada/templates/site-server.yaml +107 -0
  9. package/charts/scada/templates/supervisor-sink.yaml +62 -0
  10. package/charts/scada/values.yaml +40 -0
  11. package/index.js +10 -0
  12. package/package.json +3 -1
  13. package/src/application/deploy/appReleases.js +50 -0
  14. package/src/application/deploy/applyIncludes.js +31 -0
  15. package/src/application/deploy/expand.js +49 -0
  16. package/src/application/deploy/expandDevices.js +135 -0
  17. package/src/application/deploy/expandFlows.js +281 -0
  18. package/src/application/deploy/expandNamespace.js +193 -0
  19. package/src/application/deploy/expandPattern.js +207 -0
  20. package/src/application/deploy/expandProfiles.js +70 -0
  21. package/src/application/deploy/frozen.js +23 -0
  22. package/src/application/deploy/mergeDocuments.js +98 -0
  23. package/src/application/deploy/paths.js +86 -0
  24. package/src/application/deploy/pointPaths.js +20 -0
  25. package/src/application/deploy/readDocument.js +169 -0
  26. package/src/application/deploy/releaseEdges.js +185 -0
  27. package/src/application/deploy/releaseNodes.js +118 -0
  28. package/src/application/deploy/releaseValues.js +200 -0
  29. package/src/application/deploy/releases.js +115 -0
  30. package/src/application/deploy/withCollectors.js +28 -0
  31. package/src/bin/modbus-to-mqtt.js +57 -0
  32. package/src/infrastructure/ingest/mqtt/addressWindow.js +79 -0
  33. package/src/infrastructure/ingest/mqtt/modbusPublish.js +277 -0
  34. package/src/infrastructure/ingest/mqtt/registerPoint.js +90 -0
  35. package/src/infrastructure/ingest/mqtt/registerPublish.js +84 -0
package/README.md CHANGED
@@ -134,7 +134,7 @@ Main entry (`import { … } from '@yarkivaev/scada'`):
134
134
  | `pgTimeline`, `pgAlerts`, `stateDataFromPool`, `stateDataFromMemory` | State ports |
135
135
  | `stompTimeline`, `stompAlerts`, `userDecisions` | STOMP messaging |
136
136
  | `machineOwners`, `ownerTimeline`, `httpTimeline`, `httpOperations` | Owner-routed timeline and operations write (local or edge HTTP) |
137
- | `mqttMetrics`, `modbusMqtt`, `activityTracking`, `amqpMetricsIngest` | Ingest pipelines |
137
+ | `mqttMetrics`, `modbusMqtt`, `modbusPublish`, `activityTracking`, `amqpMetricsIngest` | Ingest pipelines |
138
138
  | `analyticsMcp`, `namespaceTree`, `coverageSpans`, `coverageOverlay`, `coverageCursor`, `sqlGuard` | Analytics MCP, path index, coverage spans, timeline-name overlay, checkpoint-or-sample cursor, read-only SQL guard |
139
139
 
140
140
  Subpath exports:
@@ -184,6 +184,7 @@ Alert and HMI copy are inject-only: pass `translations` into `siteServer` / `pla
184
184
  | Binary | Role |
185
185
  |--------|------|
186
186
  | `supervisor-sink` | STOMP → PostgreSQL ingest + edge HTTP API (`STATE_HTTP_PORT`, default 8081) |
187
+ | `modbus-to-mqtt` | Poll Modbus and publish `STREAM` + `MAPPING` document paths (`src/bin/modbus-to-mqtt.js`) |
187
188
 
188
189
  Full plant API with site-specific routes: plant packages call `siteServer` from this package.
189
190
 
@@ -223,6 +224,10 @@ Set `SINK_DB_PROFILE=central|edge`. Migrations run at supervisor-sink startup vi
223
224
  | `CLICKHOUSE_URL` | Central metrics sink |
224
225
  | `PORT` | Plant API port (siteServer, default 3000) |
225
226
 
227
+ ## Deploy
228
+
229
+ The deployment DSL is specified in [docs/deploy.md](docs/deploy.md). A flow is `from` and `name`. An object listed on a node is state that node is responsible for. Profile, cluster, and modules are implementation. One Helm release of `charts/scada` is one cluster, cut from that document.
230
+
226
231
  ## Testing
227
232
 
228
233
  ```bash
@@ -0,0 +1,6 @@
1
+ apiVersion: v2
2
+ name: scada
3
+ description: Generic SCADA site — site-server, supervisor-sink, collectors, Postgres, RabbitMQ, optional ClickHouse
4
+ type: application
5
+ version: 0.2.3
6
+ appVersion: "2.3.113"
@@ -0,0 +1,88 @@
1
+ {{- define "scada.labels" -}}
2
+ app.kubernetes.io/name: scada
3
+ app.kubernetes.io/instance: {{ .Release.Name }}
4
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
5
+ {{- include "scada.extraLabels" . }}
6
+ {{- end }}
7
+
8
+ {{- define "scada.extraLabels" -}}
9
+ {{- range $key, $val := (.Values.extraLabels | default dict) }}
10
+ {{ $key }}: {{ $val | quote }}
11
+ {{- end }}
12
+ {{- end }}
13
+
14
+ {{- define "scada.match" -}}
15
+ app: {{ .app }}
16
+ {{- range $key, $val := (.ctx.Values.extraLabels | default dict) }}
17
+ {{ $key }}: {{ $val | quote }}
18
+ {{- end }}
19
+ {{- end }}
20
+
21
+ {{- define "scada.claim" -}}
22
+ accessModes: ["ReadWriteOnce"]
23
+ {{- if .class }}
24
+ storageClassName: {{ .class | quote }}
25
+ {{- end }}
26
+ resources:
27
+ requests:
28
+ storage: {{ .size | quote }}
29
+ volumeMode: Filesystem
30
+ {{- end }}
31
+
32
+ {{- define "scada.device" -}}
33
+ {{- $serial := regexFind "/dev/tty[A-Za-z0-9]+" . -}}
34
+ {{- if $serial -}}
35
+ {{- $serial -}}
36
+ {{- else -}}
37
+ {{- . -}}
38
+ {{- end -}}
39
+ {{- end }}
40
+
41
+ {{- define "scada.slug" -}}
42
+ {{- regexReplaceAll "[^A-Za-z0-9]+" . "-" | trimAll "-" | lower -}}
43
+ {{- end }}
44
+
45
+ {{- define "scada.routingKey" -}}
46
+ {{- if eq . "*" -}}
47
+ #
48
+ {{- else if hasSuffix "/*" . -}}
49
+ {{- printf "%s.#" (replace "/" "." (trimSuffix "/*" .)) -}}
50
+ {{- else -}}
51
+ {{- replace "/" "." . -}}
52
+ {{- end -}}
53
+ {{- end }}
54
+
55
+ {{- define "scada.linkEnv" -}}
56
+ - name: SINK_DB_PROFILE
57
+ value: {{ .Values.role | quote }}
58
+ {{- if .Values.postgres.enabled }}
59
+ - name: POSTGRES_URL
60
+ valueFrom:
61
+ secretKeyRef:
62
+ name: {{ .Values.postgres.secret }}
63
+ key: url
64
+ - name: POSTGRES_ADMIN_URL
65
+ valueFrom:
66
+ secretKeyRef:
67
+ name: {{ .Values.postgres.secret }}
68
+ key: adminUrl
69
+ {{- end }}
70
+ {{- if .Values.rabbitmq.enabled }}
71
+ - name: STOMP_URL
72
+ value: {{ printf "stomp://%s-rabbitmq:61613" .Release.Name | quote }}
73
+ - name: STOMP_LOGIN
74
+ value: guest
75
+ - name: STOMP_PASSCODE
76
+ value: guest
77
+ - name: STOMP_HOST
78
+ value: /
79
+ - name: AMQP_URL
80
+ value: {{ printf "amqp://guest:guest@%s-rabbitmq:5672" .Release.Name | quote }}
81
+ {{- end }}
82
+ {{- if .Values.clickhouse.enabled }}
83
+ - name: CLICKHOUSE_HOST
84
+ value: {{ printf "%s-clickhouse" .Release.Name | quote }}
85
+ - name: CLICKHOUSE_URL
86
+ value: {{ printf "http://%s-clickhouse:8123" .Release.Name | quote }}
87
+ {{- end }}
88
+ {{- end }}
@@ -0,0 +1,62 @@
1
+ {{- if .Values.clickhouse.enabled }}
2
+ apiVersion: v1
3
+ kind: Service
4
+ metadata:
5
+ name: {{ .Release.Name }}-clickhouse
6
+ namespace: {{ .Release.Namespace }}
7
+ labels:
8
+ {{- include "scada.labels" . | nindent 4 }}
9
+ app: clickhouse
10
+ spec:
11
+ ports:
12
+ - name: http
13
+ port: 8123
14
+ targetPort: http
15
+ - name: native
16
+ port: 9000
17
+ targetPort: native
18
+ - name: metrics
19
+ port: 9363
20
+ targetPort: metrics
21
+ selector:
22
+ {{- include "scada.match" (dict "app" "clickhouse" "ctx" .) | nindent 4 }}
23
+ ---
24
+ apiVersion: apps/v1
25
+ kind: StatefulSet
26
+ metadata:
27
+ name: {{ .Release.Name }}-clickhouse
28
+ namespace: {{ .Release.Namespace }}
29
+ labels:
30
+ {{- include "scada.labels" . | nindent 4 }}
31
+ app: clickhouse
32
+ spec:
33
+ serviceName: {{ .Release.Name }}-clickhouse
34
+ replicas: 1
35
+ selector:
36
+ matchLabels:
37
+ {{- include "scada.match" (dict "app" "clickhouse" "ctx" .) | nindent 6 }}
38
+ template:
39
+ metadata:
40
+ labels:
41
+ {{- include "scada.labels" . | nindent 8 }}
42
+ {{- include "scada.match" (dict "app" "clickhouse" "ctx" .) | nindent 8 }}
43
+ spec:
44
+ containers:
45
+ - name: clickhouse
46
+ image: {{ .Values.clickhouse.image | quote }}
47
+ ports:
48
+ - name: http
49
+ containerPort: 8123
50
+ - name: native
51
+ containerPort: 9000
52
+ - name: metrics
53
+ containerPort: 9363
54
+ volumeMounts:
55
+ - name: data
56
+ mountPath: /var/lib/clickhouse
57
+ volumeClaimTemplates:
58
+ - metadata:
59
+ name: data
60
+ spec:
61
+ {{- include "scada.claim" (dict "size" .Values.clickhouse.storage "class" .Values.clickhouse.storageClass) | nindent 8 }}
62
+ {{- end }}
@@ -0,0 +1,114 @@
1
+ {{- if .Values.collectors }}
2
+ {{- $groups := dict -}}
3
+ {{- range $item := .Values.collectors }}
4
+ {{- $device := include "scada.device" $item.address | trim -}}
5
+ {{- if not $device }}
6
+ {{- fail "collector has no address" }}
7
+ {{- end }}
8
+ {{- if not $item.path }}
9
+ {{- fail (printf "collector %s has no path" $device) }}
10
+ {{- end }}
11
+ {{- if not $item.command }}
12
+ {{- fail (printf "collector %s has no command" $device) }}
13
+ {{- end }}
14
+ {{- $token := $item.command | toJson -}}
15
+ {{- $prior := list -}}
16
+ {{- if hasKey $groups $token }}
17
+ {{- $prior = index $groups $token -}}
18
+ {{- end }}
19
+ {{- $groups = set $groups $token (append $prior $item) -}}
20
+ {{- end }}
21
+ {{- $claimed := dict -}}
22
+ {{- range $token, $items := $groups }}
23
+ {{- range $item := $items }}
24
+ {{- $device := include "scada.device" $item.address | trim -}}
25
+ {{- if hasPrefix "/dev/" $device }}
26
+ {{- if and (hasKey $claimed $device) (ne (index $claimed $device) $token) }}
27
+ {{- fail (printf "collectors on %s use different commands" $device) }}
28
+ {{- end }}
29
+ {{- $claimed = set $claimed $device $token -}}
30
+ {{- end }}
31
+ {{- end }}
32
+ {{- end }}
33
+ {{- range $token, $items := $groups }}
34
+ {{- $argv := (index $items 0).command -}}
35
+ {{- $slug := include "scada.slug" (index $argv (sub (len $argv) 1)) | trim -}}
36
+ {{- if not $slug }}
37
+ {{- fail (printf "collector %s has no name" $token) }}
38
+ {{- end }}
39
+ {{- $paths := list -}}
40
+ {{- $maps := list -}}
41
+ {{- $addresses := list -}}
42
+ {{- $serials := list -}}
43
+ {{- range $item := $items }}
44
+ {{- $paths = append $paths $item.path -}}
45
+ {{- $maps = append $maps ($item.mapping | default (dict)) -}}
46
+ {{- $addresses = append $addresses $item.address -}}
47
+ {{- $device := include "scada.device" $item.address | trim -}}
48
+ {{- if and (hasPrefix "/dev/" $device) (not (has $device $serials)) }}
49
+ {{- $serials = append $serials $device -}}
50
+ {{- end }}
51
+ {{- end }}
52
+ ---
53
+ apiVersion: apps/v1
54
+ kind: Deployment
55
+ metadata:
56
+ name: {{ $.Release.Name }}-collector-{{ $slug }}
57
+ namespace: {{ $.Release.Namespace }}
58
+ labels:
59
+ {{- include "scada.labels" $ | nindent 4 }}
60
+ app: collector
61
+ spec:
62
+ replicas: 1
63
+ selector:
64
+ matchLabels:
65
+ {{- include "scada.match" (dict "app" "collector" "ctx" $) | nindent 6 }}
66
+ scada/command: {{ $slug }}
67
+ template:
68
+ metadata:
69
+ labels:
70
+ {{- include "scada.labels" $ | nindent 8 }}
71
+ {{- include "scada.match" (dict "app" "collector" "ctx" $) | nindent 8 }}
72
+ scada/command: {{ $slug }}
73
+ spec:
74
+ {{- with $.Values.pullSecret }}
75
+ imagePullSecrets:
76
+ - name: {{ . }}
77
+ {{- end }}
78
+ containers:
79
+ - name: collector
80
+ image: {{ required "image is required" $.Values.image | quote }}
81
+ command: {{ $argv | toJson }}
82
+ {{- if $serials }}
83
+ securityContext:
84
+ privileged: true
85
+ volumeMounts:
86
+ {{- range $serials }}
87
+ - name: {{ include "scada.slug" . | trim }}
88
+ mountPath: {{ . }}
89
+ {{- end }}
90
+ {{- end }}
91
+ env:
92
+ - name: ADDRESS
93
+ value: {{ $addresses | toJson | quote }}
94
+ - name: STREAM
95
+ value: {{ $paths | toJson | quote }}
96
+ - name: MAPPING
97
+ value: {{ $maps | toJson | quote }}
98
+ {{- if $.Values.rabbitmq.enabled }}
99
+ - name: MQTT_URL
100
+ value: {{ printf "mqtt://%s-rabbitmq:1883" $.Release.Name | quote }}
101
+ {{- end }}
102
+ resources:
103
+ {{- toYaml $.Values.resources | nindent 12 }}
104
+ {{- if $serials }}
105
+ volumes:
106
+ {{- range $serials }}
107
+ - name: {{ include "scada.slug" . | trim }}
108
+ hostPath:
109
+ path: {{ . }}
110
+ type: CharDevice
111
+ {{- end }}
112
+ {{- end }}
113
+ {{- end }}
114
+ {{- end }}
@@ -0,0 +1,67 @@
1
+ {{- if .Values.postgres.enabled }}
2
+ apiVersion: v1
3
+ kind: Service
4
+ metadata:
5
+ name: {{ .Release.Name }}-postgres
6
+ namespace: {{ .Release.Namespace }}
7
+ labels:
8
+ {{- include "scada.labels" . | nindent 4 }}
9
+ app: postgres
10
+ spec:
11
+ ports:
12
+ - name: postgres
13
+ port: 5432
14
+ targetPort: postgres
15
+ selector:
16
+ {{- include "scada.match" (dict "app" "postgres" "ctx" .) | nindent 4 }}
17
+ ---
18
+ apiVersion: apps/v1
19
+ kind: StatefulSet
20
+ metadata:
21
+ name: {{ .Release.Name }}-postgres
22
+ namespace: {{ .Release.Namespace }}
23
+ labels:
24
+ {{- include "scada.labels" . | nindent 4 }}
25
+ app: postgres
26
+ spec:
27
+ serviceName: {{ .Release.Name }}-postgres
28
+ replicas: 1
29
+ selector:
30
+ matchLabels:
31
+ {{- include "scada.match" (dict "app" "postgres" "ctx" .) | nindent 6 }}
32
+ template:
33
+ metadata:
34
+ labels:
35
+ {{- include "scada.labels" . | nindent 8 }}
36
+ {{- include "scada.match" (dict "app" "postgres" "ctx" .) | nindent 8 }}
37
+ spec:
38
+ containers:
39
+ - name: postgres
40
+ image: {{ .Values.postgres.image | quote }}
41
+ ports:
42
+ - name: postgres
43
+ containerPort: 5432
44
+ env:
45
+ - name: POSTGRES_DB
46
+ value: {{ .Values.postgres.database | quote }}
47
+ - name: POSTGRES_USER
48
+ valueFrom:
49
+ secretKeyRef:
50
+ name: {{ .Values.postgres.secret }}
51
+ key: user
52
+ - name: POSTGRES_PASSWORD
53
+ valueFrom:
54
+ secretKeyRef:
55
+ name: {{ .Values.postgres.secret }}
56
+ key: password
57
+ - name: PGDATA
58
+ value: {{ .Values.postgres.data | quote }}
59
+ volumeMounts:
60
+ - name: data
61
+ mountPath: /var/lib/postgresql/data
62
+ volumeClaimTemplates:
63
+ - metadata:
64
+ name: data
65
+ spec:
66
+ {{- include "scada.claim" (dict "size" .Values.postgres.storage "class" .Values.postgres.storageClass) | nindent 8 }}
67
+ {{- end }}
@@ -0,0 +1,174 @@
1
+ {{- if .Values.rabbitmq.enabled }}
2
+ {{- $ingest := list -}}
3
+ {{- $outgoing := list -}}
4
+ {{- range .Values.collectors }}
5
+ {{- if .path }}
6
+ {{- $ingest = append $ingest (include "scada.routingKey" .path | trim) -}}
7
+ {{- end }}
8
+ {{- end }}
9
+ {{- range $item := concat (.Values.buses | default (list)) (.Values.bus | default (list)) }}
10
+ {{- range $name := ($item.names | default (list)) }}
11
+ {{- $routed := include "scada.routingKey" $name | trim -}}
12
+ {{- $ingest = append $ingest $routed -}}
13
+ {{- $outgoing = append $outgoing $routed -}}
14
+ {{- end }}
15
+ {{- end }}
16
+ {{- $outgoing = $outgoing | uniq -}}
17
+ {{- if $ingest }}
18
+ {{- $ingest = $ingest | uniq -}}
19
+ {{- else }}
20
+ {{- $ingest = list "#" -}}
21
+ {{- end }}
22
+ {{- $exchange := list
23
+ (dict "name" "scada.alerts" "vhost" "/" "type" "topic" "durable" true "auto_delete" false)
24
+ (dict "name" "scada.segments" "vhost" "/" "type" "topic" "durable" true "auto_delete" false)
25
+ (dict "name" "scada.telemetry" "vhost" "/" "type" "topic" "durable" true "auto_delete" false)
26
+ (dict "name" "scada.operations" "vhost" "/" "type" "topic" "durable" true "auto_delete" false)
27
+ (dict "name" "scada.user_decisions" "vhost" "/" "type" "topic" "durable" true "auto_delete" false)
28
+ -}}
29
+ {{- $queue := list
30
+ (dict "name" "scada.segments.ingest" "vhost" "/" "durable" true "auto_delete" false)
31
+ (dict "name" "scada.telemetry.ingest" "vhost" "/" "durable" true "auto_delete" false)
32
+ (dict "name" "scada.operations.ingest" "vhost" "/" "durable" true "auto_delete" false)
33
+ (dict "name" "scada.user_decisions" "vhost" "/" "durable" true "auto_delete" false)
34
+ -}}
35
+ {{- if $outgoing }}
36
+ {{- $queue = append $queue (dict "name" "scada.telemetry.outbox" "vhost" "/" "durable" true "auto_delete" false) -}}
37
+ {{- end }}
38
+ {{- $binding := list -}}
39
+ {{- range $key := $ingest }}
40
+ {{- $binding = append $binding (dict "source" "scada.telemetry" "vhost" "/" "destination" "scada.telemetry.ingest" "destination_type" "queue" "routing_key" $key) -}}
41
+ {{- end }}
42
+ {{- range $pair := (list
43
+ (dict "source" "scada.operations" "destination" "scada.operations.ingest")
44
+ (dict "source" "scada.segments" "destination" "scada.segments.ingest")
45
+ (dict "source" "scada.user_decisions" "destination" "scada.user_decisions")) }}
46
+ {{- $binding = append $binding (dict "source" $pair.source "vhost" "/" "destination" $pair.destination "destination_type" "queue" "routing_key" "#") -}}
47
+ {{- end }}
48
+ {{- range $key := $outgoing }}
49
+ {{- $binding = append $binding (dict "source" "scada.telemetry" "vhost" "/" "destination" "scada.telemetry.outbox" "destination_type" "queue" "routing_key" $key) -}}
50
+ {{- end }}
51
+ {{- $definitions := dict
52
+ "vhosts" (list (dict "name" "/"))
53
+ "users" (list (dict "name" "guest" "password" "guest" "tags" (list "administrator")))
54
+ "permissions" (list (dict "user" "guest" "vhost" "/" "configure" ".*" "write" ".*" "read" ".*"))
55
+ "exchanges" $exchange
56
+ "queues" $queue
57
+ "bindings" $binding
58
+ -}}
59
+ apiVersion: v1
60
+ kind: ConfigMap
61
+ metadata:
62
+ name: {{ .Release.Name }}-rabbitmq
63
+ namespace: {{ .Release.Namespace }}
64
+ labels:
65
+ {{- include "scada.labels" . | nindent 4 }}
66
+ app: rabbitmq
67
+ data:
68
+ enabled_plugins: |
69
+ [rabbitmq_stomp, rabbitmq_mqtt, rabbitmq_management].
70
+ rabbitmq.conf: |
71
+ load_definitions = /etc/rabbitmq/definitions.json
72
+ mqtt.listeners.tcp.default = 1883
73
+ mqtt.allow_anonymous = true
74
+ mqtt.vhost = /
75
+ mqtt.exchange = scada.telemetry
76
+ definitions.json: |
77
+ {{ $definitions | toPrettyJson | nindent 4 }}
78
+ ---
79
+ apiVersion: v1
80
+ kind: Service
81
+ metadata:
82
+ name: {{ .Release.Name }}-rabbitmq
83
+ namespace: {{ .Release.Namespace }}
84
+ labels:
85
+ {{- include "scada.labels" . | nindent 4 }}
86
+ app: rabbitmq
87
+ spec:
88
+ {{- $svc := .Values.rabbitmq.service | default dict }}
89
+ type: {{ $svc.type | default "ClusterIP" }}
90
+ ports:
91
+ - name: amqp
92
+ port: 5672
93
+ targetPort: amqp
94
+ {{- with $svc.nodePorts }}
95
+ {{- if .amqp }}
96
+ nodePort: {{ .amqp }}
97
+ {{- end }}
98
+ {{- end }}
99
+ - name: mqtt
100
+ port: 1883
101
+ targetPort: mqtt
102
+ - name: stomp
103
+ port: 61613
104
+ targetPort: stomp
105
+ {{- with $svc.nodePorts }}
106
+ {{- if .stomp }}
107
+ nodePort: {{ .stomp }}
108
+ {{- end }}
109
+ {{- end }}
110
+ - name: management
111
+ port: 15672
112
+ targetPort: management
113
+ {{- with $svc.nodePorts }}
114
+ {{- if .management }}
115
+ nodePort: {{ .management }}
116
+ {{- end }}
117
+ {{- end }}
118
+ selector:
119
+ {{- include "scada.match" (dict "app" "rabbitmq" "ctx" .) | nindent 4 }}
120
+ ---
121
+ apiVersion: apps/v1
122
+ kind: StatefulSet
123
+ metadata:
124
+ name: {{ .Release.Name }}-rabbitmq
125
+ namespace: {{ .Release.Namespace }}
126
+ labels:
127
+ {{- include "scada.labels" . | nindent 4 }}
128
+ app: rabbitmq
129
+ spec:
130
+ serviceName: {{ .Release.Name }}-rabbitmq
131
+ replicas: 1
132
+ selector:
133
+ matchLabels:
134
+ {{- include "scada.match" (dict "app" "rabbitmq" "ctx" .) | nindent 6 }}
135
+ template:
136
+ metadata:
137
+ labels:
138
+ {{- include "scada.labels" . | nindent 8 }}
139
+ {{- include "scada.match" (dict "app" "rabbitmq" "ctx" .) | nindent 8 }}
140
+ spec:
141
+ containers:
142
+ - name: rabbitmq
143
+ image: {{ .Values.rabbitmq.image | quote }}
144
+ ports:
145
+ - name: amqp
146
+ containerPort: 5672
147
+ - name: mqtt
148
+ containerPort: 1883
149
+ - name: stomp
150
+ containerPort: 61613
151
+ - name: management
152
+ containerPort: 15672
153
+ volumeMounts:
154
+ - name: config
155
+ mountPath: /etc/rabbitmq/enabled_plugins
156
+ subPath: enabled_plugins
157
+ - name: config
158
+ mountPath: /etc/rabbitmq/rabbitmq.conf
159
+ subPath: rabbitmq.conf
160
+ - name: config
161
+ mountPath: /etc/rabbitmq/definitions.json
162
+ subPath: definitions.json
163
+ - name: data
164
+ mountPath: /var/lib/rabbitmq
165
+ volumes:
166
+ - name: config
167
+ configMap:
168
+ name: {{ .Release.Name }}-rabbitmq
169
+ volumeClaimTemplates:
170
+ - metadata:
171
+ name: data
172
+ spec:
173
+ {{- include "scada.claim" (dict "size" .Values.rabbitmq.storage "class" .Values.rabbitmq.storageClass) | nindent 8 }}
174
+ {{- end }}
@@ -0,0 +1,107 @@
1
+ apiVersion: apps/v1
2
+ kind: Deployment
3
+ metadata:
4
+ name: {{ .Release.Name }}-site-server
5
+ namespace: {{ .Release.Namespace }}
6
+ labels:
7
+ {{- include "scada.labels" . | nindent 4 }}
8
+ app: site-server
9
+ spec:
10
+ replicas: 1
11
+ selector:
12
+ matchLabels:
13
+ {{- include "scada.match" (dict "app" "site-server" "ctx" .) | nindent 6 }}
14
+ template:
15
+ metadata:
16
+ labels:
17
+ {{- include "scada.labels" . | nindent 8 }}
18
+ {{- include "scada.match" (dict "app" "site-server" "ctx" .) | nindent 8 }}
19
+ spec:
20
+ {{- with .Values.pullSecret }}
21
+ imagePullSecrets:
22
+ - name: {{ . }}
23
+ {{- end }}
24
+ containers:
25
+ - name: site-server
26
+ image: {{ required "image is required" .Values.image | quote }}
27
+ {{- with .Values.command }}
28
+ command: {{ toJson . }}
29
+ {{- end }}
30
+ ports:
31
+ - name: http
32
+ containerPort: {{ .Values.service.port }}
33
+ - name: internal-api
34
+ containerPort: {{ .Values.service.internalPort }}
35
+ env:
36
+ - name: PORT
37
+ value: {{ .Values.service.port | quote }}
38
+ - name: STATE_HTTP_PORT
39
+ value: {{ .Values.service.internalPort | quote }}
40
+ {{- include "scada.linkEnv" . | nindent 12 }}
41
+ - name: SINK_PIPELINES
42
+ value: "false"
43
+ {{- if .Values.machines }}
44
+ - name: EDGE_MACHINES
45
+ value: {{ .Values.machines | toJson | quote }}
46
+ {{- end }}
47
+ {{- if .Values.sites }}
48
+ - name: EDGE_SITES
49
+ value: {{ .Values.sites | toJson | quote }}
50
+ {{- end }}
51
+ {{- range .Values.env }}
52
+ - name: {{ .name }}
53
+ value: {{ .value | quote }}
54
+ {{- end }}
55
+ readinessProbe:
56
+ httpGet:
57
+ path: /api/v1/machines
58
+ port: http
59
+ initialDelaySeconds: 5
60
+ periodSeconds: 10
61
+ livenessProbe:
62
+ httpGet:
63
+ path: /api/v1/machines
64
+ port: http
65
+ initialDelaySeconds: 15
66
+ periodSeconds: 30
67
+ resources:
68
+ {{- toYaml .Values.resources | nindent 12 }}
69
+ ---
70
+ apiVersion: v1
71
+ kind: Service
72
+ metadata:
73
+ name: {{ .Release.Name }}-site-server
74
+ namespace: {{ .Release.Namespace }}
75
+ labels:
76
+ {{- include "scada.labels" . | nindent 4 }}
77
+ app: site-server
78
+ spec:
79
+ ports:
80
+ - name: http
81
+ port: {{ .Values.service.port }}
82
+ targetPort: http
83
+ - name: internal-api
84
+ port: {{ .Values.service.internalPort }}
85
+ targetPort: internal-api
86
+ selector:
87
+ {{- include "scada.match" (dict "app" "site-server" "ctx" .) | nindent 4 }}
88
+ {{- if gt (int .Values.service.nodePort) 0 }}
89
+ ---
90
+ apiVersion: v1
91
+ kind: Service
92
+ metadata:
93
+ name: {{ .Release.Name }}-site-server-plant-lan
94
+ namespace: {{ .Release.Namespace }}
95
+ labels:
96
+ {{- include "scada.labels" . | nindent 4 }}
97
+ app: site-server
98
+ spec:
99
+ type: NodePort
100
+ ports:
101
+ - name: http
102
+ port: {{ .Values.service.port }}
103
+ targetPort: http
104
+ nodePort: {{ .Values.service.nodePort }}
105
+ selector:
106
+ {{- include "scada.match" (dict "app" "site-server" "ctx" .) | nindent 4 }}
107
+ {{- end }}