cloudfall 0.2.0__py3-none-any.whl

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 (165) hide show
  1. cloudfall/__init__.py +19 -0
  2. cloudfall/__main__.py +5 -0
  3. cloudfall/_bundled/schemas/v1/alert-rule.schema.json +63 -0
  4. cloudfall/_bundled/schemas/v1/application.schema.json +60 -0
  5. cloudfall/_bundled/schemas/v1/artifact.schema.json +71 -0
  6. cloudfall/_bundled/schemas/v1/backup-receipt.schema.json +58 -0
  7. cloudfall/_bundled/schemas/v1/common.schema.json +115 -0
  8. cloudfall/_bundled/schemas/v1/component.schema.json +234 -0
  9. cloudfall/_bundled/schemas/v1/deployment-receipt.schema.json +53 -0
  10. cloudfall/_bundled/schemas/v1/domain.schema.json +208 -0
  11. cloudfall/_bundled/schemas/v1/environment-receipt.schema.json +55 -0
  12. cloudfall/_bundled/schemas/v1/logging-stack.schema.json +473 -0
  13. cloudfall/_bundled/schemas/v1/observed-domain.schema.json +158 -0
  14. cloudfall/_bundled/schemas/v1/observed-server.schema.json +627 -0
  15. cloudfall/_bundled/schemas/v1/operator-policy.schema.json +97 -0
  16. cloudfall/_bundled/schemas/v1/operator-proposal.schema.json +253 -0
  17. cloudfall/_bundled/schemas/v1/release-receipt.schema.json +66 -0
  18. cloudfall/_bundled/schemas/v1/server-type.schema.json +289 -0
  19. cloudfall/_bundled/schemas/v1/server.schema.json +146 -0
  20. cloudfall/_bundled/schemas/v1/service.schema.json +222 -0
  21. cloudfall/_bundled/schemas/v1/ssh-public-key.schema.json +55 -0
  22. cloudfall/agent_tools.py +868 -0
  23. cloudfall/arguments.py +92 -0
  24. cloudfall/audit.py +905 -0
  25. cloudfall/authoring.py +341 -0
  26. cloudfall/cli.py +1748 -0
  27. cloudfall/commands.py +257 -0
  28. cloudfall/cutover.py +370 -0
  29. cloudfall/dashboard.py +407 -0
  30. cloudfall/dashboard_server.py +201 -0
  31. cloudfall/domain.py +1157 -0
  32. cloudfall/importer.py +906 -0
  33. cloudfall/inventory.py +2116 -0
  34. cloudfall/lifecycle.py +874 -0
  35. cloudfall/mcp_server.py +704 -0
  36. cloudfall/migrate.py +730 -0
  37. cloudfall/observation.py +143 -0
  38. cloudfall/operations.py +1228 -0
  39. cloudfall/operator.py +1099 -0
  40. cloudfall/project.py +841 -0
  41. cloudfall/py.typed +0 -0
  42. cloudfall/render_api.py +338 -0
  43. cloudfall/resources.py +67 -0
  44. cloudfall/secrets.py +262 -0
  45. cloudfall/service_evidence.py +659 -0
  46. cloudfall/validation.py +1340 -0
  47. cloudfall-0.2.0.dist-info/METADATA +408 -0
  48. cloudfall-0.2.0.dist-info/RECORD +165 -0
  49. cloudfall-0.2.0.dist-info/WHEEL +4 -0
  50. cloudfall-0.2.0.dist-info/entry_points.txt +4 -0
  51. cloudfall-0.2.0.dist-info/licenses/LICENSE +661 -0
  52. cloudfall_engine/__init__.py +5 -0
  53. cloudfall_engine/__main__.py +5 -0
  54. cloudfall_engine/_bundled/ansible/ansible.cfg +7 -0
  55. cloudfall_engine/_bundled/ansible/playbooks/backup.yml +86 -0
  56. cloudfall_engine/_bundled/ansible/playbooks/baseline.yml +35 -0
  57. cloudfall_engine/_bundled/ansible/playbooks/bootstrap.yml +24 -0
  58. cloudfall_engine/_bundled/ansible/playbooks/data.yml +28 -0
  59. cloudfall_engine/_bundled/ansible/playbooks/deploy.yml +35 -0
  60. cloudfall_engine/_bundled/ansible/playbooks/domains.yml +21 -0
  61. cloudfall_engine/_bundled/ansible/playbooks/health.yml +31 -0
  62. cloudfall_engine/_bundled/ansible/playbooks/inspect.yml +15 -0
  63. cloudfall_engine/_bundled/ansible/playbooks/logging.yml +35 -0
  64. cloudfall_engine/_bundled/ansible/playbooks/restart.yml +31 -0
  65. cloudfall_engine/_bundled/ansible/playbooks/rollback.yml +33 -0
  66. cloudfall_engine/_bundled/ansible/playbooks/services.yml +37 -0
  67. cloudfall_engine/_bundled/ansible/playbooks/time.yml +9 -0
  68. cloudfall_engine/_bundled/ansible/roles/cloudfall_access/defaults/main.yml +2 -0
  69. cloudfall_engine/_bundled/ansible/roles/cloudfall_access/handlers/main.yml +5 -0
  70. cloudfall_engine/_bundled/ansible/roles/cloudfall_access/meta/argument_specs.yml +34 -0
  71. cloudfall_engine/_bundled/ansible/roles/cloudfall_access/meta/main.yml +13 -0
  72. cloudfall_engine/_bundled/ansible/roles/cloudfall_access/tasks/main.yml +59 -0
  73. cloudfall_engine/_bundled/ansible/roles/cloudfall_bootstrap/defaults/main.yml +11 -0
  74. cloudfall_engine/_bundled/ansible/roles/cloudfall_bootstrap/meta/argument_specs.yml +52 -0
  75. cloudfall_engine/_bundled/ansible/roles/cloudfall_bootstrap/meta/main.yml +13 -0
  76. cloudfall_engine/_bundled/ansible/roles/cloudfall_bootstrap/tasks/main.yml +99 -0
  77. cloudfall_engine/_bundled/ansible/roles/cloudfall_data_migration/defaults/main.yml +15 -0
  78. cloudfall_engine/_bundled/ansible/roles/cloudfall_data_migration/meta/argument_specs.yml +36 -0
  79. cloudfall_engine/_bundled/ansible/roles/cloudfall_data_migration/meta/main.yml +13 -0
  80. cloudfall_engine/_bundled/ansible/roles/cloudfall_data_migration/tasks/main.yml +201 -0
  81. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/defaults/main.yml +10 -0
  82. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/meta/argument_specs.yml +125 -0
  83. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/meta/main.yml +13 -0
  84. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/tasks/health.yml +3 -0
  85. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/tasks/health_gate.yml +37 -0
  86. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/tasks/main.yml +285 -0
  87. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/tasks/restart.yml +17 -0
  88. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/tasks/rollback.yml +52 -0
  89. cloudfall_engine/_bundled/ansible/roles/cloudfall_deploy/templates/component.service.j2 +24 -0
  90. cloudfall_engine/_bundled/ansible/roles/cloudfall_firewall/defaults/main.yml +2 -0
  91. cloudfall_engine/_bundled/ansible/roles/cloudfall_firewall/handlers/main.yml +5 -0
  92. cloudfall_engine/_bundled/ansible/roles/cloudfall_firewall/meta/argument_specs.yml +33 -0
  93. cloudfall_engine/_bundled/ansible/roles/cloudfall_firewall/meta/main.yml +13 -0
  94. cloudfall_engine/_bundled/ansible/roles/cloudfall_firewall/tasks/main.yml +51 -0
  95. cloudfall_engine/_bundled/ansible/roles/cloudfall_firewall/templates/nftables.conf.j2 +31 -0
  96. cloudfall_engine/_bundled/ansible/roles/cloudfall_inspect/defaults/main.yml +6 -0
  97. cloudfall_engine/_bundled/ansible/roles/cloudfall_inspect/meta/argument_specs.yml +24 -0
  98. cloudfall_engine/_bundled/ansible/roles/cloudfall_inspect/meta/main.yml +13 -0
  99. cloudfall_engine/_bundled/ansible/roles/cloudfall_inspect/tasks/main.yml +643 -0
  100. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/defaults/main.yml +6 -0
  101. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/handlers/main.yml +29 -0
  102. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/meta/argument_specs.yml +227 -0
  103. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/meta/main.yml +11 -0
  104. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/tasks/main.yml +487 -0
  105. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/alertmanager-defaults.j2 +2 -0
  106. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/alertmanager.yaml.j2 +33 -0
  107. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/grafana.ini.j2 +20 -0
  108. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/loki-datasource.yml.j2 +11 -0
  109. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/loki-systemd-override.conf.j2 +3 -0
  110. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/loki.yaml.j2 +49 -0
  111. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/nginx-loki-gateway.conf.j2 +45 -0
  112. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/prometheus-datasource.yml.j2 +11 -0
  113. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/prometheus-defaults.j2 +2 -0
  114. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/prometheus-rules.yaml.j2 +20 -0
  115. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_backend/templates/prometheus.yaml.j2 +24 -0
  116. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_collector/defaults/main.yml +7 -0
  117. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_collector/handlers/main.yml +6 -0
  118. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_collector/meta/argument_specs.yml +122 -0
  119. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_collector/meta/main.yml +11 -0
  120. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_collector/tasks/main.yml +224 -0
  121. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_collector/templates/alloy-systemd-override.conf.j2 +3 -0
  122. cloudfall_engine/_bundled/ansible/roles/cloudfall_logging_collector/templates/config.alloy.j2 +127 -0
  123. cloudfall_engine/_bundled/ansible/roles/cloudfall_nginx_site/defaults/main.yml +4 -0
  124. cloudfall_engine/_bundled/ansible/roles/cloudfall_nginx_site/handlers/main.yml +5 -0
  125. cloudfall_engine/_bundled/ansible/roles/cloudfall_nginx_site/meta/argument_specs.yml +69 -0
  126. cloudfall_engine/_bundled/ansible/roles/cloudfall_nginx_site/meta/main.yml +13 -0
  127. cloudfall_engine/_bundled/ansible/roles/cloudfall_nginx_site/tasks/main.yml +212 -0
  128. cloudfall_engine/_bundled/ansible/roles/cloudfall_nginx_site/templates/domain-site.conf.j2 +54 -0
  129. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/defaults/main.yml +6 -0
  130. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/handlers/main.yml +9 -0
  131. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/meta/argument_specs.yml +91 -0
  132. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/meta/main.yml +13 -0
  133. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/tasks/main.yml +295 -0
  134. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/templates/backup.service.j2 +11 -0
  135. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/templates/backup.sh.j2 +17 -0
  136. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/templates/backup.timer.j2 +10 -0
  137. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/templates/cloudfall.conf.j2 +3 -0
  138. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/templates/restore-check.service.j2 +11 -0
  139. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/templates/restore-check.sh.j2 +27 -0
  140. cloudfall_engine/_bundled/ansible/roles/cloudfall_postgresql/templates/restore-check.timer.j2 +10 -0
  141. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/defaults/main.yml +2 -0
  142. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/handlers/main.yml +6 -0
  143. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/meta/argument_specs.yml +68 -0
  144. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/meta/main.yml +13 -0
  145. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/tasks/main.yml +148 -0
  146. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/templates/backup.service.j2 +11 -0
  147. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/templates/backup.sh.j2 +14 -0
  148. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/templates/backup.timer.j2 +10 -0
  149. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/templates/cloudfall.conf.j2 +6 -0
  150. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/templates/restore-check.service.j2 +11 -0
  151. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/templates/restore-check.sh.j2 +15 -0
  152. cloudfall_engine/_bundled/ansible/roles/cloudfall_redis/templates/restore-check.timer.j2 +10 -0
  153. cloudfall_engine/_bundled/ansible/roles/cloudfall_time/defaults/main.yml +2 -0
  154. cloudfall_engine/_bundled/ansible/roles/cloudfall_time/meta/argument_specs.yml +10 -0
  155. cloudfall_engine/_bundled/ansible/roles/cloudfall_time/meta/main.yml +13 -0
  156. cloudfall_engine/_bundled/ansible/roles/cloudfall_time/tasks/main.yml +119 -0
  157. cloudfall_engine/_bundled/ansible/roles/cloudfall_unattended_upgrades/defaults/main.yml +3 -0
  158. cloudfall_engine/_bundled/ansible/roles/cloudfall_unattended_upgrades/meta/argument_specs.yml +8 -0
  159. cloudfall_engine/_bundled/ansible/roles/cloudfall_unattended_upgrades/meta/main.yml +13 -0
  160. cloudfall_engine/_bundled/ansible/roles/cloudfall_unattended_upgrades/tasks/main.yml +37 -0
  161. cloudfall_engine/ansible_inventory.py +253 -0
  162. cloudfall_engine/artifact.py +258 -0
  163. cloudfall_engine/cli.py +273 -0
  164. cloudfall_engine/playbook.py +175 -0
  165. cloudfall_engine/py.typed +0 -0
@@ -0,0 +1,473 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cloudfall.internal/schemas/v1/logging-stack.schema.json",
4
+ "title": "Cloudfall logging stack",
5
+ "x-cloudfall-kind": "LoggingStack",
6
+ "type": "object",
7
+ "properties": {
8
+ "apiVersion": {
9
+ "$ref": "common.schema.json#/$defs/apiVersion"
10
+ },
11
+ "kind": {
12
+ "const": "LoggingStack"
13
+ },
14
+ "metadata": {
15
+ "$ref": "common.schema.json#/$defs/metadata"
16
+ },
17
+ "spec": {
18
+ "type": "object",
19
+ "properties": {
20
+ "environment": {
21
+ "$ref": "common.schema.json#/$defs/resourceId"
22
+ },
23
+ "migration": {
24
+ "type": "object",
25
+ "properties": {
26
+ "mode": {
27
+ "const": "parallel"
28
+ },
29
+ "preserveLegacyAgents": {
30
+ "const": true
31
+ }
32
+ },
33
+ "required": [
34
+ "mode",
35
+ "preserveLegacyAgents"
36
+ ],
37
+ "additionalProperties": false
38
+ },
39
+ "software": {
40
+ "type": "object",
41
+ "properties": {
42
+ "lokiPackageVersion": {
43
+ "type": "string",
44
+ "minLength": 1,
45
+ "maxLength": 100
46
+ },
47
+ "grafanaPackageVersion": {
48
+ "type": "string",
49
+ "minLength": 1,
50
+ "maxLength": 100
51
+ },
52
+ "alloyPackageVersion": {
53
+ "type": "string",
54
+ "minLength": 1,
55
+ "maxLength": 100
56
+ },
57
+ "prometheusPackageVersion": {
58
+ "type": "string",
59
+ "minLength": 1,
60
+ "maxLength": 100
61
+ }
62
+ },
63
+ "required": [
64
+ "lokiPackageVersion",
65
+ "grafanaPackageVersion",
66
+ "alloyPackageVersion"
67
+ ],
68
+ "additionalProperties": false
69
+ },
70
+ "metrics": {
71
+ "type": "object",
72
+ "properties": {
73
+ "backend": {
74
+ "type": "object",
75
+ "properties": {
76
+ "listenAddress": {
77
+ "const": "127.0.0.1"
78
+ },
79
+ "port": {
80
+ "type": "integer",
81
+ "minimum": 1024,
82
+ "maximum": 65535
83
+ },
84
+ "storagePath": {
85
+ "$ref": "common.schema.json#/$defs/absolutePath"
86
+ },
87
+ "retentionHours": {
88
+ "type": "integer",
89
+ "minimum": 24,
90
+ "maximum": 8760
91
+ }
92
+ },
93
+ "required": [
94
+ "listenAddress",
95
+ "port",
96
+ "storagePath",
97
+ "retentionHours"
98
+ ],
99
+ "additionalProperties": false
100
+ },
101
+ "collection": {
102
+ "type": "object",
103
+ "properties": {
104
+ "intervalSeconds": {
105
+ "type": "integer",
106
+ "minimum": 5,
107
+ "maximum": 300
108
+ }
109
+ },
110
+ "required": [
111
+ "intervalSeconds"
112
+ ],
113
+ "additionalProperties": false
114
+ }
115
+ },
116
+ "required": [
117
+ "backend",
118
+ "collection"
119
+ ],
120
+ "additionalProperties": false
121
+ },
122
+ "backend": {
123
+ "type": "object",
124
+ "properties": {
125
+ "server": {
126
+ "$ref": "common.schema.json#/$defs/resourceId"
127
+ },
128
+ "listenAddress": {
129
+ "const": "127.0.0.1"
130
+ },
131
+ "port": {
132
+ "type": "integer",
133
+ "minimum": 1024,
134
+ "maximum": 65535
135
+ },
136
+ "storage": {
137
+ "type": "object",
138
+ "properties": {
139
+ "type": {
140
+ "const": "filesystem"
141
+ },
142
+ "path": {
143
+ "$ref": "common.schema.json#/$defs/absolutePath"
144
+ }
145
+ },
146
+ "required": [
147
+ "type",
148
+ "path"
149
+ ],
150
+ "additionalProperties": false
151
+ },
152
+ "retentionHours": {
153
+ "type": "integer",
154
+ "minimum": 24,
155
+ "maximum": 8760
156
+ }
157
+ },
158
+ "required": [
159
+ "server",
160
+ "listenAddress",
161
+ "port",
162
+ "storage",
163
+ "retentionHours"
164
+ ],
165
+ "additionalProperties": false
166
+ },
167
+ "gateway": {
168
+ "type": "object",
169
+ "properties": {
170
+ "serverName": {
171
+ "type": "string",
172
+ "format": "hostname"
173
+ },
174
+ "listenAddress": {
175
+ "enum": [
176
+ "0.0.0.0",
177
+ "::"
178
+ ]
179
+ },
180
+ "port": {
181
+ "type": "integer",
182
+ "minimum": 1024,
183
+ "maximum": 65535
184
+ },
185
+ "tls": {
186
+ "type": "object",
187
+ "properties": {
188
+ "certificatePath": {
189
+ "$ref": "common.schema.json#/$defs/absolutePath"
190
+ },
191
+ "keyPath": {
192
+ "$ref": "common.schema.json#/$defs/absolutePath"
193
+ },
194
+ "clientCaPath": {
195
+ "$ref": "common.schema.json#/$defs/absolutePath"
196
+ }
197
+ },
198
+ "required": [
199
+ "certificatePath",
200
+ "keyPath",
201
+ "clientCaPath"
202
+ ],
203
+ "additionalProperties": false
204
+ }
205
+ },
206
+ "required": [
207
+ "serverName",
208
+ "listenAddress",
209
+ "port",
210
+ "tls"
211
+ ],
212
+ "additionalProperties": false
213
+ },
214
+ "grafana": {
215
+ "type": "object",
216
+ "properties": {
217
+ "listenAddress": {
218
+ "const": "127.0.0.1"
219
+ },
220
+ "port": {
221
+ "type": "integer",
222
+ "minimum": 1024,
223
+ "maximum": 65535
224
+ },
225
+ "adminPasswordPath": {
226
+ "$ref": "common.schema.json#/$defs/absolutePath"
227
+ }
228
+ },
229
+ "required": [
230
+ "listenAddress",
231
+ "port",
232
+ "adminPasswordPath"
233
+ ],
234
+ "additionalProperties": false
235
+ },
236
+ "alerting": {
237
+ "type": "object",
238
+ "properties": {
239
+ "alertmanager": {
240
+ "type": "object",
241
+ "properties": {
242
+ "listenAddress": {
243
+ "const": "127.0.0.1"
244
+ },
245
+ "port": {
246
+ "type": "integer",
247
+ "minimum": 1024,
248
+ "maximum": 65535
249
+ },
250
+ "packageVersion": {
251
+ "type": "string",
252
+ "minLength": 1,
253
+ "maxLength": 100
254
+ }
255
+ },
256
+ "required": [
257
+ "listenAddress",
258
+ "port"
259
+ ],
260
+ "additionalProperties": false
261
+ },
262
+ "receivers": {
263
+ "type": "array",
264
+ "minItems": 1,
265
+ "uniqueItems": true,
266
+ "items": {
267
+ "type": "object",
268
+ "properties": {
269
+ "id": {
270
+ "$ref": "common.schema.json#/$defs/resourceId"
271
+ },
272
+ "webhook": {
273
+ "type": "object",
274
+ "properties": {
275
+ "url": {
276
+ "type": "string",
277
+ "minLength": 1,
278
+ "maxLength": 500,
279
+ "pattern": "^https?://[^\\u0000-\\u001f\\u007f ]+$"
280
+ }
281
+ },
282
+ "required": [
283
+ "url"
284
+ ],
285
+ "additionalProperties": false
286
+ },
287
+ "email": {
288
+ "type": "object",
289
+ "properties": {
290
+ "smarthost": {
291
+ "type": "string",
292
+ "pattern": "^[a-z0-9.-]+:[0-9]{1,5}$"
293
+ },
294
+ "from": {
295
+ "type": "string",
296
+ "maxLength": 200,
297
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
298
+ },
299
+ "to": {
300
+ "type": "string",
301
+ "maxLength": 200,
302
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
303
+ },
304
+ "authUsername": {
305
+ "type": "string",
306
+ "minLength": 1,
307
+ "maxLength": 200,
308
+ "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
309
+ },
310
+ "authPasswordFile": {
311
+ "$ref": "common.schema.json#/$defs/absolutePath"
312
+ }
313
+ },
314
+ "required": [
315
+ "smarthost",
316
+ "from",
317
+ "to"
318
+ ],
319
+ "additionalProperties": false,
320
+ "dependentRequired": {
321
+ "authUsername": [
322
+ "authPasswordFile"
323
+ ],
324
+ "authPasswordFile": [
325
+ "authUsername"
326
+ ]
327
+ }
328
+ }
329
+ },
330
+ "required": [
331
+ "id"
332
+ ],
333
+ "oneOf": [
334
+ {
335
+ "required": [
336
+ "webhook"
337
+ ]
338
+ },
339
+ {
340
+ "required": [
341
+ "email"
342
+ ]
343
+ }
344
+ ],
345
+ "additionalProperties": false
346
+ }
347
+ }
348
+ },
349
+ "required": [
350
+ "alertmanager",
351
+ "receivers"
352
+ ],
353
+ "additionalProperties": false
354
+ },
355
+ "collectors": {
356
+ "type": "object",
357
+ "properties": {
358
+ "servers": {
359
+ "type": "array",
360
+ "items": {
361
+ "$ref": "common.schema.json#/$defs/resourceId"
362
+ },
363
+ "minItems": 1,
364
+ "uniqueItems": true
365
+ },
366
+ "clientTls": {
367
+ "type": "object",
368
+ "properties": {
369
+ "caPath": {
370
+ "$ref": "common.schema.json#/$defs/absolutePath"
371
+ },
372
+ "certificatePath": {
373
+ "$ref": "common.schema.json#/$defs/absolutePath"
374
+ },
375
+ "keyPath": {
376
+ "$ref": "common.schema.json#/$defs/absolutePath"
377
+ }
378
+ },
379
+ "required": [
380
+ "caPath",
381
+ "certificatePath",
382
+ "keyPath"
383
+ ],
384
+ "additionalProperties": false
385
+ },
386
+ "journal": {
387
+ "type": "object",
388
+ "properties": {
389
+ "enabled": {
390
+ "const": true
391
+ },
392
+ "maxAgeHours": {
393
+ "type": "integer",
394
+ "minimum": 1,
395
+ "maximum": 168
396
+ }
397
+ },
398
+ "required": [
399
+ "enabled",
400
+ "maxAgeHours"
401
+ ],
402
+ "additionalProperties": false
403
+ },
404
+ "files": {
405
+ "type": "array",
406
+ "items": {
407
+ "type": "object",
408
+ "properties": {
409
+ "id": {
410
+ "$ref": "common.schema.json#/$defs/resourceId"
411
+ },
412
+ "path": {
413
+ "$ref": "common.schema.json#/$defs/absolutePath"
414
+ },
415
+ "servers": {
416
+ "type": "array",
417
+ "items": {
418
+ "$ref": "common.schema.json#/$defs/resourceId"
419
+ },
420
+ "minItems": 1,
421
+ "uniqueItems": true
422
+ },
423
+ "application": {
424
+ "$ref": "common.schema.json#/$defs/resourceId"
425
+ },
426
+ "component": {
427
+ "$ref": "common.schema.json#/$defs/resourceId"
428
+ }
429
+ },
430
+ "required": [
431
+ "id",
432
+ "path",
433
+ "servers"
434
+ ],
435
+ "additionalProperties": false,
436
+ "dependentRequired": {
437
+ "component": [
438
+ "application"
439
+ ]
440
+ }
441
+ }
442
+ }
443
+ },
444
+ "required": [
445
+ "servers",
446
+ "clientTls",
447
+ "journal",
448
+ "files"
449
+ ],
450
+ "additionalProperties": false
451
+ }
452
+ },
453
+ "required": [
454
+ "environment",
455
+ "migration",
456
+ "software",
457
+ "metrics",
458
+ "backend",
459
+ "gateway",
460
+ "grafana",
461
+ "collectors"
462
+ ],
463
+ "additionalProperties": false
464
+ }
465
+ },
466
+ "required": [
467
+ "apiVersion",
468
+ "kind",
469
+ "metadata",
470
+ "spec"
471
+ ],
472
+ "additionalProperties": false
473
+ }
@@ -0,0 +1,158 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cloudfall.internal/schemas/v1/observed-domain.schema.json",
4
+ "title": "Cloudfall observed public domain route",
5
+ "$defs": {
6
+ "nullableError": {
7
+ "type": [
8
+ "string",
9
+ "null"
10
+ ],
11
+ "minLength": 1,
12
+ "maxLength": 500
13
+ },
14
+ "endpoint": {
15
+ "type": "object",
16
+ "properties": {
17
+ "reachable": {
18
+ "type": "boolean"
19
+ },
20
+ "status": {
21
+ "type": [
22
+ "integer",
23
+ "null"
24
+ ],
25
+ "minimum": 100,
26
+ "maximum": 599
27
+ },
28
+ "error": {
29
+ "$ref": "#/$defs/nullableError"
30
+ },
31
+ "skipped": {
32
+ "type": "boolean"
33
+ },
34
+ "skipReason": {
35
+ "type": "string",
36
+ "minLength": 1,
37
+ "maxLength": 200
38
+ }
39
+ },
40
+ "required": [
41
+ "reachable",
42
+ "status",
43
+ "error"
44
+ ],
45
+ "additionalProperties": false
46
+ }
47
+ },
48
+ "type": "object",
49
+ "properties": {
50
+ "apiVersion": {
51
+ "$ref": "common.schema.json#/$defs/apiVersion"
52
+ },
53
+ "kind": {
54
+ "const": "ObservedDomain"
55
+ },
56
+ "metadata": {
57
+ "$ref": "common.schema.json#/$defs/metadata"
58
+ },
59
+ "spec": {
60
+ "type": "object",
61
+ "properties": {
62
+ "domain": {
63
+ "$ref": "common.schema.json#/$defs/resourceId"
64
+ },
65
+ "observedAt": {
66
+ "type": "string",
67
+ "format": "date-time"
68
+ },
69
+ "dns": {
70
+ "type": "object",
71
+ "properties": {
72
+ "addresses": {
73
+ "type": "array",
74
+ "items": {
75
+ "type": "string",
76
+ "anyOf": [
77
+ {
78
+ "format": "ipv4"
79
+ },
80
+ {
81
+ "format": "ipv6"
82
+ }
83
+ ]
84
+ },
85
+ "uniqueItems": true
86
+ },
87
+ "proxyAddressObserved": {
88
+ "type": "boolean"
89
+ },
90
+ "edgeDetected": {
91
+ "type": "boolean"
92
+ },
93
+ "error": {
94
+ "$ref": "#/$defs/nullableError"
95
+ }
96
+ },
97
+ "required": [
98
+ "addresses",
99
+ "proxyAddressObserved",
100
+ "edgeDetected",
101
+ "error"
102
+ ],
103
+ "additionalProperties": false
104
+ },
105
+ "tls": {
106
+ "type": "object",
107
+ "properties": {
108
+ "available": {
109
+ "type": "boolean"
110
+ },
111
+ "valid": {
112
+ "type": "boolean"
113
+ },
114
+ "expiresAt": {
115
+ "type": [
116
+ "string",
117
+ "null"
118
+ ],
119
+ "format": "date-time"
120
+ },
121
+ "error": {
122
+ "$ref": "#/$defs/nullableError"
123
+ }
124
+ },
125
+ "required": [
126
+ "available",
127
+ "valid",
128
+ "expiresAt",
129
+ "error"
130
+ ],
131
+ "additionalProperties": false
132
+ },
133
+ "origin": {
134
+ "$ref": "#/$defs/endpoint"
135
+ },
136
+ "public": {
137
+ "$ref": "#/$defs/endpoint"
138
+ }
139
+ },
140
+ "required": [
141
+ "domain",
142
+ "observedAt",
143
+ "dns",
144
+ "tls",
145
+ "origin",
146
+ "public"
147
+ ],
148
+ "additionalProperties": false
149
+ }
150
+ },
151
+ "required": [
152
+ "apiVersion",
153
+ "kind",
154
+ "metadata",
155
+ "spec"
156
+ ],
157
+ "additionalProperties": false
158
+ }