@bluedynamics/cdk8s-plone 0.1.35 → 0.1.37

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.
@@ -1,4 +1,13 @@
1
- # API Reference
1
+ ---
2
+ myst:
3
+ html_meta:
4
+ "description": "Auto-generated API reference for cdk8s-plone constructs, interfaces, and enums."
5
+ "property=og:description": "Auto-generated API reference for cdk8s-plone constructs, interfaces, and enums."
6
+ "property=og:title": "API reference"
7
+ "keywords": "Plone, cdk8s, Kubernetes, API, reference, TypeScript, Python"
8
+ ---
9
+
10
+ # API reference
2
11
 
3
12
  Complete API reference for cdk8s-plone constructs, generated from TypeScript source code.
4
13
 
@@ -9,7 +18,7 @@ The cdk8s-plone library provides the following main constructs:
9
18
  - **Plone**: Main construct for deploying Plone CMS with support for both Volto (React frontend) and Classic UI variants
10
19
  - **PloneHttpcache**: HTTP caching layer using Varnish for improved performance
11
20
 
12
- ## Language Support
21
+ ## Language support
13
22
 
14
23
  This API documentation shows TypeScript usage examples. The library is also available for Python via JSII transpilation:
15
24
 
@@ -1,8 +1,17 @@
1
- # Configuration Options
1
+ ---
2
+ myst:
3
+ html_meta:
4
+ "description": "Complete reference for cdk8s-plone constructs and configuration options: Plone, PloneHttpcache, PloneVinylCache."
5
+ "property=og:description": "Complete reference for cdk8s-plone constructs and configuration options: Plone, PloneHttpcache, PloneVinylCache."
6
+ "property=og:title": "Configuration options"
7
+ "keywords": "Plone, cdk8s, Kubernetes, configuration, reference, Volto, Varnish"
8
+ ---
9
+
10
+ # Configuration options
2
11
 
3
12
  Complete reference for all configuration options in cdk8s-plone.
4
13
 
5
- ## Key Constructs
14
+ ## Key constructs
6
15
 
7
16
  ### `Plone`
8
17
 
@@ -56,7 +65,7 @@ new PloneHttpcache(chart, 'cache', {
56
65
 
57
66
  ---
58
67
 
59
- ## Configuration Interfaces
68
+ ## Configuration interfaces
60
69
 
61
70
  ### `PloneOptions`
62
71
 
@@ -89,14 +98,14 @@ const options: PloneOptions = {
89
98
 
90
99
  Configuration for backend or frontend components.
91
100
 
92
- #### Container Configuration
101
+ #### Container configuration
93
102
 
94
103
  | Property | Type | Required | Default | Description |
95
104
  |----------|------|----------|---------|-------------|
96
- | `image` | `string` | Yes | - | Container image (e.g., 'plone/plone-backend:6.1.3') |
97
- | `imagePullPolicy` | `string` | No | `'IfNotPresent'` | Image pull policy |
105
+ | `image` | `string` | No | `plone/plone-backend:latest` (backend) / `plone/plone-frontend:latest` (frontend) | Container image |
106
+ | `imagePullPolicy` | `string` | No | `IfNotPresent` | Image pull policy |
98
107
  | `replicas` | `number` | No | `2` | Number of pod replicas |
99
- | `environment` | `Env` | No | - | Environment variables (cdk8s-plus-30.Env) |
108
+ | `environment` | `Env` | No | - | Environment variables (cdk8s-plus-30 `Env`) |
100
109
 
101
110
  **Example:**
102
111
  ```typescript
@@ -115,14 +124,14 @@ backend: {
115
124
  }
116
125
  ```
117
126
 
118
- #### Resource Configuration
127
+ #### Resource configuration
119
128
 
120
- | Property | Type | Description |
121
- |----------|------|-------------|
122
- | `requestCpu` | `string` | CPU request (e.g., '500m', '1') |
123
- | `limitCpu` | `string` | CPU limit |
124
- | `requestMemory` | `string` | Memory request (e.g., '512Mi', '1Gi') |
125
- | `limitMemory` | `string` | Memory limit |
129
+ | Property | Type | Default | Description |
130
+ |----------|------|---------|-------------|
131
+ | `requestCpu` | `string` | `200m` | CPU request |
132
+ | `limitCpu` | `string` | `500m` | CPU limit |
133
+ | `requestMemory` | `string` | `256Mi` | Memory request |
134
+ | `limitMemory` | `string` | `512Mi` (backend) / `1Gi` (frontend) | Memory limit |
126
135
 
127
136
  **Example:**
128
137
  ```typescript
@@ -135,12 +144,12 @@ backend: {
135
144
  }
136
145
  ```
137
146
 
138
- #### High Availability
147
+ #### High availability
139
148
 
140
149
  | Property | Type | Description |
141
150
  |----------|------|-------------|
142
- | `minAvailable` | `number` | Minimum pods available during updates (for PodDisruptionBudget) |
143
- | `maxUnavailable` | `number` | Maximum unavailable pods during updates |
151
+ | `minAvailable` | `number \| string` | Minimum pods available during updates (for PodDisruptionBudget). Accepts an absolute number or a percentage string such as `"50%"`. |
152
+ | `maxUnavailable` | `number \| string` | Maximum unavailable pods during updates. Accepts an absolute number or a percentage string such as `"50%"`. |
144
153
 
145
154
  **Example:**
146
155
  ```typescript
@@ -151,16 +160,16 @@ backend: {
151
160
  }
152
161
  ```
153
162
 
154
- #### Readiness Probe
163
+ #### Readiness probe
155
164
 
156
165
  | Property | Type | Default | Description |
157
166
  |----------|------|---------|-------------|
158
167
  | `readinessEnabled` | `boolean` | `true` | Enable readiness probe |
159
- | `readinessInitialDelaySeconds` | `number` | - | Seconds before first probe |
160
- | `readinessTimeoutSeconds` | `number` | - | Probe timeout |
161
- | `readinessPeriodSeconds` | `number` | - | Probe frequency |
162
- | `readinessSuccessThreshold` | `number` | - | Consecutive successes required |
163
- | `readinessFailureThreshold` | `number` | - | Consecutive failures before marking unready |
168
+ | `readinessInitialDelaySeconds` | `number` | `10` | Seconds before first probe |
169
+ | `readinessTimeoutSeconds` | `number` | `15` | Probe timeout |
170
+ | `readinessPeriodSeconds` | `number` | `10` | Probe frequency |
171
+ | `readinessSuccessThreshold` | `number` | `1` | Consecutive successes required |
172
+ | `readinessFailureThreshold` | `number` | `3` | Consecutive failures before marking unready |
164
173
 
165
174
  **Example:**
166
175
  ```typescript
@@ -174,16 +183,16 @@ backend: {
174
183
  }
175
184
  ```
176
185
 
177
- #### Liveness Probe
186
+ #### Liveness probe
178
187
 
179
188
  | Property | Type | Default | Description |
180
189
  |----------|------|---------|-------------|
181
190
  | `livenessEnabled` | `boolean` | `false` | Enable liveness probe (recommended `true` for frontend) |
182
- | `livenessInitialDelaySeconds` | `number` | - | Seconds before first probe |
183
- | `livenessTimeoutSeconds` | `number` | - | Probe timeout |
184
- | `livenessPeriodSeconds` | `number` | - | Probe frequency |
185
- | `livenessSuccessThreshold` | `number` | - | Consecutive successes required |
186
- | `livenessFailureThreshold` | `number` | - | Consecutive failures before restart |
191
+ | `livenessInitialDelaySeconds` | `number` | `30` | Seconds before first probe |
192
+ | `livenessTimeoutSeconds` | `number` | `5` | Probe timeout |
193
+ | `livenessPeriodSeconds` | `number` | `10` | Probe frequency |
194
+ | `livenessSuccessThreshold` | `number` | `1` | Consecutive successes required |
195
+ | `livenessFailureThreshold` | `number` | `3` | Consecutive failures before restart |
187
196
 
188
197
  **Example:**
189
198
  ```typescript
@@ -219,6 +228,94 @@ backend: {
219
228
  }
220
229
  ```
221
230
 
231
+ (monitoring)=
232
+
233
+ #### Prometheus monitoring
234
+
235
+ | Property | Type | Default | Description |
236
+ |----------|------|---------|-------------|
237
+ | `servicemonitor` | `boolean` | `false` | Create a Prometheus `ServiceMonitor` for this component. Requires the Prometheus Operator. |
238
+ | `metricsPort` | `string \| number` | main service port | Service port name or number that exposes metrics. |
239
+ | `metricsPath` | `string` | `/metrics` | HTTP path the Prometheus scraper requests. |
240
+
241
+ You must instrument the backend or frontend container to expose metrics at the configured endpoint.
242
+ For step-by-step setup, see {doc}`/how-to/enable-prometheus-monitoring`.
243
+
244
+ **Example:**
245
+ ```typescript
246
+ backend: {
247
+ image: 'plone/plone-backend:6.1.3',
248
+ servicemonitor: true,
249
+ metricsPath: '/metrics',
250
+ },
251
+ frontend: {
252
+ image: 'plone/plone-frontend:16.0.0',
253
+ servicemonitor: true,
254
+ metricsPort: 9090,
255
+ }
256
+ ```
257
+
258
+ #### Scheduling
259
+
260
+ | Property | Type | Default | Description |
261
+ |----------|------|---------|-------------|
262
+ | `nodeSelector` | `Record<string, string>` | - | Constrain pods to nodes whose labels match all entries. |
263
+
264
+ For tainted nodes and taint-based scheduling, see {doc}`/how-to/schedule-pods`.
265
+
266
+ **Example:**
267
+ ```typescript
268
+ backend: {
269
+ image: 'plone/plone-backend:6.1.3',
270
+ nodeSelector: {
271
+ 'topology.kubernetes.io/region': 'fsn1',
272
+ },
273
+ }
274
+ ```
275
+
276
+ #### Security context
277
+
278
+ | Property | Type | Default | Description |
279
+ |----------|------|---------|-------------|
280
+ | `securityContext` | `PloneSecurityContext` | - | Container security settings (capabilities, UID/GID, read-only root, privilege escalation). |
281
+
282
+ **`PloneSecurityContext` fields:**
283
+
284
+ | Property | Type | Description |
285
+ |----------|------|-------------|
286
+ | `capabilities` | `PloneCapabilities` | Linux capabilities to add or drop. |
287
+ | `runAsUser` | `number` | Run the container as this UID. |
288
+ | `runAsGroup` | `number` | Run the container as this GID. |
289
+ | `runAsNonRoot` | `boolean` | Require the container to run as non-root. |
290
+ | `readOnlyRootFilesystem` | `boolean` | Mount the root filesystem read-only. |
291
+ | `allowPrivilegeEscalation` | `boolean` | Allow the process to gain more privileges than its parent. |
292
+ | `privileged` | `boolean` | Run the container in privileged mode. |
293
+
294
+ **`PloneCapabilities` fields:**
295
+
296
+ | Property | Type | Description |
297
+ |----------|------|-------------|
298
+ | `add` | `string[]` | Capabilities to add (e.g., `'SYS_PTRACE'`). |
299
+ | `drop` | `string[]` | Capabilities to drop (e.g., `'ALL'`). |
300
+
301
+ For a hardening walk-through, see {doc}`/how-to/configure-security-context`.
302
+
303
+ **Example:**
304
+ ```typescript
305
+ backend: {
306
+ image: 'plone/plone-backend:6.1.3',
307
+ securityContext: {
308
+ runAsNonRoot: true,
309
+ runAsUser: 500,
310
+ readOnlyRootFilesystem: true,
311
+ allowPrivilegeEscalation: false,
312
+ capabilities: {
313
+ drop: ['ALL'],
314
+ },
315
+ },
316
+ }
317
+ ```
318
+
222
319
  ---
223
320
 
224
321
  ### `PloneHttpcacheOptions`
@@ -228,18 +325,36 @@ Configuration for the Varnish HTTP cache layer.
228
325
  | Property | Type | Required | Default | Description |
229
326
  |----------|------|----------|---------|-------------|
230
327
  | `plone` | `Plone` | Yes | - | Plone construct to attach cache to |
231
- | `varnishVcl` | `string` | No | - | VCL configuration as string |
232
- | `varnishVclFile` | `string` | No | - | Path to VCL configuration file |
328
+ | `varnishVcl` | `string` | No | - | VCL configuration as string. Takes precedence over `varnishVclFile`. |
329
+ | `varnishVclFile` | `string` | No | built-in `config/varnish.tpl.vcl` | Path to a VCL template file |
233
330
  | `existingSecret` | `string` | No | - | Kubernetes secret for Varnish admin credentials |
234
331
  | `replicas` | `number` | No | `2` | Number of Varnish replicas |
235
- | `requestCpu` | `string` | No | - | CPU request |
236
- | `limitCpu` | `string` | No | - | CPU limit |
237
- | `requestMemory` | `string` | No | - | Memory request |
238
- | `limitMemory` | `string` | No | - | Memory limit |
239
- | `servicemonitor` | `boolean` | No | `false` | Enable Prometheus ServiceMonitor |
332
+ | `requestCpu` | `string` | No | `100m` | CPU request |
333
+ | `limitCpu` | `string` | No | `500m` | CPU limit |
334
+ | `requestMemory` | `string` | No | `100Mi` | Memory request |
335
+ | `limitMemory` | `string` | No | `500Mi` | Memory limit |
336
+ | `servicemonitor` | `boolean` | No | `false` | Enable Prometheus `ServiceMonitor` |
240
337
  | `exporterEnabled` | `boolean` | No | `true` | Enable Prometheus exporter sidecar |
241
- | `chartVersion` | `string` | No | latest | kube-httpcache Helm chart version |
242
- | `extraEnvVars` | `HttpcacheEnvVar[]` | No | - | Additional env vars for kube-httpcache container |
338
+ | `chartVersion` | `string` | No | chart latest | kube-httpcache Helm chart version |
339
+ | `appVersion` | `string` | No | matches `chartVersion` | kube-httpcache container image tag |
340
+ | `extraEnvVars` | `HttpcacheEnvVar[]` | No | - | Additional env vars for the kube-httpcache container |
341
+ | `tolerations` | `HttpcacheToleration[]` | No | - | Pod tolerations for tainted nodes |
342
+
343
+ **`HttpcacheEnvVar` fields:**
344
+
345
+ | Property | Type | Description |
346
+ |----------|------|-------------|
347
+ | `name` | `string` | Environment variable name |
348
+ | `value` | `string` | Environment variable value |
349
+
350
+ **`HttpcacheToleration` fields:**
351
+
352
+ | Property | Type | Default | Description |
353
+ |----------|------|---------|-------------|
354
+ | `key` | `string` | - | Taint key to tolerate |
355
+ | `operator` | `string` | `Equal` | `Equal` or `Exists` |
356
+ | `value` | `string` | - | Taint value (required for `Equal`) |
357
+ | `effect` | `string` | - | `NoSchedule`, `PreferNoSchedule`, or `NoExecute`. Omit to tolerate all effects. |
243
358
 
244
359
  **Example:**
245
360
  ```typescript
@@ -302,18 +417,37 @@ Requires the [cloud-vinyl operator](https://github.com/bluedynamics/cloud-vinyl)
302
417
  | Property | Type | Required | Default | Description |
303
418
  |----------|------|----------|---------|-------------|
304
419
  | `plone` | `Plone` | Yes | - | Plone construct to attach cache to |
420
+ | `image` | `string` | No | `varnish:7.6` | Container image for the Varnish pods |
305
421
  | `replicas` | `number` | No | `2` | Number of Varnish replicas |
306
422
  | `requestCpu` | `string` | No | `100m` | CPU request |
307
423
  | `limitCpu` | `string` | No | `500m` | CPU limit |
308
424
  | `requestMemory` | `string` | No | `256Mi` | Memory request |
309
425
  | `limitMemory` | `string` | No | `512Mi` | Memory limit |
310
426
  | `storage` | `VinylCacheStorage[]` | No | - | Varnish storage backends. If omitted, the operator falls back to the varnishd default (~100 MB malloc), which is almost always too small. |
311
- | `director` | `string` | No | `shard` | Director type: shard, round_robin, random, hash |
312
- | `vclRecvSnippet` | `string` | No | built-in | Custom VCL snippet for vcl_recv |
313
- | `vclBackendResponseSnippet` | `string` | No | built-in | Custom VCL snippet for vcl_backend_response |
427
+ | `extraBackends` | `VinylCacheBackend[]` | No | - | Additional backends appended after the auto-generated Plone backends. |
428
+ | `director` | `string` | No | `shard` | Director type: `shard`, `round_robin`, `random`, `hash` |
429
+ | `shardBy` | `string` | No | operator default (`HASH`) | Shard director: value to hash (`HASH` or `URL`). Requires cloud-vinyl ≥ 0.4.2. |
430
+ | `shardHealthy` | `string` | No | operator default (`CHOSEN`) | Shard director: backend health requirement (`CHOSEN` or `ALL`). Requires cloud-vinyl ≥ 0.4.2. |
431
+ | `shardRampup` | `string` | No | operator default (`30s`) | Shard director: ramp-up window for newly added backends. |
432
+ | `shardReplicas` | `number` | No | operator default (`67`) | Shard director: Ketama replicas per backend. |
433
+ | `vclRecvSnippet` | `string` | No | built-in `plone-vinyl-recv.vcl` | Custom VCL snippet for `vcl_recv` |
434
+ | `vclBackendResponseSnippet` | `string` | No | built-in `plone-vinyl-backend-response.vcl` | Custom VCL snippet for `vcl_backend_response` |
435
+ | `vclDeliverSnippet` | `string` | No | - | Custom VCL snippet for `vcl_deliver` |
436
+ | `vclHitSnippet` | `string` | No | - | Custom VCL snippet for `vcl_hit` |
437
+ | `vclMissSnippet` | `string` | No | - | Custom VCL snippet for `vcl_miss` |
438
+ | `vclPassSnippet` | `string` | No | - | Custom VCL snippet for `vcl_pass` |
439
+ | `vclPipeSnippet` | `string` | No | - | Custom VCL snippet for `vcl_pipe` |
440
+ | `vclSynthSnippet` | `string` | No | - | Custom VCL snippet for `vcl_synth` |
441
+ | `vclPurgeSnippet` | `string` | No | - | Custom VCL snippet for `vcl_purge` |
442
+ | `vclHashSnippet` | `string` | No | - | Custom VCL snippet for `vcl_hash` |
443
+ | `vclInitSnippet` | `string` | No | - | Custom VCL snippet for `vcl_init` |
444
+ | `vclFiniSnippet` | `string` | No | - | Custom VCL snippet for `vcl_fini` |
445
+ | `vclBackendFetchSnippet` | `string` | No | - | Custom VCL snippet for `vcl_backend_fetch` |
446
+ | `vclBackendErrorSnippet` | `string` | No | - | Custom VCL snippet for `vcl_backend_error` |
314
447
  | `invalidation` | `boolean` | No | `true` | Enable PURGE/BAN/xkey cache invalidation |
315
- | `monitoring` | `boolean` | No | `false` | Enable Prometheus metrics and ServiceMonitor |
316
- | `tolerations` | `VinylCacheToleration[]` | No | - | Node tolerations for Varnish pods |
448
+ | `monitoring` | `boolean` | No | `false` | Enable Prometheus metrics and `ServiceMonitor` |
449
+ | `tolerations` | `VinylCacheToleration[]` | No | - | Pod tolerations for tainted nodes |
450
+ | `nodeSelector` | `Record<string, string>` | No | - | Constrain Varnish pods to nodes matching all labels. |
317
451
 
318
452
  **`VinylCacheStorage` fields:**
319
453
 
@@ -324,6 +458,36 @@ Requires the [cloud-vinyl operator](https://github.com/bluedynamics/cloud-vinyl)
324
458
  | `size` | `string` | Yes | Kubernetes resource quantity (e.g. `"1Gi"`, `"500M"`) |
325
459
  | `path` | `string` | for `file` | Filesystem path for file-type storage |
326
460
 
461
+ **`VinylCacheBackend` fields:**
462
+
463
+ | Property | Type | Required | Default | Description |
464
+ |----------|------|----------|---------|-------------|
465
+ | `name` | `string` | Yes | - | VCL identifier (must match `^[a-zA-Z][a-zA-Z0-9_]*$`) |
466
+ | `serviceName` | `string` | Yes | - | Kubernetes Service name to use as backend |
467
+ | `port` | `number` | Yes | - | Service port |
468
+ | `probe` | `VinylCacheBackendProbe` | No | - | Health probe configuration |
469
+ | `weight` | `number` | No | operator default | Relative weight in the director. `0` marks the backend as standby. |
470
+
471
+ **`VinylCacheBackendProbe` fields:**
472
+
473
+ | Property | Type | Default | Description |
474
+ |----------|------|---------|-------------|
475
+ | `url` | `string` | `/` | URL to probe |
476
+ | `interval` | `string` | `5s` | Probe interval |
477
+ | `timeout` | `string` | `2s` | Probe timeout |
478
+ | `window` | `number` | `10` | Number of recent probes evaluated |
479
+ | `threshold` | `number` | `8` | Healthy threshold within the window |
480
+ | `expectedResponse` | `number` | `200` | Expected HTTP status code |
481
+
482
+ **`VinylCacheToleration` fields:**
483
+
484
+ | Property | Type | Default | Description |
485
+ |----------|------|---------|-------------|
486
+ | `key` | `string` | - | Taint key to tolerate |
487
+ | `operator` | `string` | `Equal` | `Equal` or `Exists` |
488
+ | `value` | `string` | - | Taint value (required for `Equal`) |
489
+ | `effect` | `string` | - | `NoSchedule`, `PreferNoSchedule`, or `NoExecute`. Omit to tolerate all effects. |
490
+
327
491
  **Example:**
328
492
  ```typescript
329
493
  const cache = new PloneVinylCache(chart, 'cache', {
@@ -373,7 +537,7 @@ Without an explicit `storage` entry, varnishd runs with its stock default (~100
373
537
 
374
538
  ---
375
539
 
376
- ## PloneVariant Enum
540
+ ## PloneVariant enum
377
541
 
378
542
  Defines the deployment variant:
379
543
 
@@ -395,7 +559,7 @@ variant: PloneVariant.CLASSICUI
395
559
 
396
560
  ---
397
561
 
398
- ## Complete Example
562
+ ## Complete example
399
563
 
400
564
  ```typescript
401
565
  import { App, Chart } from 'cdk8s';
@@ -457,9 +621,12 @@ app.synth();
457
621
 
458
622
  ---
459
623
 
460
- ## See Also
624
+ ## See also
461
625
 
462
- - [API Documentation](api/) - Complete API reference
463
- - [Quick Start Tutorial](../tutorials/01-quick-start.md) - Get started guide
464
- - [Scale Resources](../how-to/scale-resources.md) - How to adjust resources
465
- - [Configure Monitoring](../how-to/configure-monitoring.md) - Prometheus setup
626
+ - {doc}`/tutorials/01-quick-start` Get started guide
627
+ - {doc}`/how-to/deploy-production-volto` — Production-ready Volto deployment
628
+ - {doc}`/how-to/deploy-classic-ui` Classic UI deployment
629
+ - {doc}`/how-to/deploy-with-vinyl-cache` `PloneVinylCache` walk-through
630
+ - {doc}`/how-to/enable-prometheus-monitoring` — Wire up `ServiceMonitor`
631
+ - {doc}`/how-to/configure-security-context` — Harden backend and frontend pods
632
+ - {doc}`/how-to/schedule-pods` — `nodeSelector` and `tolerations`
@@ -1,3 +1,12 @@
1
+ ---
2
+ myst:
3
+ html_meta:
4
+ "description": "Information-oriented technical reference for cdk8s-plone constructs, configuration options, and APIs."
5
+ "property=og:description": "Information-oriented technical reference for cdk8s-plone constructs, configuration options, and APIs."
6
+ "property=og:title": "Reference"
7
+ "keywords": "Plone, cdk8s, Kubernetes, reference, API, configuration"
8
+ ---
9
+
1
10
  ```{image} ../_static/kup6s-icon-reference.svg
2
11
  :align: center
3
12
  :class: section-icon-large
@@ -9,7 +18,7 @@
9
18
 
10
19
  Reference guides provide detailed technical information about cdk8s-plone's API, configuration options, and component specifications. They describe how things work and what parameters are available.
11
20
 
12
- ## API Reference
21
+ ## API reference
13
22
 
14
23
  *This section will contain auto-generated or detailed documentation for:*
15
24
  - Main chart classes
@@ -17,7 +26,7 @@ Reference guides provide detailed technical information about cdk8s-plone's API,
17
26
  - Individual construct classes
18
27
  - Utility functions and validators
19
28
 
20
- ## Configuration Reference
29
+ ## Configuration reference
21
30
 
22
31
  ```{toctree}
23
32
  ---
@@ -27,7 +36,7 @@ titlesonly: true
27
36
  configuration-options
28
37
  ```
29
38
 
30
- ## Component Specifications
39
+ ## Component specifications
31
40
 
32
41
  ```{toctree}
33
42
  ---
@@ -38,7 +47,7 @@ titlesonly: true
38
47
 
39
48
  *Component specifications will be added in future releases.*
40
49
 
41
- ## API Documentation
50
+ ## API documentation
42
51
 
43
52
  See the `api/` directory for detailed construct documentation:
44
53
 
@@ -1,4 +1,13 @@
1
- # Quick Start
1
+ ---
2
+ myst:
3
+ html_meta:
4
+ "description": "Deploy your first Plone instance to Kubernetes using cdk8s-plone, from project setup to a running Volto site."
5
+ "property=og:description": "Deploy your first Plone instance to Kubernetes using cdk8s-plone, from project setup to a running Volto site."
6
+ "property=og:title": "Quick start"
7
+ "keywords": "Plone, cdk8s, Kubernetes, tutorial, Volto, getting started"
8
+ ---
9
+
10
+ # Quick start
2
11
 
3
12
  This tutorial will guide you through deploying your first Plone instance using cdk8s-plone.
4
13
 
@@ -13,11 +22,11 @@ Before you start, ensure you have:
13
22
 
14
23
  For detailed prerequisites, see [Setup Prerequisites](../how-to/setup-prerequisites.md).
15
24
 
16
- ## Step 1: Create a CDK8S Project
25
+ ## Step 1: Create a CDK8S project
17
26
 
18
27
  Create a new CDK8S TypeScript project:
19
28
 
20
- ```bash
29
+ ```shell
21
30
  # Create project directory
22
31
  mkdir my-plone-deployment
23
32
  cd my-plone-deployment
@@ -32,17 +41,17 @@ This creates a basic CDK8S project structure.
32
41
 
33
42
  Install the cdk8s-plone library:
34
43
 
35
- ```bash
44
+ ```shell
36
45
  npm install @bluedynamics/cdk8s-plone
37
46
  ```
38
47
 
39
48
  The library is also available for Python via PyPI:
40
49
 
41
- ```bash
50
+ ```shell
42
51
  pip install cdk8s-plone
43
52
  ```
44
53
 
45
- ## Step 3: Create a Basic Plone Deployment
54
+ ## Step 3: Create a basic Plone deployment
46
55
 
47
56
  Edit `main.ts` with the following code:
48
57
 
@@ -73,11 +82,11 @@ This creates:
73
82
  - A Volto frontend with 2 replicas
74
83
  - All necessary Kubernetes services and deployments
75
84
 
76
- ## Step 4: Generate Kubernetes Manifests
85
+ ## Step 4: Generate Kubernetes manifests
77
86
 
78
87
  Generate the Kubernetes manifests:
79
88
 
80
- ```bash
89
+ ```shell
81
90
  cdk8s synth
82
91
  ```
83
92
 
@@ -87,22 +96,22 @@ This creates YAML files in the `dist/` directory containing all Kubernetes resou
87
96
 
88
97
  Apply the generated manifests to your cluster:
89
98
 
90
- ```bash
99
+ ```shell
91
100
  kubectl apply -f dist/
92
101
  ```
93
102
 
94
103
  Check the deployment status:
95
104
 
96
- ```bash
105
+ ```shell
97
106
  kubectl get pods
98
107
  kubectl get services
99
108
  ```
100
109
 
101
- ## Step 6: Access Your Plone Site
110
+ ## Step 6: Access your Plone site
102
111
 
103
112
  Once all pods are running, access your Plone site:
104
113
 
105
- ```bash
114
+ ```shell
106
115
  # Port-forward to the frontend service
107
116
  kubectl port-forward service/my-plone-frontend 3000:3000
108
117
 
@@ -110,7 +119,7 @@ kubectl port-forward service/my-plone-frontend 3000:3000
110
119
  open http://localhost:3000
111
120
  ```
112
121
 
113
- ## Adding HTTP Caching (Optional)
122
+ ## Adding HTTP caching (optional)
114
123
 
115
124
  For production deployments, add Varnish HTTP caching:
116
125
 
@@ -132,13 +141,14 @@ new PloneHttpcache(chart, 'cache', {
132
141
 
133
142
  This adds a Varnish caching layer with cluster-wide cache invalidation using [kube-httpcache](https://github.com/mittwald/kube-httpcache).
134
143
 
135
- ## Next Steps
144
+ ## Next steps
136
145
 
137
146
  Now that you have a basic Plone deployment:
138
147
 
139
- - **Configure resources**: See [Scale Resources](../how-to/scale-resources.md) to adjust CPU and memory
140
- - **Add monitoring**: Configure [Prometheus metrics](../how-to/configure-monitoring.md)
141
- - **Explore variants**: Learn about [Classic UI vs Volto](../explanation/plone-variants.md)
148
+ - **Configure resources**: See {doc}`/reference/configuration-options` for CPU and memory options.
149
+ - **Add monitoring**: Follow {doc}`/how-to/enable-prometheus-monitoring`.
150
+ - **Explore variants**: Read about Volto and Classic UI in {doc}`/explanation/features`.
151
+ - **Harden pods**: Apply {doc}`/how-to/configure-security-context`.
142
152
 
143
153
  ## Troubleshooting
144
154
 
@@ -150,8 +160,6 @@ Now that you have a basic Plone deployment:
150
160
  - Ensure port-forward is running
151
161
  - Check service endpoints: `kubectl get endpoints`
152
162
 
153
- For more help, see the [Troubleshooting guide](../how-to/troubleshooting.md).
154
-
155
163
  ---
156
164
 
157
165
  **Complete example**: See the [cdk8s-plone-example](https://github.com/bluedynamics/cdk8s-plone-example) repository for a full working example.
@@ -1,3 +1,12 @@
1
+ ---
2
+ myst:
3
+ html_meta:
4
+ "description": "Learning-oriented tutorials that guide you through using cdk8s-plone to deploy Plone CMS on Kubernetes."
5
+ "property=og:description": "Learning-oriented tutorials that guide you through using cdk8s-plone to deploy Plone CMS on Kubernetes."
6
+ "property=og:title": "Tutorials"
7
+ "keywords": "Plone, cdk8s, Kubernetes, tutorials, getting started"
8
+ ---
9
+
1
10
  ```{image} ../_static/kup6s-icon-tutorials.svg
2
11
  :align: center
3
12
  :class: section-icon-large
@@ -18,7 +27,7 @@ These tutorials will teach you how to:
18
27
  - Customize component resources and settings
19
28
  - Test your deployment
20
29
 
21
- ## Available Tutorials
30
+ ## Available tutorials
22
31
 
23
32
  ```{toctree}
24
33
  ---
package/lib/httpcache.js CHANGED
@@ -118,5 +118,5 @@ class PloneHttpcache extends constructs_1.Construct {
118
118
  }
119
119
  exports.PloneHttpcache = PloneHttpcache;
120
120
  _a = JSII_RTTI_SYMBOL_1;
121
- PloneHttpcache[_a] = { fqn: "@bluedynamics/cdk8s-plone.PloneHttpcache", version: "0.1.35" };
121
+ PloneHttpcache[_a] = { fqn: "@bluedynamics/cdk8s-plone.PloneHttpcache", version: "0.1.37" };
122
122
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cGNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2h0dHBjYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsaUNBQTZCO0FBQzdCLDJDQUF1QztBQXdKdkM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFPM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxPQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksVUFBa0IsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBZSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDbkMsQ0FBQztZQUNELFVBQVUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUM1Qyx1REFBdUQ7WUFDdkQsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxLQUFLLEVBQUUsZ0JBQWdCO1lBQ3ZCLE9BQU8sRUFBRSxPQUFPLENBQUMsWUFBWTtZQUM3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QUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQztJQUNwRCxDQUFDOztBQS9GSCx3Q0FnR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgSGVsbSB9IGZyb20gJ2NkazhzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgUGxvbmUgfSBmcm9tICcuL3Bsb25lJztcblxuLyoqXG4gKiBBbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwYXNzIHRvIHRoZSBrdWJlLWh0dHBjYWNoZSBjb250YWluZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cGNhY2hlRW52VmFyIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBLdWJlcm5ldGVzIHRvbGVyYXRpb24gZm9yIHRoZSBWYXJuaXNoIHBvZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cGNhY2hlVG9sZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgdGFpbnQga2V5IHRvIHRvbGVyYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRvciAoRXF1YWwgb3IgRXhpc3RzKS5cbiAgICogQGRlZmF1bHQgJ0VxdWFsJ1xuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWludCB2YWx1ZSB0byBtYXRjaCAod2hlbiBvcGVyYXRvciBpcyBFcXVhbCkuXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFpbnQgZWZmZWN0IHRvIHRvbGVyYXRlIChOb1NjaGVkdWxlLCBQcmVmZXJOb1NjaGVkdWxlLCBOb0V4ZWN1dGUpLlxuICAgKiBAZGVmYXVsdCAtIHRvbGVyYXRlIGFsbCBlZmZlY3RzXG4gICAqL1xuICByZWFkb25seSBlZmZlY3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBQbG9uZUh0dHBjYWNoZSAoVmFybmlzaCBjYWNoaW5nIGxheWVyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbG9uZUh0dHBjYWNoZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIFBsb25lIGNvbnN0cnVjdCB0byBhdHRhY2ggdGhlIEhUVFAgY2FjaGUgdG8uXG4gICAqIFRoZSBjYWNoZSB3aWxsIGF1dG9tYXRpY2FsbHkgY29ubmVjdCB0byB0aGUgYmFja2VuZCBhbmQgZnJvbnRlbmQgc2VydmljZXMuXG4gICAqL1xuICByZWFkb25seSBwbG9uZTogUGxvbmU7XG5cbiAgLyoqXG4gICAqIFZhcm5pc2ggVkNMIGNvbmZpZ3VyYXRpb24gYXMgYSBzdHJpbmcuXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB2YXJuaXNoVmNsRmlsZS5cbiAgICogQGRlZmF1bHQgLSBsb2FkZWQgZnJvbSB2YXJuaXNoVmNsRmlsZSBvciBkZWZhdWx0IGNvbmZpZyBmaWxlXG4gICAqL1xuICByZWFkb25seSB2YXJuaXNoVmNsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGEgVmFybmlzaCBWQ0wgY29uZmlndXJhdGlvbiBmaWxlLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgdGhlIGRlZmF1bHQgVkNMIGZpbGUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkuXG4gICAqIEBkZWZhdWx0IC0gdXNlcyBkZWZhdWx0IGNvbmZpZy92YXJuaXNoLnRwbC52Y2xcbiAgICovXG4gIHJlYWRvbmx5IHZhcm5pc2hWY2xGaWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIGFuIGV4aXN0aW5nIEt1YmVybmV0ZXMgc2VjcmV0IGNvbnRhaW5pbmcgVmFybmlzaCBhZG1pbiBjcmVkZW50aWFscy5cbiAgICogVGhlIHNlY3JldCBzaG91bGQgYmUgY3JlYXRlZCBzZXBhcmF0ZWx5IGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgKG5vIGV4aXN0aW5nIHNlY3JldClcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDUFUgbGltaXQgZm9yIFZhcm5pc2ggcG9kcy5cbiAgICogQGRlZmF1bHQgJzUwMG0nXG4gICAqL1xuICByZWFkb25seSBsaW1pdENwdT86IHN0cmluZztcblxuICAvKipcbiAgICogTWVtb3J5IGxpbWl0IGZvciBWYXJuaXNoIHBvZHMuXG4gICAqIEBkZWZhdWx0ICc1MDBNaSdcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0TWVtb3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDUFUgcmVxdWVzdCBmb3IgVmFybmlzaCBwb2RzLlxuICAgKiBAZGVmYXVsdCAnMTAwbSdcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RDcHU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lbW9yeSByZXF1ZXN0IGZvciBWYXJuaXNoIHBvZHMuXG4gICAqIEBkZWZhdWx0ICcxMDBNaSdcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RNZW1vcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBQcm9tZXRoZXVzIFNlcnZpY2VNb25pdG9yIGZvciBtZXRyaWNzIGNvbGxlY3Rpb24uXG4gICAqIFJlcXVpcmVzIFByb21ldGhldXMgT3BlcmF0b3IgdG8gYmUgaW5zdGFsbGVkIGluIHRoZSBjbHVzdGVyLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZW1vbml0b3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIFByb21ldGhldXMgZXhwb3J0ZXIgZm9yIFZhcm5pc2ggbWV0cmljcy5cbiAgICogV2hlbiBlbmFibGVkLCB0aGUgZXhwb3J0ZXIgc2lkZWNhciBjb250YWluZXIgd2lsbCBiZSBkZXBsb3llZCBhbG9uZ3NpZGUgVmFybmlzaC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwb3J0ZXJFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUga3ViZS1odHRwY2FjaGUgSGVsbSBjaGFydCB0byB1c2UuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZSByZXBvc2l0b3J5IHdpbGwgYmUgdXNlZC5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIChsYXRlc3QpXG4gICAqL1xuICByZWFkb25seSBjaGFydFZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIGt1YmUtaHR0cGNhY2hlIENvbnRhaW5lciBJbWFnZSB0byB1c2UuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZSByZXBvc2l0b3J5IHdpbGwgYmUgdXNlZC5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIChjaGFydFZlcnNpb24gPSB3aXRoIGVhY2ggY2hhcnQgcmVsZWFzZSB0aGVyZSBpcyBhbiBpbWFnZSByZWxlYXNlIHRvbyApXG4gICAqL1xuICByZWFkb25seSBhcHBWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgVmFybmlzaCBwb2QgcmVwbGljYXMgdG8gcnVuLlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUga3ViZS1odHRwY2FjaGUgY29udGFpbmVyLlxuICAgKiBUaGVzZSBhcmUgYXBwZW5kZWQgdG8gdGhlIGJ1aWx0LWluIGVudiB2YXJzIChCQUNLRU5EX1NFUlZJQ0VfTkFNRSwgZXRjLilcbiAgICogYW5kIGNhbiBiZSByZWZlcmVuY2VkIGluIFZDTCB0ZW1wbGF0ZXMgdXNpbmcgR28gdGVtcGxhdGUgc3ludGF4OiB7eyAuRW52LlZBUl9OQU1FIH19XG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBlbnYgdmFyc1xuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFFbnZWYXJzPzogSHR0cGNhY2hlRW52VmFyW107XG5cbiAgLyoqXG4gICAqIFRvbGVyYXRpb25zIGZvciB0aGUgVmFybmlzaCBwb2RzLlxuICAgKiBVc2UgdGhpcyB0byBhbGxvdyBzY2hlZHVsaW5nIG9uIG5vZGVzIHdpdGggc3BlY2lmaWMgdGFpbnRzLFxuICAgKiBlLmcuIG5vZGVzIHRhaW50ZWQgd2l0aCBrdWJlcm5ldGVzLmlvL2FyY2g9YW1kNjQ6Tm9TY2hlZHVsZS5cbiAgICogQGRlZmF1bHQgLSBubyB0b2xlcmF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9sZXJhdGlvbnM/OiBIdHRwY2FjaGVUb2xlcmF0aW9uW107XG59XG5cbi8qKlxuICogUGxvbmVIdHRwY2FjaGUgY29uc3RydWN0IGZvciBkZXBsb3lpbmcgVmFybmlzaCBIVFRQIGNhY2hpbmcgbGF5ZXIuXG4gKlxuICogVXNlcyB0aGUgbWl0dHdhbGQva3ViZS1odHRwY2FjaGUgSGVsbSBjaGFydCB0byBkZXBsb3kgVmFybmlzaCBhcyBhXG4gKiBjYWNoaW5nIHByb3h5IGluIGZyb250IG9mIFBsb25lIGJhY2tlbmQgYW5kL29yIGZyb250ZW5kIHNlcnZpY2VzLlxuICpcbiAqIFRoZSBjYWNoZSBhdXRvbWF0aWNhbGx5IGNvbm5lY3RzIHRvIHRoZSBQbG9uZSBzZXJ2aWNlcyBhbmQgcHJvdmlkZXNcbiAqIEhUVFAgY2FjaGUgaW52YWxpZGF0aW9uIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcGxvbmUgPSBuZXcgUGxvbmUoY2hhcnQsICdwbG9uZScpO1xuICogY29uc3QgY2FjaGUgPSBuZXcgUGxvbmVIdHRwY2FjaGUoY2hhcnQsICdjYWNoZScsIHtcbiAqICAgcGxvbmU6IHBsb25lLFxuICogICBleGlzdGluZ1NlY3JldDogJ3Zhcm5pc2gtc2VjcmV0JyxcbiAqIH0pO1xuICovXG5leHBvcnQgY2xhc3MgUGxvbmVIdHRwY2FjaGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgVmFybmlzaCBzZXJ2aWNlIGNyZWF0ZWQgYnkgdGhlIEhlbG0gY2hhcnQuXG4gICAqIFVzZSB0aGlzIHRvIHJlZmVyZW5jZSB0aGUgY2FjaGUgc2VydmljZSBmcm9tIGluZ3Jlc3Mgb3Igb3RoZXIgY29uc3RydWN0cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBodHRwY2FjaGVTZXJ2aWNlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IFBsb25lSHR0cGNhY2hlT3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgbGV0IHZhcm5pc2hWY2w6IHN0cmluZztcbiAgICBpZiAoIW9wdGlvbnMudmFybmlzaFZjbCkge1xuICAgICAgbGV0IHZjbFBhdGg6IHN0cmluZztcbiAgICAgIGlmICghb3B0aW9ucy52YXJuaXNoVmNsRmlsZSkge1xuICAgICAgICB2Y2xQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2NvbmZpZycsICd2YXJuaXNoLnRwbC52Y2wnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZjbFBhdGggPSBvcHRpb25zLnZhcm5pc2hWY2xGaWxlO1xuICAgICAgfVxuICAgICAgdmFybmlzaFZjbCA9IGZzLnJlYWRGaWxlU3luYyh2Y2xQYXRoLCAndXRmOCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXJuaXNoVmNsID0gb3B0aW9ucy52YXJuaXNoVmNsO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZVRhZyA9IG9wdGlvbnMuYXBwVmVyc2lvbiA/PyBvcHRpb25zLmNoYXJ0VmVyc2lvbjtcbiAgICBjb25zdCBodHRwY2FjaGUgPSBuZXcgSGVsbSh0aGlzLCAnaHR0cGNhY2hlJywge1xuICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taXR0d2FsZC9rdWJlLWh0dHBjYWNoZS9jaGFydFxuICAgICAgcmVwbzogJ2h0dHBzOi8vaGVsbS5taXR0d2FsZC5kZScsXG4gICAgICBjaGFydDogJ2t1YmUtaHR0cGNhY2hlJyxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMuY2hhcnRWZXJzaW9uLFxuICAgICAgdmFsdWVzOiB7XG4gICAgICAgIHJlcGxpY2FDb3VudDogb3B0aW9ucy5yZXBsaWNhcyA/PyAyLFxuICAgICAgICAuLi4oaW1hZ2VUYWcgJiYgeyBpbWFnZTogeyB0YWc6IGltYWdlVGFnIH0gfSksXG4gICAgICAgIGNhY2hlOiB7XG4gICAgICAgICAgYmFja2VuZFNlcnZpY2U6IG9wdGlvbnMucGxvbmUuYmFja2VuZFNlcnZpY2VOYW1lLFxuICAgICAgICAgIGZyb250ZW5kV2F0Y2g6IGZhbHNlLFxuICAgICAgICAgIGJhY2tlbmRXYXRjaDogdHJ1ZSxcbiAgICAgICAgICBleGlzdGluZ1NlY3JldDogb3B0aW9ucy5leGlzdGluZ1NlY3JldCA/PyB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFdvcmthcm91bmQ6IHVwc3RyZWFtIGNoYXJ0IGFjY2VwdHMgYmFja2VuZFBvcnROYW1lIGJ1dCBuZXZlclxuICAgICAgICAvLyByZW5kZXJzIGl0IGFzIENMSSBhcmcuIFBhc3MgdmlhIGNhY2hlRXh0cmFBcmdzIGluc3RlYWQuXG4gICAgICAgIGNhY2hlRXh0cmFBcmdzOiAnLSAtYmFja2VuZC1wb3J0bmFtZT1iYWNrZW5kLWh0dHAnLFxuICAgICAgICB2Y2xUZW1wbGF0ZTogdmFybmlzaFZjbCxcbiAgICAgICAgZXh0cmFFbnZWYXJzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnQkFDS0VORF9TRVJWSUNFX05BTUUnLCB2YWx1ZTogb3B0aW9ucy5wbG9uZS5iYWNrZW5kU2VydmljZU5hbWUgfSxcbiAgICAgICAgICB7IG5hbWU6ICdCQUNLRU5EX1NFUlZJQ0VfUE9SVCcsIHZhbHVlOiAnODA4MCcgfSxcbiAgICAgICAgICB7IG5hbWU6ICdCQUNLRU5EX1NJVEVfSUQnLCB2YWx1ZTogb3B0aW9ucy5wbG9uZS5zaXRlSWQgfSxcbiAgICAgICAgICB7IG5hbWU6ICdGUk9OVEVORF9TRVJWSUNFX05BTUUnLCB2YWx1ZTogb3B0aW9ucy5wbG9uZS5mcm9udGVuZFNlcnZpY2VOYW1lIH0sXG4gICAgICAgICAgeyBuYW1lOiAnRlJPTlRFTkRfU0VSVklDRV9QT1JUJywgdmFsdWU6ICczMDAwJyB9LFxuICAgICAgICAgIC4uLihvcHRpb25zLmV4dHJhRW52VmFycyA/PyBbXSksXG4gICAgICAgIF0sXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWl0dHdhbGQva3ViZS1odHRwY2FjaGUvaXNzdWVzLzI1M1xuICAgICAgICBub2RlU2VsZWN0b3I6IHtcbiAgICAgICAgICAna3ViZXJuZXRlcy5pby9hcmNoJzogJ2FtZDY0JyxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKG9wdGlvbnMudG9sZXJhdGlvbnMgJiYgeyB0b2xlcmF0aW9uczogb3B0aW9ucy50b2xlcmF0aW9ucyB9KSxcbiAgICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgICAgbGltaXRzOiB7XG4gICAgICAgICAgICBjcHU6IG9wdGlvbnMubGltaXRDcHUgfHwgJzUwMG0nLFxuICAgICAgICAgICAgbWVtb3J5OiBvcHRpb25zLmxpbWl0TWVtb3J5IHx8ICc1MDBNaScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0czoge1xuICAgICAgICAgICAgY3B1OiBvcHRpb25zLnJlcXVlc3RDcHUgfHwgJzEwMG0nLFxuICAgICAgICAgICAgbWVtb3J5OiBvcHRpb25zLnJlcXVlc3RNZW1vcnkgfHwgJzEwME1pJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByYmFjOiB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0ZXI6IHtcbiAgICAgICAgICBlbmFibGVkOiBvcHRpb25zLmV4cG9ydGVyRW5hYmxlZCA/PyB0cnVlLFxuICAgICAgICAgIHJlc291cmNlczoge1xuICAgICAgICAgICAgbGltaXRzOiB7XG4gICAgICAgICAgICAgIGNwdTogJzEwMG0nLFxuICAgICAgICAgICAgICBtZW1vcnk6ICcxMDBNaScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdHM6IHtcbiAgICAgICAgICAgICAgY3B1OiAnMTBtJyxcbiAgICAgICAgICAgICAgbWVtb3J5OiAnNTBNaScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNlcnZpY2VNb25pdG9yOiB7XG4gICAgICAgICAgZW5hYmxlZDogb3B0aW9ucy5zZXJ2aWNlbW9uaXRvciB8fCBmYWxzZSxcbiAgICAgICAgICBzY3JhcGVTaWduYWxsZXI6IG9wdGlvbnMuc2VydmljZW1vbml0b3IgfHwgZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGh0dHBjYWNoZVNlcnZpY2UgPSBodHRwY2FjaGUuYXBpT2JqZWN0cy5maW5kKChjb25zdHJ1Y3QpID0+IHtcbiAgICAgIGlmICgoY29uc3RydWN0LmtpbmQgPT09ICdTZXJ2aWNlJykgJiYgKGNvbnN0cnVjdC5tZXRhZGF0YS5uYW1lPy5lbmRzV2l0aCgna3ViZS1odHRwY2FjaGUnKSkpIHtcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdC5uYW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpZiAoaHR0cGNhY2hlU2VydmljZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGh0dHBjYWNoZSBzZXJ2aWNlJyk7XG4gICAgfVxuICAgIHRoaXMuaHR0cGNhY2hlU2VydmljZU5hbWUgPSBodHRwY2FjaGVTZXJ2aWNlLm5hbWU7XG4gIH1cbn0iXX0=