@bluedynamics/cdk8s-plone 0.1.6 → 0.1.8

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.
package/.jsii CHANGED
@@ -108,7 +108,7 @@
108
108
  },
109
109
  "name": "@bluedynamics/cdk8s-plone",
110
110
  "readme": {
111
- "markdown": "# CDK8S Plone\n\n> TypeScript and Python library for deploying Plone CMS to Kubernetes using CDK8S\n\n[![npm version](https://badge.fury.io/js/%40bluedynamics%2Fcdk8s-plone.svg)](https://www.npmjs.com/package/@bluedynamics/cdk8s-plone)\n[![PyPI version](https://badge.fury.io/py/cdk8s-plone.svg)](https://pypi.org/project/cdk8s-plone/)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)\n\n## Overview\n\ncdk8s-plone provides CDK8S constructs for deploying [Plone CMS](https://plone.org/) on Kubernetes. Define your infrastructure using TypeScript or Python and generate Kubernetes manifests automatically.\n\n**Key Features:**\n- 🚀 Supports Volto (modern React frontend) and Classic UI\n- 📦 High availability with configurable replicas\n- ⚡ Optional Varnish HTTP caching layer\n- 🔧 Fine-grained resource and probe configuration\n- 🌍 Multi-language support (TypeScript/JavaScript and Python)\n- ✅ Type-safe infrastructure as code\n\n## Quick Start\n\n### Installation\n\n**TypeScript/JavaScript:**\n```bash\nnpm install @bluedynamics/cdk8s-plone\n```\n\n**Python:**\n```bash\npip install cdk8s-plone\n```\n\n### Basic Example\n\n```typescript\nimport { App, Chart } from 'cdk8s';\nimport { Plone, PloneVariant } from '@bluedynamics/cdk8s-plone';\n\nconst app = new App();\nconst chart = new Chart(app, 'PloneDeployment');\n\nnew Plone(chart, 'my-plone', {\n variant: PloneVariant.VOLTO,\n backend: {\n image: 'plone/plone-backend:6.1.3',\n replicas: 3,\n },\n frontend: {\n image: 'plone/plone-frontend:16.0.0',\n replicas: 2,\n },\n});\n\napp.synth();\n```\n\nGenerate Kubernetes manifests:\n```bash\ncdk8s synth\nkubectl apply -f dist/\n```\n\n## Documentation\n\n**📚 Full documentation:** https://bluedynamics.github.io/cdk8s-plone/\n\n- [Quick Start Tutorial](https://bluedynamics.github.io/cdk8s-plone/tutorials/01-quick-start.html)\n- [Configuration Reference](https://bluedynamics.github.io/cdk8s-plone/reference/configuration-options.html)\n- [Architecture Overview](https://bluedynamics.github.io/cdk8s-plone/explanation/architecture.html)\n- [Complete API Documentation](./API.md)\n\n## Examples\n\nSee the [cdk8s-plone-example](https://github.com/bluedynamics/cdk8s-plone-example) repository for complete working examples.\n\n## Requirements\n\n- **kubectl** - [Install kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl)\n- **Node.js 16+** (for TypeScript/JavaScript) - [Install Node.js](https://nodejs.org/)\n- **Python 3.8+** (for Python) - [Install Python](https://www.python.org/)\n- **Kubernetes cluster** (local or cloud)\n\nFor detailed setup instructions, see [Setup Prerequisites](https://bluedynamics.github.io/cdk8s-plone/how-to/setup-prerequisites.html).\n\n## Development\n\nThis project uses [Projen](https://projen.io/) for project management.\n\n```bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Build\nnpm run build\n\n# Update project configuration\n# Edit .projenrc.ts, then run:\nnpx projen\n```\n\nFor detailed development instructions, see [CONTRIBUTING.md](./CONTRIBUTING.md) (if available).\n\n## Resources\n\n- [CDK8S Documentation](https://cdk8s.io/)\n- [Plone CMS](https://plone.org/)\n- [kube-httpcache](https://github.com/mittwald/kube-httpcache) (for HTTP caching)\n- [Example Project](https://github.com/bluedynamics/cdk8s-plone-example)\n\n## License\n\n[Apache 2.0](LICENSE)\n\n## Maintainers\n\nMaintained by [Blue Dynamics Alliance](https://github.com/bluedynamics)\n\n**Author:** Jens W. Klein (jk@kleinundpartner.at)\n"
111
+ "markdown": "# CDK8S Plone\n\n> TypeScript and Python library for deploying Plone CMS to Kubernetes using CDK8S\n\n[![npm version](https://badge.fury.io/js/%40bluedynamics%2Fcdk8s-plone.svg)](https://www.npmjs.com/package/@bluedynamics/cdk8s-plone)\n[![PyPI version](https://badge.fury.io/py/cdk8s-plone.svg)](https://pypi.org/project/cdk8s-plone/)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)\n\n## Overview\n\ncdk8s-plone provides CDK8S constructs for deploying [Plone CMS](https://plone.org/) on Kubernetes. Define your infrastructure using TypeScript or Python and generate Kubernetes manifests automatically.\n\n**Key Features:**\n- 🚀 Supports Volto (modern React frontend) and Classic UI\n- 📦 High availability with configurable replicas\n- ⚡ Optional Varnish HTTP caching layer\n- 🔧 Fine-grained resource and probe configuration\n- 🌍 Multi-language support (TypeScript/JavaScript and Python)\n- ✅ Type-safe infrastructure as code\n\n## Quick Start\n\n### Installation\n\n**TypeScript/JavaScript:**\n```bash\nnpm install @bluedynamics/cdk8s-plone\n```\n\n**Python:**\n```bash\npip install cdk8s-plone\n```\n\n### Basic Example\n\n```typescript\nimport { App, Chart } from 'cdk8s';\nimport { Plone, PloneVariant } from '@bluedynamics/cdk8s-plone';\n\nconst app = new App();\nconst chart = new Chart(app, 'PloneDeployment');\n\nnew Plone(chart, 'my-plone', {\n variant: PloneVariant.VOLTO,\n backend: {\n image: 'plone/plone-backend:6.1.3',\n replicas: 3,\n },\n frontend: {\n image: 'plone/plone-frontend:16.0.0',\n replicas: 2,\n },\n});\n\napp.synth();\n```\n\nGenerate Kubernetes manifests:\n```bash\ncdk8s synth\nkubectl apply -f dist/\n```\n\n## Documentation\n\n**📚 Full documentation:** https://bluedynamics.github.io/cdk8s-plone/\n\n- [Quick Start Tutorial](https://bluedynamics.github.io/cdk8s-plone/tutorials/01-quick-start.html)\n- [Configuration Reference](https://bluedynamics.github.io/cdk8s-plone/reference/configuration-options.html)\n- [Architecture Overview](https://bluedynamics.github.io/cdk8s-plone/explanation/architecture.html)\n- [Complete API Documentation](./API.md)\n\n## Examples\n\nSee the [cdk8s-plone-example](https://github.com/bluedynamics/cdk8s-plone-example) repository for complete working examples.\n\n### Prometheus Metrics\n\nEnable Prometheus ServiceMonitor for metrics collection (requires Prometheus Operator):\n\n```typescript\nnew Plone(chart, 'my-plone', {\n backend: {\n servicemonitor: true,\n metricsPath: '/metrics', // optional, defaults to '/metrics'\n },\n frontend: {\n servicemonitor: true,\n metricsPort: 9090, // optional, defaults to service port\n },\n});\n```\n\n**Note:** You must instrument your Plone backend/frontend to expose metrics at the configured endpoint. For Volto/Node.js frontends, consider using [prom-client](https://www.npmjs.com/package/prom-client) or [express-prometheus-middleware](https://www.npmjs.com/package/express-prometheus-middleware).\n\n## Requirements\n- **kubectl** - [Install kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl)\n- **Node.js 16+** (for TypeScript/JavaScript) - [Install Node.js](https://nodejs.org/)\n- **Python 3.8+** (for Python) - [Install Python](https://www.python.org/)\n- **Kubernetes cluster** (local or cloud)\n\nFor detailed setup instructions, see [Setup Prerequisites](https://bluedynamics.github.io/cdk8s-plone/how-to/setup-prerequisites.html).\n\n## Development\n\nThis project uses [Projen](https://projen.io/) for project management.\n\n```bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Build\nnpm run build\n\n# Update project configuration\n# Edit .projenrc.ts, then run:\nnpx projen\n```\n\nFor detailed development instructions, see [CONTRIBUTING.md](./CONTRIBUTING.md) (if available).\n\n## Resources\n\n- [CDK8S Documentation](https://cdk8s.io/)\n- [Plone CMS](https://plone.org/)\n- [kube-httpcache](https://github.com/mittwald/kube-httpcache) (for HTTP caching)\n- [Example Project](https://github.com/bluedynamics/cdk8s-plone-example)\n\n## License\n\n[Apache 2.0](LICENSE)\n\n## Maintainers\n\nMaintained by [Blue Dynamics Alliance](https://github.com/bluedynamics)\n\n**Author:** Jens W. Klein (jk@kleinundpartner.at)\n"
112
112
  },
113
113
  "repository": {
114
114
  "type": "git",
@@ -141,7 +141,7 @@
141
141
  },
142
142
  "locationInModule": {
143
143
  "filename": "src/plone.ts",
144
- "line": 293
144
+ "line": 316
145
145
  },
146
146
  "parameters": [
147
147
  {
@@ -168,7 +168,7 @@
168
168
  "kind": "class",
169
169
  "locationInModule": {
170
170
  "filename": "src/plone.ts",
171
- "line": 270
171
+ "line": 293
172
172
  },
173
173
  "name": "Plone",
174
174
  "properties": [
@@ -181,7 +181,7 @@
181
181
  "immutable": true,
182
182
  "locationInModule": {
183
183
  "filename": "src/plone.ts",
184
- "line": 275
184
+ "line": 298
185
185
  },
186
186
  "name": "backendServiceName",
187
187
  "type": {
@@ -196,7 +196,7 @@
196
196
  "immutable": true,
197
197
  "locationInModule": {
198
198
  "filename": "src/plone.ts",
199
- "line": 291
199
+ "line": 314
200
200
  },
201
201
  "name": "siteId",
202
202
  "type": {
@@ -211,7 +211,7 @@
211
211
  "immutable": true,
212
212
  "locationInModule": {
213
213
  "filename": "src/plone.ts",
214
- "line": 286
214
+ "line": 309
215
215
  },
216
216
  "name": "variant",
217
217
  "type": {
@@ -227,7 +227,7 @@
227
227
  "immutable": true,
228
228
  "locationInModule": {
229
229
  "filename": "src/plone.ts",
230
- "line": 281
230
+ "line": 304
231
231
  },
232
232
  "name": "frontendServiceName",
233
233
  "optional": true,
@@ -250,7 +250,7 @@
250
250
  "kind": "interface",
251
251
  "locationInModule": {
252
252
  "filename": "src/plone.ts",
253
- "line": 14
253
+ "line": 15
254
254
  },
255
255
  "name": "PloneBaseOptions",
256
256
  "properties": [
@@ -265,7 +265,7 @@
265
265
  "immutable": true,
266
266
  "locationInModule": {
267
267
  "filename": "src/plone.ts",
268
- "line": 165
268
+ "line": 166
269
269
  },
270
270
  "name": "annotations",
271
271
  "optional": true,
@@ -289,7 +289,7 @@
289
289
  "immutable": true,
290
290
  "locationInModule": {
291
291
  "filename": "src/plone.ts",
292
- "line": 83
292
+ "line": 84
293
293
  },
294
294
  "name": "environment",
295
295
  "optional": true,
@@ -308,7 +308,7 @@
308
308
  "immutable": true,
309
309
  "locationInModule": {
310
310
  "filename": "src/plone.ts",
311
- "line": 20
311
+ "line": 21
312
312
  },
313
313
  "name": "image",
314
314
  "optional": true,
@@ -326,7 +326,7 @@
326
326
  "immutable": true,
327
327
  "locationInModule": {
328
328
  "filename": "src/plone.ts",
329
- "line": 26
329
+ "line": 27
330
330
  },
331
331
  "name": "imagePullPolicy",
332
332
  "optional": true,
@@ -345,7 +345,7 @@
345
345
  "immutable": true,
346
346
  "locationInModule": {
347
347
  "filename": "src/plone.ts",
348
- "line": 55
348
+ "line": 56
349
349
  },
350
350
  "name": "limitCpu",
351
351
  "optional": true,
@@ -364,7 +364,7 @@
364
364
  "immutable": true,
365
365
  "locationInModule": {
366
366
  "filename": "src/plone.ts",
367
- "line": 62
367
+ "line": 63
368
368
  },
369
369
  "name": "limitMemory",
370
370
  "optional": true,
@@ -383,7 +383,7 @@
383
383
  "immutable": true,
384
384
  "locationInModule": {
385
385
  "filename": "src/plone.ts",
386
- "line": 128
386
+ "line": 129
387
387
  },
388
388
  "name": "livenessEnabled",
389
389
  "optional": true,
@@ -401,7 +401,7 @@
401
401
  "immutable": true,
402
402
  "locationInModule": {
403
403
  "filename": "src/plone.ts",
404
- "line": 158
404
+ "line": 159
405
405
  },
406
406
  "name": "livenessFailureThreshold",
407
407
  "optional": true,
@@ -419,7 +419,7 @@
419
419
  "immutable": true,
420
420
  "locationInModule": {
421
421
  "filename": "src/plone.ts",
422
- "line": 134
422
+ "line": 135
423
423
  },
424
424
  "name": "livenessInitialDelaySeconds",
425
425
  "optional": true,
@@ -437,7 +437,7 @@
437
437
  "immutable": true,
438
438
  "locationInModule": {
439
439
  "filename": "src/plone.ts",
440
- "line": 146
440
+ "line": 147
441
441
  },
442
442
  "name": "livenessPeriodSeconds",
443
443
  "optional": true,
@@ -455,7 +455,7 @@
455
455
  "immutable": true,
456
456
  "locationInModule": {
457
457
  "filename": "src/plone.ts",
458
- "line": 152
458
+ "line": 153
459
459
  },
460
460
  "name": "livenessSuccessThreshold",
461
461
  "optional": true,
@@ -473,7 +473,7 @@
473
473
  "immutable": true,
474
474
  "locationInModule": {
475
475
  "filename": "src/plone.ts",
476
- "line": 140
476
+ "line": 141
477
477
  },
478
478
  "name": "livenessTimeoutSeconds",
479
479
  "optional": true,
@@ -492,7 +492,7 @@
492
492
  "immutable": true,
493
493
  "locationInModule": {
494
494
  "filename": "src/plone.ts",
495
- "line": 40
495
+ "line": 41
496
496
  },
497
497
  "name": "maxUnavailable",
498
498
  "optional": true,
@@ -509,6 +509,53 @@
509
509
  }
510
510
  }
511
511
  },
512
+ {
513
+ "abstract": true,
514
+ "docs": {
515
+ "default": "'/metrics'",
516
+ "remarks": "Only used when servicemonitor is enabled.",
517
+ "stability": "stable",
518
+ "summary": "Path to scrape metrics from."
519
+ },
520
+ "immutable": true,
521
+ "locationInModule": {
522
+ "filename": "src/plone.ts",
523
+ "line": 204
524
+ },
525
+ "name": "metricsPath",
526
+ "optional": true,
527
+ "type": {
528
+ "primitive": "string"
529
+ }
530
+ },
531
+ {
532
+ "abstract": true,
533
+ "docs": {
534
+ "default": "- uses the main service port",
535
+ "remarks": "Only used when servicemonitor is enabled.",
536
+ "stability": "stable",
537
+ "summary": "Port name or number to scrape metrics from."
538
+ },
539
+ "immutable": true,
540
+ "locationInModule": {
541
+ "filename": "src/plone.ts",
542
+ "line": 197
543
+ },
544
+ "name": "metricsPort",
545
+ "optional": true,
546
+ "type": {
547
+ "union": {
548
+ "types": [
549
+ {
550
+ "primitive": "string"
551
+ },
552
+ {
553
+ "primitive": "number"
554
+ }
555
+ ]
556
+ }
557
+ }
558
+ },
512
559
  {
513
560
  "abstract": true,
514
561
  "docs": {
@@ -520,7 +567,7 @@
520
567
  "immutable": true,
521
568
  "locationInModule": {
522
569
  "filename": "src/plone.ts",
523
- "line": 48
570
+ "line": 49
524
571
  },
525
572
  "name": "minAvailable",
526
573
  "optional": true,
@@ -549,7 +596,7 @@
549
596
  "immutable": true,
550
597
  "locationInModule": {
551
598
  "filename": "src/plone.ts",
552
- "line": 173
599
+ "line": 174
553
600
  },
554
601
  "name": "podAnnotations",
555
602
  "optional": true,
@@ -573,7 +620,7 @@
573
620
  "immutable": true,
574
621
  "locationInModule": {
575
622
  "filename": "src/plone.ts",
576
- "line": 90
623
+ "line": 91
577
624
  },
578
625
  "name": "readinessEnabled",
579
626
  "optional": true,
@@ -591,7 +638,7 @@
591
638
  "immutable": true,
592
639
  "locationInModule": {
593
640
  "filename": "src/plone.ts",
594
- "line": 120
641
+ "line": 121
595
642
  },
596
643
  "name": "readinessFailureThreshold",
597
644
  "optional": true,
@@ -609,7 +656,7 @@
609
656
  "immutable": true,
610
657
  "locationInModule": {
611
658
  "filename": "src/plone.ts",
612
- "line": 96
659
+ "line": 97
613
660
  },
614
661
  "name": "readinessInitialDelaySeconds",
615
662
  "optional": true,
@@ -627,7 +674,7 @@
627
674
  "immutable": true,
628
675
  "locationInModule": {
629
676
  "filename": "src/plone.ts",
630
- "line": 108
677
+ "line": 109
631
678
  },
632
679
  "name": "readinessPeriodSeconds",
633
680
  "optional": true,
@@ -645,7 +692,7 @@
645
692
  "immutable": true,
646
693
  "locationInModule": {
647
694
  "filename": "src/plone.ts",
648
- "line": 114
695
+ "line": 115
649
696
  },
650
697
  "name": "readinessSuccessThreshold",
651
698
  "optional": true,
@@ -663,7 +710,7 @@
663
710
  "immutable": true,
664
711
  "locationInModule": {
665
712
  "filename": "src/plone.ts",
666
- "line": 102
713
+ "line": 103
667
714
  },
668
715
  "name": "readinessTimeoutSeconds",
669
716
  "optional": true,
@@ -681,7 +728,7 @@
681
728
  "immutable": true,
682
729
  "locationInModule": {
683
730
  "filename": "src/plone.ts",
684
- "line": 32
731
+ "line": 33
685
732
  },
686
733
  "name": "replicas",
687
734
  "optional": true,
@@ -700,7 +747,7 @@
700
747
  "immutable": true,
701
748
  "locationInModule": {
702
749
  "filename": "src/plone.ts",
703
- "line": 69
750
+ "line": 70
704
751
  },
705
752
  "name": "requestCpu",
706
753
  "optional": true,
@@ -719,7 +766,7 @@
719
766
  "immutable": true,
720
767
  "locationInModule": {
721
768
  "filename": "src/plone.ts",
722
- "line": 76
769
+ "line": 77
723
770
  },
724
771
  "name": "requestMemory",
725
772
  "optional": true,
@@ -739,7 +786,7 @@
739
786
  "immutable": true,
740
787
  "locationInModule": {
741
788
  "filename": "src/plone.ts",
742
- "line": 181
789
+ "line": 182
743
790
  },
744
791
  "name": "serviceAnnotations",
745
792
  "optional": true,
@@ -751,6 +798,25 @@
751
798
  "kind": "map"
752
799
  }
753
800
  }
801
+ },
802
+ {
803
+ "abstract": true,
804
+ "docs": {
805
+ "default": "false",
806
+ "remarks": "Requires Prometheus Operator to be installed in the cluster.\nWhen enabled, a ServiceMonitor resource will be created to scrape metrics.",
807
+ "stability": "stable",
808
+ "summary": "Enable Prometheus ServiceMonitor for metrics collection."
809
+ },
810
+ "immutable": true,
811
+ "locationInModule": {
812
+ "filename": "src/plone.ts",
813
+ "line": 190
814
+ },
815
+ "name": "servicemonitor",
816
+ "optional": true,
817
+ "type": {
818
+ "primitive": "boolean"
819
+ }
754
820
  }
755
821
  ],
756
822
  "symbolId": "src/plone:PloneBaseOptions"
@@ -1089,7 +1155,7 @@
1089
1155
  "kind": "interface",
1090
1156
  "locationInModule": {
1091
1157
  "filename": "src/plone.ts",
1092
- "line": 203
1158
+ "line": 226
1093
1159
  },
1094
1160
  "name": "PloneOptions",
1095
1161
  "properties": [
@@ -1103,7 +1169,7 @@
1103
1169
  "immutable": true,
1104
1170
  "locationInModule": {
1105
1171
  "filename": "src/plone.ts",
1106
- "line": 228
1172
+ "line": 251
1107
1173
  },
1108
1174
  "name": "backend",
1109
1175
  "optional": true,
@@ -1122,7 +1188,7 @@
1122
1188
  "immutable": true,
1123
1189
  "locationInModule": {
1124
1190
  "filename": "src/plone.ts",
1125
- "line": 235
1191
+ "line": 258
1126
1192
  },
1127
1193
  "name": "frontend",
1128
1194
  "optional": true,
@@ -1142,7 +1208,7 @@
1142
1208
  "immutable": true,
1143
1209
  "locationInModule": {
1144
1210
  "filename": "src/plone.ts",
1145
- "line": 243
1211
+ "line": 266
1146
1212
  },
1147
1213
  "name": "imagePullSecrets",
1148
1214
  "optional": true,
@@ -1166,7 +1232,7 @@
1166
1232
  "immutable": true,
1167
1233
  "locationInModule": {
1168
1234
  "filename": "src/plone.ts",
1169
- "line": 216
1235
+ "line": 239
1170
1236
  },
1171
1237
  "name": "siteId",
1172
1238
  "optional": true,
@@ -1184,7 +1250,7 @@
1184
1250
  "immutable": true,
1185
1251
  "locationInModule": {
1186
1252
  "filename": "src/plone.ts",
1187
- "line": 222
1253
+ "line": 245
1188
1254
  },
1189
1255
  "name": "variant",
1190
1256
  "optional": true,
@@ -1203,7 +1269,7 @@
1203
1269
  "immutable": true,
1204
1270
  "locationInModule": {
1205
1271
  "filename": "src/plone.ts",
1206
- "line": 209
1272
+ "line": 232
1207
1273
  },
1208
1274
  "name": "version",
1209
1275
  "optional": true,
@@ -1224,7 +1290,7 @@
1224
1290
  "kind": "enum",
1225
1291
  "locationInModule": {
1226
1292
  "filename": "src/plone.ts",
1227
- "line": 186
1293
+ "line": 209
1228
1294
  },
1229
1295
  "members": [
1230
1296
  {
@@ -1248,6 +1314,6 @@
1248
1314
  "symbolId": "src/plone:PloneVariant"
1249
1315
  }
1250
1316
  },
1251
- "version": "0.1.6",
1252
- "fingerprint": "depZZYpzfH8bEtxQEeVuqwlkPEPyCD3pZVw9TOCbtE8="
1317
+ "version": "0.1.8",
1318
+ "fingerprint": "uNqTNc9Oa1wJjeUguh0Z23FKpYSUOuD7GWhzS9xXrh8="
1253
1319
  }
package/API.md CHANGED
@@ -379,6 +379,8 @@ const ploneBaseOptions: PloneBaseOptions = { ... }
379
379
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.livenessSuccessThreshold">livenessSuccessThreshold</a></code> | <code>number</code> | Minimum consecutive successes for the liveness probe to be considered successful. |
380
380
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.livenessTimeoutSeconds">livenessTimeoutSeconds</a></code> | <code>number</code> | Number of seconds after which the liveness probe times out. |
381
381
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.maxUnavailable">maxUnavailable</a></code> | <code>string \| number</code> | Maximum number of pods that can be unavailable during updates. |
382
+ | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.metricsPath">metricsPath</a></code> | <code>string</code> | Path to scrape metrics from. |
383
+ | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.metricsPort">metricsPort</a></code> | <code>string \| number</code> | Port name or number to scrape metrics from. |
382
384
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.minAvailable">minAvailable</a></code> | <code>string \| number</code> | Minimum number of pods that must be available during updates. |
383
385
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.podAnnotations">podAnnotations</a></code> | <code>{[ key: string ]: string}</code> | Annotations to add to the Pod template metadata. |
384
386
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.readinessEnabled">readinessEnabled</a></code> | <code>boolean</code> | Enable readiness probe for the container. |
@@ -391,6 +393,7 @@ const ploneBaseOptions: PloneBaseOptions = { ... }
391
393
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.requestCpu">requestCpu</a></code> | <code>string</code> | CPU request for the container. |
392
394
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.requestMemory">requestMemory</a></code> | <code>string</code> | Memory request for the container. |
393
395
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.serviceAnnotations">serviceAnnotations</a></code> | <code>{[ key: string ]: string}</code> | Annotations to add to the Service metadata. |
396
+ | <code><a href="#@bluedynamics/cdk8s-plone.PloneBaseOptions.property.servicemonitor">servicemonitor</a></code> | <code>boolean</code> | Enable Prometheus ServiceMonitor for metrics collection. |
394
397
 
395
398
  ---
396
399
 
@@ -599,6 +602,36 @@ Used in PodDisruptionBudget if specified.
599
602
 
600
603
  ---
601
604
 
605
+ ##### `metricsPath`<sup>Optional</sup> <a name="metricsPath" id="@bluedynamics/cdk8s-plone.PloneBaseOptions.property.metricsPath"></a>
606
+
607
+ ```typescript
608
+ public readonly metricsPath: string;
609
+ ```
610
+
611
+ - *Type:* string
612
+ - *Default:* '/metrics'
613
+
614
+ Path to scrape metrics from.
615
+
616
+ Only used when servicemonitor is enabled.
617
+
618
+ ---
619
+
620
+ ##### `metricsPort`<sup>Optional</sup> <a name="metricsPort" id="@bluedynamics/cdk8s-plone.PloneBaseOptions.property.metricsPort"></a>
621
+
622
+ ```typescript
623
+ public readonly metricsPort: string | number;
624
+ ```
625
+
626
+ - *Type:* string | number
627
+ - *Default:* uses the main service port
628
+
629
+ Port name or number to scrape metrics from.
630
+
631
+ Only used when servicemonitor is enabled.
632
+
633
+ ---
634
+
602
635
  ##### `minAvailable`<sup>Optional</sup> <a name="minAvailable" id="@bluedynamics/cdk8s-plone.PloneBaseOptions.property.minAvailable"></a>
603
636
 
604
637
  ```typescript
@@ -792,6 +825,22 @@ Common for external-dns, load balancers, service mesh, etc.
792
825
  ```
793
826
 
794
827
 
828
+ ##### `servicemonitor`<sup>Optional</sup> <a name="servicemonitor" id="@bluedynamics/cdk8s-plone.PloneBaseOptions.property.servicemonitor"></a>
829
+
830
+ ```typescript
831
+ public readonly servicemonitor: boolean;
832
+ ```
833
+
834
+ - *Type:* boolean
835
+ - *Default:* false
836
+
837
+ Enable Prometheus ServiceMonitor for metrics collection.
838
+
839
+ Requires Prometheus Operator to be installed in the cluster.
840
+ When enabled, a ServiceMonitor resource will be created to scrape metrics.
841
+
842
+ ---
843
+
795
844
  ### PloneHttpcacheOptions <a name="PloneHttpcacheOptions" id="@bluedynamics/cdk8s-plone.PloneHttpcacheOptions"></a>
796
845
 
797
846
  Configuration options for PloneHttpcache (Varnish caching layer).
package/README.md CHANGED
@@ -75,8 +75,26 @@ kubectl apply -f dist/
75
75
 
76
76
  See the [cdk8s-plone-example](https://github.com/bluedynamics/cdk8s-plone-example) repository for complete working examples.
77
77
 
78
- ## Requirements
78
+ ### Prometheus Metrics
79
+
80
+ Enable Prometheus ServiceMonitor for metrics collection (requires Prometheus Operator):
79
81
 
82
+ ```typescript
83
+ new Plone(chart, 'my-plone', {
84
+ backend: {
85
+ servicemonitor: true,
86
+ metricsPath: '/metrics', // optional, defaults to '/metrics'
87
+ },
88
+ frontend: {
89
+ servicemonitor: true,
90
+ metricsPort: 9090, // optional, defaults to service port
91
+ },
92
+ });
93
+ ```
94
+
95
+ **Note:** You must instrument your Plone backend/frontend to expose metrics at the configured endpoint. For Volto/Node.js frontends, consider using [prom-client](https://www.npmjs.com/package/prom-client) or [express-prometheus-middleware](https://www.npmjs.com/package/express-prometheus-middleware).
96
+
97
+ ## Requirements
80
98
  - **kubectl** - [Install kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl)
81
99
  - **Node.js 16+** (for TypeScript/JavaScript) - [Install Node.js](https://nodejs.org/)
82
100
  - **Python 3.8+** (for Python) - [Install Python](https://www.python.org/)
package/lib/httpcache.js CHANGED
@@ -113,5 +113,5 @@ class PloneHttpcache extends constructs_1.Construct {
113
113
  }
114
114
  exports.PloneHttpcache = PloneHttpcache;
115
115
  _a = JSII_RTTI_SYMBOL_1;
116
- PloneHttpcache[_a] = { fqn: "@bluedynamics/cdk8s-plone.PloneHttpcache", version: "0.1.6" };
116
+ PloneHttpcache[_a] = { fqn: "@bluedynamics/cdk8s-plone.PloneHttpcache", version: "0.1.8" };
117
117
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cGNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2h0dHBjYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsaUNBQTZCO0FBQzdCLDJDQUF1QztBQTZGdkM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFPM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxPQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksVUFBa0IsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBZSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDbkMsQ0FBQztZQUNELFVBQVUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUM1Qyx1REFBdUQ7WUFDdkQsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxLQUFLLEVBQUUsZ0JBQWdCO1lBQ3ZCLE9BQU8sRUFBRSxPQUFPLENBQUMsWUFBWTtZQUM3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aW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEhlbG0gfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFBsb25lIH0gZnJvbSAnLi9wbG9uZSc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBQbG9uZUh0dHBjYWNoZSAoVmFybmlzaCBjYWNoaW5nIGxheWVyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbG9uZUh0dHBjYWNoZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIFBsb25lIGNvbnN0cnVjdCB0byBhdHRhY2ggdGhlIEhUVFAgY2FjaGUgdG8uXG4gICAqIFRoZSBjYWNoZSB3aWxsIGF1dG9tYXRpY2FsbHkgY29ubmVjdCB0byB0aGUgYmFja2VuZCBhbmQgZnJvbnRlbmQgc2VydmljZXMuXG4gICAqL1xuICByZWFkb25seSBwbG9uZTogUGxvbmU7XG5cbiAgLyoqXG4gICAqIFZhcm5pc2ggVkNMIGNvbmZpZ3VyYXRpb24gYXMgYSBzdHJpbmcuXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB2YXJuaXNoVmNsRmlsZS5cbiAgICogQGRlZmF1bHQgLSBsb2FkZWQgZnJvbSB2YXJuaXNoVmNsRmlsZSBvciBkZWZhdWx0IGNvbmZpZyBmaWxlXG4gICAqL1xuICByZWFkb25seSB2YXJuaXNoVmNsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGEgVmFybmlzaCBWQ0wgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgdGhlIGRlZmF1bHQgVkNMIGZpbGUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkuXG4gICAqIEBkZWZhdWx0IC0gdXNlcyBkZWZhdWx0IGNvbmZpZy92YXJuaXNoLnRwbC52Y2xcbiAgICovXG4gIHJlYWRvbmx5IHZhcm5pc2hWY2xGaWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIGFuIGV4aXN0aW5nIEt1YmVybmV0ZXMgc2VjcmV0IGNvbnRhaW5pbmcgVmFybmlzaCBhZG1pbiBjcmVkZW50aWFscy5cbiAgICogVGhlIHNlY3JldCBzaG91bGQgYmUgY3JlYXRlZCBzZXBhcmF0ZWx5IGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgKG5vIGV4aXN0aW5nIHNlY3JldClcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDUFUgbGltaXQgZm9yIFZhcm5pc2ggcG9kcy5cbiAgICogQGRlZmF1bHQgJzUwMG0nXG4gICAqL1xuICByZWFkb25seSBsaW1pdENwdT86IHN0cmluZztcblxuICAvKipcbiAgICogTWVtb3J5IGxpbWl0IGZvciBWYXJuaXNoIHBvZHMuXG4gICAqIEBkZWZhdWx0ICc1MDBNaSdcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0TWVtb3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDUFUgcmVxdWVzdCBmb3IgVmFybmlzaCBwb2RzLlxuICAgKiBAZGVmYXVsdCAnMTAwbSdcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RDcHU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lbW9yeSByZXF1ZXN0IGZvciBWYXJuaXNoIHBvZHMuXG4gICAqIEBkZWZhdWx0ICcxMDBNaSdcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RNZW1vcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBQcm9tZXRoZXVzIFNlcnZpY2VNb25pdG9yIGZvciBtZXRyaWNzIGNvbGxlY3Rpb24uXG4gICAqIFJlcXVpcmVzIFByb21ldGhldXMgT3BlcmF0b3IgdG8gYmUgaW5zdGFsbGVkIGluIHRoZSBjbHVzdGVyLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZW1vbml0b3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIFByb21ldGhldXMgZXhwb3J0ZXIgZm9yIFZhcm5pc2ggbWV0cmljcy5cbiAgICogV2hlbiBlbmFibGVkLCB0aGUgZXhwb3J0ZXIgc2lkZWNhciBjb250YWluZXIgd2lsbCBiZSBkZXBsb3llZCBhbG9uZ3NpZGUgVmFybmlzaC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwb3J0ZXJFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUga3ViZS1odHRwY2FjaGUgSGVsbSBjaGFydCB0byB1c2UuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZSByZXBvc2l0b3J5IHdpbGwgYmUgdXNlZC5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIChsYXRlc3QpXG4gICAqL1xuICByZWFkb25seSBjaGFydFZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIGt1YmUtaHR0cGNhY2hlIENvbnRhaW5lciBJbWFnZSB0byB1c2UuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZSByZXBvc2l0b3J5IHdpbGwgYmUgdXNlZC5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIChjaGFydFZlcnNpb24gPSB3aXRoIGVhY2ggY2hhcnQgcmVsZWFzZSB0aGVyZSBpcyBhbiBpbWFnZSByZWxlYXNlIHRvbyApXG4gICAqL1xuICByZWFkb25seSBhcHBWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgVmFybmlzaCBwb2QgcmVwbGljYXMgdG8gcnVuLlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQbG9uZUh0dHBjYWNoZSBjb25zdHJ1Y3QgZm9yIGRlcGxveWluZyBWYXJuaXNoIEhUVFAgY2FjaGluZyBsYXllci5cbiAqXG4gKiBVc2VzIHRoZSBtaXR0d2FsZC9rdWJlLWh0dHBjYWNoZSBIZWxtIGNoYXJ0IHRvIGRlcGxveSBWYXJuaXNoIGFzIGFcbiAqIGNhY2hpbmcgcHJveHkgaW4gZnJvbnQgb2YgUGxvbmUgYmFja2VuZCBhbmQvb3IgZnJvbnRlbmQgc2VydmljZXMuXG4gKlxuICogVGhlIGNhY2hlIGF1dG9tYXRpY2FsbHkgY29ubmVjdHMgdG8gdGhlIFBsb25lIHNlcnZpY2VzIGFuZCBwcm92aWRlc1xuICogSFRUUCBjYWNoZSBpbnZhbGlkYXRpb24gY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBwbG9uZSA9IG5ldyBQbG9uZShjaGFydCwgJ3Bsb25lJyk7XG4gKiBjb25zdCBjYWNoZSA9IG5ldyBQbG9uZUh0dHBjYWNoZShjaGFydCwgJ2NhY2hlJywge1xuICogICBwbG9uZTogcGxvbmUsXG4gKiAgIGV4aXN0aW5nU2VjcmV0OiAndmFybmlzaC1zZWNyZXQnLFxuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBQbG9uZUh0dHBjYWNoZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBWYXJuaXNoIHNlcnZpY2UgY3JlYXRlZCBieSB0aGUgSGVsbSBjaGFydC5cbiAgICogVXNlIHRoaXMgdG8gcmVmZXJlbmNlIHRoZSBjYWNoZSBzZXJ2aWNlIGZyb20gaW5ncmVzcyBvciBvdGhlciBjb25zdHJ1Y3RzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGh0dHBjYWNoZVNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgb3B0aW9uczogUGxvbmVIdHRwY2FjaGVPcHRpb25zKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBsZXQgdmFybmlzaFZjbDogc3RyaW5nO1xuICAgIGlmICghb3B0aW9ucy52YXJuaXNoVmNsKSB7XG4gICAgICBsZXQgdmNsUGF0aDogc3RyaW5nO1xuICAgICAgaWYgKCFvcHRpb25zLnZhcm5pc2hWY2xGaWxlKSB7XG4gICAgICAgIHZjbFBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnY29uZmlnJywgJ3Zhcm5pc2gudHBsLnZjbCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmNsUGF0aCA9IG9wdGlvbnMudmFybmlzaFZjbEZpbGU7XG4gICAgICB9XG4gICAgICB2YXJuaXNoVmNsID0gZnMucmVhZEZpbGVTeW5jKHZjbFBhdGgsICd1dGY4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhcm5pc2hWY2wgPSBvcHRpb25zLnZhcm5pc2hWY2w7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlVGFnID0gb3B0aW9ucy5hcHBWZXJzaW9uID8/IG9wdGlvbnMuY2hhcnRWZXJzaW9uO1xuICAgIGNvbnN0IGh0dHBjYWNoZSA9IG5ldyBIZWxtKHRoaXMsICdodHRwY2FjaGUnLCB7XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pdHR3YWxkL2t1YmUtaHR0cGNhY2hlL2NoYXJ0XG4gICAgICByZXBvOiAnaHR0cHM6Ly9oZWxtLm1pdHR3YWxkLmRlJyxcbiAgICAgIGNoYXJ0OiAna3ViZS1odHRwY2FjaGUnLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy5jaGFydFZlcnNpb24sXG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgcmVwbGljYUNvdW50OiBvcHRpb25zLnJlcGxpY2FzID8/IDIsXG4gICAgICAgIC4uLihpbWFnZVRhZyAmJiB7IGltYWdlOiB7IHRhZzogaW1hZ2VUYWcgfSB9KSxcbiAgICAgICAgY2FjaGU6IHtcbiAgICAgICAgICAvLyBuZWVkIHRvIGxvb2tzIGF0IHRoZSBmcm9udGVuZFdhdGNoLCBkbyB3ZSBuZWVkIGl0P1xuICAgICAgICAgIGZyb250ZW5kV2F0Y2g6IGZhbHNlLFxuICAgICAgICAgIGJhY2tlbmRXYXRjaDogZmFsc2UsXG4gICAgICAgICAgZXhpc3RpbmdTZWNyZXQ6IG9wdGlvbnMuZXhpc3RpbmdTZWNyZXQgPz8gdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICB2Y2xUZW1wbGF0ZTogdmFybmlzaFZjbCxcbiAgICAgICAgZXh0cmFFbnZWYXJzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnQkFDS0VORF9TRVJWSUNFX05BTUUnLCB2YWx1ZTogb3B0aW9ucy5wbG9uZS5iYWNrZW5kU2VydmljZU5hbWUgfSxcbiAgICAgICAgICB7IG5hbWU6ICdCQUNLRU5EX1NFUlZJQ0VfUE9SVCcsIHZhbHVlOiAnODA4MCcgfSxcbiAgICAgICAgICB7IG5hbWU6ICdCQUNLRU5EX1NJVEVfSUQnLCB2YWx1ZTogb3B0aW9ucy5wbG9uZS5zaXRlSWQgfSxcbiAgICAgICAgICB7IG5hbWU6ICdGUk9OVEVORF9TRVJWSUNFX05BTUUnLCB2YWx1ZTogb3B0aW9ucy5wbG9uZS5mcm9udGVuZFNlcnZpY2VOYW1lIH0sXG4gICAgICAgICAgeyBuYW1lOiAnRlJPTlRFTkRfU0VSVklDRV9QT1JUJywgdmFsdWU6ICczMDAwJyB9LFxuICAgICAgICBdLFxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pdHR3YWxkL2t1YmUtaHR0cGNhY2hlL2lzc3Vlcy8yNTNcbiAgICAgICAgbm9kZVNlbGVjdG9yOiB7XG4gICAgICAgICAgJ2t1YmVybmV0ZXMuaW8vYXJjaCc6ICdhbWQ2NCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc291cmNlczoge1xuICAgICAgICAgIGxpbWl0czoge1xuICAgICAgICAgICAgY3B1OiBvcHRpb25zLmxpbWl0Q3B1IHx8ICc1MDBtJyxcbiAgICAgICAgICAgIG1lbW9yeTogb3B0aW9ucy5saW1pdE1lbW9yeSB8fCAnNTAwTWknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdHM6IHtcbiAgICAgICAgICAgIGNwdTogb3B0aW9ucy5yZXF1ZXN0Q3B1IHx8ICcxMDBtJyxcbiAgICAgICAgICAgIG1lbW9yeTogb3B0aW9ucy5yZXF1ZXN0TWVtb3J5IHx8ICcxMDBNaScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmJhYzoge1xuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBleHBvcnRlcjoge1xuICAgICAgICAgIGVuYWJsZWQ6IG9wdGlvbnMuZXhwb3J0ZXJFbmFibGVkID8/IHRydWUsXG4gICAgICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgICAgICBsaW1pdHM6IHtcbiAgICAgICAgICAgICAgY3B1OiAnMTAwbScsXG4gICAgICAgICAgICAgIG1lbW9yeTogJzEwME1pJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0czoge1xuICAgICAgICAgICAgICBjcHU6ICcxMG0nLFxuICAgICAgICAgICAgICBtZW1vcnk6ICc1ME1pJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VydmljZU1vbml0b3I6IHtcbiAgICAgICAgICBlbmFibGVkOiBvcHRpb25zLnNlcnZpY2Vtb25pdG9yIHx8IGZhbHNlLFxuICAgICAgICAgIHNjcmFwZVNpZ25hbGxlcjogb3B0aW9ucy5zZXJ2aWNlbW9uaXRvciB8fCBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgaHR0cGNhY2hlU2VydmljZSA9IGh0dHBjYWNoZS5hcGlPYmplY3RzLmZpbmQoKGNvbnN0cnVjdCkgPT4ge1xuICAgICAgaWYgKChjb25zdHJ1Y3Qua2luZCA9PT0gJ1NlcnZpY2UnKSAmJiAoY29uc3RydWN0Lm1ldGFkYXRhLm5hbWU/LmVuZHNXaXRoKCdrdWJlLWh0dHBjYWNoZScpKSkge1xuICAgICAgICByZXR1cm4gY29uc3RydWN0Lm5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGlmIChodHRwY2FjaGVTZXJ2aWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgaHR0cGNhY2hlIHNlcnZpY2UnKTtcbiAgICB9XG4gICAgdGhpcy5odHRwY2FjaGVTZXJ2aWNlTmFtZSA9IGh0dHBjYWNoZVNlcnZpY2UubmFtZTtcbiAgfVxufSJdfQ==