@bluedynamics/cdk8s-plone 0.1.29 → 0.1.31

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
@@ -1770,7 +1770,7 @@
1770
1770
  },
1771
1771
  "locationInModule": {
1772
1772
  "filename": "src/vinylcache.ts",
1773
- "line": 314
1773
+ "line": 350
1774
1774
  },
1775
1775
  "parameters": [
1776
1776
  {
@@ -1796,7 +1796,7 @@
1796
1796
  "kind": "class",
1797
1797
  "locationInModule": {
1798
1798
  "filename": "src/vinylcache.ts",
1799
- "line": 307
1799
+ "line": 343
1800
1800
  },
1801
1801
  "name": "PloneVinylCache",
1802
1802
  "properties": [
@@ -1809,7 +1809,7 @@
1809
1809
  "immutable": true,
1810
1810
  "locationInModule": {
1811
1811
  "filename": "src/vinylcache.ts",
1812
- "line": 312
1812
+ "line": 348
1813
1813
  },
1814
1814
  "name": "vinylCacheServiceName",
1815
1815
  "type": {
@@ -1831,7 +1831,7 @@
1831
1831
  "kind": "interface",
1832
1832
  "locationInModule": {
1833
1833
  "filename": "src/vinylcache.ts",
1834
- "line": 122
1834
+ "line": 124
1835
1835
  },
1836
1836
  "name": "PloneVinylCacheOptions",
1837
1837
  "properties": [
@@ -1845,7 +1845,7 @@
1845
1845
  "immutable": true,
1846
1846
  "locationInModule": {
1847
1847
  "filename": "src/vinylcache.ts",
1848
- "line": 127
1848
+ "line": 129
1849
1849
  },
1850
1850
  "name": "plone",
1851
1851
  "type": {
@@ -1862,7 +1862,7 @@
1862
1862
  "immutable": true,
1863
1863
  "locationInModule": {
1864
1864
  "filename": "src/vinylcache.ts",
1865
- "line": 170
1865
+ "line": 172
1866
1866
  },
1867
1867
  "name": "director",
1868
1868
  "optional": true,
@@ -1881,7 +1881,7 @@
1881
1881
  "immutable": true,
1882
1882
  "locationInModule": {
1883
1883
  "filename": "src/vinylcache.ts",
1884
- "line": 134
1884
+ "line": 136
1885
1885
  },
1886
1886
  "name": "extraBackends",
1887
1887
  "optional": true,
@@ -1904,7 +1904,7 @@
1904
1904
  "immutable": true,
1905
1905
  "locationInModule": {
1906
1906
  "filename": "src/vinylcache.ts",
1907
- "line": 202
1907
+ "line": 238
1908
1908
  },
1909
1909
  "name": "image",
1910
1910
  "optional": true,
@@ -1922,7 +1922,7 @@
1922
1922
  "immutable": true,
1923
1923
  "locationInModule": {
1924
1924
  "filename": "src/vinylcache.ts",
1925
- "line": 190
1925
+ "line": 226
1926
1926
  },
1927
1927
  "name": "invalidation",
1928
1928
  "optional": true,
@@ -1940,7 +1940,7 @@
1940
1940
  "immutable": true,
1941
1941
  "locationInModule": {
1942
1942
  "filename": "src/vinylcache.ts",
1943
- "line": 158
1943
+ "line": 160
1944
1944
  },
1945
1945
  "name": "limitCpu",
1946
1946
  "optional": true,
@@ -1958,7 +1958,7 @@
1958
1958
  "immutable": true,
1959
1959
  "locationInModule": {
1960
1960
  "filename": "src/vinylcache.ts",
1961
- "line": 164
1961
+ "line": 166
1962
1962
  },
1963
1963
  "name": "limitMemory",
1964
1964
  "optional": true,
@@ -1976,7 +1976,7 @@
1976
1976
  "immutable": true,
1977
1977
  "locationInModule": {
1978
1978
  "filename": "src/vinylcache.ts",
1979
- "line": 196
1979
+ "line": 232
1980
1980
  },
1981
1981
  "name": "monitoring",
1982
1982
  "optional": true,
@@ -1995,7 +1995,7 @@
1995
1995
  "immutable": true,
1996
1996
  "locationInModule": {
1997
1997
  "filename": "src/vinylcache.ts",
1998
- "line": 215
1998
+ "line": 251
1999
1999
  },
2000
2000
  "name": "nodeSelector",
2001
2001
  "optional": true,
@@ -2018,7 +2018,7 @@
2018
2018
  "immutable": true,
2019
2019
  "locationInModule": {
2020
2020
  "filename": "src/vinylcache.ts",
2021
- "line": 140
2021
+ "line": 142
2022
2022
  },
2023
2023
  "name": "replicas",
2024
2024
  "optional": true,
@@ -2036,7 +2036,7 @@
2036
2036
  "immutable": true,
2037
2037
  "locationInModule": {
2038
2038
  "filename": "src/vinylcache.ts",
2039
- "line": 146
2039
+ "line": 148
2040
2040
  },
2041
2041
  "name": "requestCpu",
2042
2042
  "optional": true,
@@ -2054,7 +2054,7 @@
2054
2054
  "immutable": true,
2055
2055
  "locationInModule": {
2056
2056
  "filename": "src/vinylcache.ts",
2057
- "line": 152
2057
+ "line": 154
2058
2058
  },
2059
2059
  "name": "requestMemory",
2060
2060
  "optional": true,
@@ -2062,6 +2062,82 @@
2062
2062
  "primitive": "string"
2063
2063
  }
2064
2064
  },
2065
+ {
2066
+ "abstract": true,
2067
+ "docs": {
2068
+ "default": "- operator default (\"HASH\")",
2069
+ "remarks": "\"HASH\" uses the Varnish hash (default); \"URL\" uses the request URL.\nOnly applied when director is \"shard\".\nRequires cloud-vinyl operator >= 0.4.2.",
2070
+ "stability": "stable",
2071
+ "summary": "Shard director: what value is hashed for shard selection."
2072
+ },
2073
+ "immutable": true,
2074
+ "locationInModule": {
2075
+ "filename": "src/vinylcache.ts",
2076
+ "line": 181
2077
+ },
2078
+ "name": "shardBy",
2079
+ "optional": true,
2080
+ "type": {
2081
+ "primitive": "string"
2082
+ }
2083
+ },
2084
+ {
2085
+ "abstract": true,
2086
+ "docs": {
2087
+ "default": "- operator default (\"CHOSEN\")",
2088
+ "remarks": "\"CHOSEN\" (default) only considers the chosen backend healthy; \"ALL\" requires all\nbackends to be healthy.\nOnly applied when director is \"shard\".\nRequires cloud-vinyl operator >= 0.4.2.",
2089
+ "stability": "stable",
2090
+ "summary": "Shard director: which backends the director considers when selecting a shard."
2091
+ },
2092
+ "immutable": true,
2093
+ "locationInModule": {
2094
+ "filename": "src/vinylcache.ts",
2095
+ "line": 191
2096
+ },
2097
+ "name": "shardHealthy",
2098
+ "optional": true,
2099
+ "type": {
2100
+ "primitive": "string"
2101
+ }
2102
+ },
2103
+ {
2104
+ "abstract": true,
2105
+ "docs": {
2106
+ "default": "- operator default (\"30s\")",
2107
+ "remarks": "Only applied when director is \"shard\".",
2108
+ "stability": "stable",
2109
+ "summary": "Shard director: time after adding a backend before it receives its full share of traffic, preventing thundering-herd."
2110
+ },
2111
+ "immutable": true,
2112
+ "locationInModule": {
2113
+ "filename": "src/vinylcache.ts",
2114
+ "line": 199
2115
+ },
2116
+ "name": "shardRampup",
2117
+ "optional": true,
2118
+ "type": {
2119
+ "primitive": "string"
2120
+ }
2121
+ },
2122
+ {
2123
+ "abstract": true,
2124
+ "docs": {
2125
+ "default": "- operator default (67)",
2126
+ "remarks": "Only applied when director is \"shard\".",
2127
+ "stability": "stable",
2128
+ "summary": "Shard director: number of Ketama replicas per backend in the hash ring."
2129
+ },
2130
+ "immutable": true,
2131
+ "locationInModule": {
2132
+ "filename": "src/vinylcache.ts",
2133
+ "line": 206
2134
+ },
2135
+ "name": "shardReplicas",
2136
+ "optional": true,
2137
+ "type": {
2138
+ "primitive": "number"
2139
+ }
2140
+ },
2065
2141
  {
2066
2142
  "abstract": true,
2067
2143
  "docs": {
@@ -2072,7 +2148,7 @@
2072
2148
  "immutable": true,
2073
2149
  "locationInModule": {
2074
2150
  "filename": "src/vinylcache.ts",
2075
- "line": 208
2151
+ "line": 244
2076
2152
  },
2077
2153
  "name": "tolerations",
2078
2154
  "optional": true,
@@ -2095,7 +2171,7 @@
2095
2171
  "immutable": true,
2096
2172
  "locationInModule": {
2097
2173
  "filename": "src/vinylcache.ts",
2098
- "line": 287
2174
+ "line": 323
2099
2175
  },
2100
2176
  "name": "vclBackendErrorSnippet",
2101
2177
  "optional": true,
@@ -2113,7 +2189,7 @@
2113
2189
  "immutable": true,
2114
2190
  "locationInModule": {
2115
2191
  "filename": "src/vinylcache.ts",
2116
- "line": 281
2192
+ "line": 317
2117
2193
  },
2118
2194
  "name": "vclBackendFetchSnippet",
2119
2195
  "optional": true,
@@ -2132,7 +2208,7 @@
2132
2208
  "immutable": true,
2133
2209
  "locationInModule": {
2134
2210
  "filename": "src/vinylcache.ts",
2135
- "line": 184
2211
+ "line": 220
2136
2212
  },
2137
2213
  "name": "vclBackendResponseSnippet",
2138
2214
  "optional": true,
@@ -2150,7 +2226,7 @@
2150
2226
  "immutable": true,
2151
2227
  "locationInModule": {
2152
2228
  "filename": "src/vinylcache.ts",
2153
- "line": 221
2229
+ "line": 257
2154
2230
  },
2155
2231
  "name": "vclDeliverSnippet",
2156
2232
  "optional": true,
@@ -2168,7 +2244,7 @@
2168
2244
  "immutable": true,
2169
2245
  "locationInModule": {
2170
2246
  "filename": "src/vinylcache.ts",
2171
- "line": 275
2247
+ "line": 311
2172
2248
  },
2173
2249
  "name": "vclFiniSnippet",
2174
2250
  "optional": true,
@@ -2186,7 +2262,7 @@
2186
2262
  "immutable": true,
2187
2263
  "locationInModule": {
2188
2264
  "filename": "src/vinylcache.ts",
2189
- "line": 263
2265
+ "line": 299
2190
2266
  },
2191
2267
  "name": "vclHashSnippet",
2192
2268
  "optional": true,
@@ -2204,7 +2280,7 @@
2204
2280
  "immutable": true,
2205
2281
  "locationInModule": {
2206
2282
  "filename": "src/vinylcache.ts",
2207
- "line": 227
2283
+ "line": 263
2208
2284
  },
2209
2285
  "name": "vclHitSnippet",
2210
2286
  "optional": true,
@@ -2222,7 +2298,7 @@
2222
2298
  "immutable": true,
2223
2299
  "locationInModule": {
2224
2300
  "filename": "src/vinylcache.ts",
2225
- "line": 269
2301
+ "line": 305
2226
2302
  },
2227
2303
  "name": "vclInitSnippet",
2228
2304
  "optional": true,
@@ -2240,7 +2316,7 @@
2240
2316
  "immutable": true,
2241
2317
  "locationInModule": {
2242
2318
  "filename": "src/vinylcache.ts",
2243
- "line": 233
2319
+ "line": 269
2244
2320
  },
2245
2321
  "name": "vclMissSnippet",
2246
2322
  "optional": true,
@@ -2258,7 +2334,7 @@
2258
2334
  "immutable": true,
2259
2335
  "locationInModule": {
2260
2336
  "filename": "src/vinylcache.ts",
2261
- "line": 239
2337
+ "line": 275
2262
2338
  },
2263
2339
  "name": "vclPassSnippet",
2264
2340
  "optional": true,
@@ -2276,7 +2352,7 @@
2276
2352
  "immutable": true,
2277
2353
  "locationInModule": {
2278
2354
  "filename": "src/vinylcache.ts",
2279
- "line": 245
2355
+ "line": 281
2280
2356
  },
2281
2357
  "name": "vclPipeSnippet",
2282
2358
  "optional": true,
@@ -2294,7 +2370,7 @@
2294
2370
  "immutable": true,
2295
2371
  "locationInModule": {
2296
2372
  "filename": "src/vinylcache.ts",
2297
- "line": 257
2373
+ "line": 293
2298
2374
  },
2299
2375
  "name": "vclPurgeSnippet",
2300
2376
  "optional": true,
@@ -2313,7 +2389,7 @@
2313
2389
  "immutable": true,
2314
2390
  "locationInModule": {
2315
2391
  "filename": "src/vinylcache.ts",
2316
- "line": 177
2392
+ "line": 213
2317
2393
  },
2318
2394
  "name": "vclRecvSnippet",
2319
2395
  "optional": true,
@@ -2331,7 +2407,7 @@
2331
2407
  "immutable": true,
2332
2408
  "locationInModule": {
2333
2409
  "filename": "src/vinylcache.ts",
2334
- "line": 251
2410
+ "line": 287
2335
2411
  },
2336
2412
  "name": "vclSynthSnippet",
2337
2413
  "optional": true,
@@ -2353,7 +2429,7 @@
2353
2429
  "kind": "interface",
2354
2430
  "locationInModule": {
2355
2431
  "filename": "src/vinylcache.ts",
2356
- "line": 57
2432
+ "line": 59
2357
2433
  },
2358
2434
  "name": "VinylCacheBackend",
2359
2435
  "properties": [
@@ -2367,7 +2443,7 @@
2367
2443
  "immutable": true,
2368
2444
  "locationInModule": {
2369
2445
  "filename": "src/vinylcache.ts",
2370
- "line": 61
2446
+ "line": 63
2371
2447
  },
2372
2448
  "name": "name",
2373
2449
  "type": {
@@ -2383,7 +2459,7 @@
2383
2459
  "immutable": true,
2384
2460
  "locationInModule": {
2385
2461
  "filename": "src/vinylcache.ts",
2386
- "line": 71
2462
+ "line": 73
2387
2463
  },
2388
2464
  "name": "port",
2389
2465
  "type": {
@@ -2399,7 +2475,7 @@
2399
2475
  "immutable": true,
2400
2476
  "locationInModule": {
2401
2477
  "filename": "src/vinylcache.ts",
2402
- "line": 66
2478
+ "line": 68
2403
2479
  },
2404
2480
  "name": "serviceName",
2405
2481
  "type": {
@@ -2416,7 +2492,7 @@
2416
2492
  "immutable": true,
2417
2493
  "locationInModule": {
2418
2494
  "filename": "src/vinylcache.ts",
2419
- "line": 77
2495
+ "line": 79
2420
2496
  },
2421
2497
  "name": "probe",
2422
2498
  "optional": true,
@@ -2435,7 +2511,7 @@
2435
2511
  "immutable": true,
2436
2512
  "locationInModule": {
2437
2513
  "filename": "src/vinylcache.ts",
2438
- "line": 83
2514
+ "line": 85
2439
2515
  },
2440
2516
  "name": "weight",
2441
2517
  "optional": true,
@@ -2457,7 +2533,7 @@
2457
2533
  "kind": "interface",
2458
2534
  "locationInModule": {
2459
2535
  "filename": "src/vinylcache.ts",
2460
- "line": 16
2536
+ "line": 18
2461
2537
  },
2462
2538
  "name": "VinylCacheBackendProbe",
2463
2539
  "properties": [
@@ -2471,7 +2547,7 @@
2471
2547
  "immutable": true,
2472
2548
  "locationInModule": {
2473
2549
  "filename": "src/vinylcache.ts",
2474
- "line": 51
2550
+ "line": 53
2475
2551
  },
2476
2552
  "name": "expectedResponse",
2477
2553
  "optional": true,
@@ -2489,7 +2565,7 @@
2489
2565
  "immutable": true,
2490
2566
  "locationInModule": {
2491
2567
  "filename": "src/vinylcache.ts",
2492
- "line": 27
2568
+ "line": 29
2493
2569
  },
2494
2570
  "name": "interval",
2495
2571
  "optional": true,
@@ -2507,7 +2583,7 @@
2507
2583
  "immutable": true,
2508
2584
  "locationInModule": {
2509
2585
  "filename": "src/vinylcache.ts",
2510
- "line": 45
2586
+ "line": 47
2511
2587
  },
2512
2588
  "name": "threshold",
2513
2589
  "optional": true,
@@ -2525,7 +2601,7 @@
2525
2601
  "immutable": true,
2526
2602
  "locationInModule": {
2527
2603
  "filename": "src/vinylcache.ts",
2528
- "line": 33
2604
+ "line": 35
2529
2605
  },
2530
2606
  "name": "timeout",
2531
2607
  "optional": true,
@@ -2543,7 +2619,7 @@
2543
2619
  "immutable": true,
2544
2620
  "locationInModule": {
2545
2621
  "filename": "src/vinylcache.ts",
2546
- "line": 21
2622
+ "line": 23
2547
2623
  },
2548
2624
  "name": "url",
2549
2625
  "optional": true,
@@ -2561,7 +2637,7 @@
2561
2637
  "immutable": true,
2562
2638
  "locationInModule": {
2563
2639
  "filename": "src/vinylcache.ts",
2564
- "line": 39
2640
+ "line": 41
2565
2641
  },
2566
2642
  "name": "window",
2567
2643
  "optional": true,
@@ -2583,7 +2659,7 @@
2583
2659
  "kind": "interface",
2584
2660
  "locationInModule": {
2585
2661
  "filename": "src/vinylcache.ts",
2586
- "line": 89
2662
+ "line": 91
2587
2663
  },
2588
2664
  "name": "VinylCacheToleration",
2589
2665
  "properties": [
@@ -2596,7 +2672,7 @@
2596
2672
  "immutable": true,
2597
2673
  "locationInModule": {
2598
2674
  "filename": "src/vinylcache.ts",
2599
- "line": 93
2675
+ "line": 95
2600
2676
  },
2601
2677
  "name": "key",
2602
2678
  "type": {
@@ -2613,7 +2689,7 @@
2613
2689
  "immutable": true,
2614
2690
  "locationInModule": {
2615
2691
  "filename": "src/vinylcache.ts",
2616
- "line": 111
2692
+ "line": 113
2617
2693
  },
2618
2694
  "name": "effect",
2619
2695
  "optional": true,
@@ -2631,7 +2707,7 @@
2631
2707
  "immutable": true,
2632
2708
  "locationInModule": {
2633
2709
  "filename": "src/vinylcache.ts",
2634
- "line": 99
2710
+ "line": 101
2635
2711
  },
2636
2712
  "name": "operator",
2637
2713
  "optional": true,
@@ -2649,7 +2725,7 @@
2649
2725
  "immutable": true,
2650
2726
  "locationInModule": {
2651
2727
  "filename": "src/vinylcache.ts",
2652
- "line": 105
2728
+ "line": 107
2653
2729
  },
2654
2730
  "name": "value",
2655
2731
  "optional": true,
@@ -2661,6 +2737,6 @@
2661
2737
  "symbolId": "src/vinylcache:VinylCacheToleration"
2662
2738
  }
2663
2739
  },
2664
- "version": "0.1.29",
2665
- "fingerprint": "b9tGJrEVUpjbGv0eNInNq5LoLT7T7EYLXz6Q1rhizJc="
2740
+ "version": "0.1.31",
2741
+ "fingerprint": "DfZRICJpeVu1djonNCdX/hOFxrPq8dB12aL/F8F4W1c="
2666
2742
  }
package/API.md CHANGED
@@ -1794,6 +1794,10 @@ const ploneVinylCacheOptions: PloneVinylCacheOptions = { ... }
1794
1794
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.replicas">replicas</a></code> | <code>number</code> | Number of Varnish pod replicas. |
1795
1795
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.requestCpu">requestCpu</a></code> | <code>string</code> | CPU request for Varnish pods. |
1796
1796
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.requestMemory">requestMemory</a></code> | <code>string</code> | Memory request for Varnish pods. |
1797
+ | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.shardBy">shardBy</a></code> | <code>string</code> | Shard director: what value is hashed for shard selection. |
1798
+ | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.shardHealthy">shardHealthy</a></code> | <code>string</code> | Shard director: which backends the director considers when selecting a shard. |
1799
+ | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.shardRampup">shardRampup</a></code> | <code>string</code> | Shard director: time after adding a backend before it receives its full share of traffic, preventing thundering-herd. |
1800
+ | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.shardReplicas">shardReplicas</a></code> | <code>number</code> | Shard director: number of Ketama replicas per backend in the hash ring. |
1797
1801
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.tolerations">tolerations</a></code> | <code><a href="#@bluedynamics/cdk8s-plone.VinylCacheToleration">VinylCacheToleration</a>[]</code> | Tolerations for the Varnish pods. |
1798
1802
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.vclBackendErrorSnippet">vclBackendErrorSnippet</a></code> | <code>string</code> | Custom VCL snippet for vcl_backend_error subroutine. |
1799
1803
  | <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.vclBackendFetchSnippet">vclBackendFetchSnippet</a></code> | <code>string</code> | Custom VCL snippet for vcl_backend_fetch subroutine. |
@@ -1973,6 +1977,71 @@ Memory request for Varnish pods.
1973
1977
 
1974
1978
  ---
1975
1979
 
1980
+ ##### `shardBy`<sup>Optional</sup> <a name="shardBy" id="@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.shardBy"></a>
1981
+
1982
+ ```typescript
1983
+ public readonly shardBy: string;
1984
+ ```
1985
+
1986
+ - *Type:* string
1987
+ - *Default:* operator default ("HASH")
1988
+
1989
+ Shard director: what value is hashed for shard selection.
1990
+
1991
+ "HASH" uses the Varnish hash (default); "URL" uses the request URL.
1992
+ Only applied when director is "shard".
1993
+ Requires cloud-vinyl operator >= 0.4.2.
1994
+
1995
+ ---
1996
+
1997
+ ##### `shardHealthy`<sup>Optional</sup> <a name="shardHealthy" id="@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.shardHealthy"></a>
1998
+
1999
+ ```typescript
2000
+ public readonly shardHealthy: string;
2001
+ ```
2002
+
2003
+ - *Type:* string
2004
+ - *Default:* operator default ("CHOSEN")
2005
+
2006
+ Shard director: which backends the director considers when selecting a shard.
2007
+
2008
+ "CHOSEN" (default) only considers the chosen backend healthy; "ALL" requires all
2009
+ backends to be healthy.
2010
+ Only applied when director is "shard".
2011
+ Requires cloud-vinyl operator >= 0.4.2.
2012
+
2013
+ ---
2014
+
2015
+ ##### `shardRampup`<sup>Optional</sup> <a name="shardRampup" id="@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.shardRampup"></a>
2016
+
2017
+ ```typescript
2018
+ public readonly shardRampup: string;
2019
+ ```
2020
+
2021
+ - *Type:* string
2022
+ - *Default:* operator default ("30s")
2023
+
2024
+ Shard director: time after adding a backend before it receives its full share of traffic, preventing thundering-herd.
2025
+
2026
+ Only applied when director is "shard".
2027
+
2028
+ ---
2029
+
2030
+ ##### `shardReplicas`<sup>Optional</sup> <a name="shardReplicas" id="@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.shardReplicas"></a>
2031
+
2032
+ ```typescript
2033
+ public readonly shardReplicas: number;
2034
+ ```
2035
+
2036
+ - *Type:* number
2037
+ - *Default:* operator default (67)
2038
+
2039
+ Shard director: number of Ketama replicas per backend in the hash ring.
2040
+
2041
+ Only applied when director is "shard".
2042
+
2043
+ ---
2044
+
1976
2045
  ##### `tolerations`<sup>Optional</sup> <a name="tolerations" id="@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.tolerations"></a>
1977
2046
 
1978
2047
  ```typescript
@@ -82,6 +82,11 @@ new PloneVinylCache(chart, 'cache', {
82
82
 
83
83
  Invalidation is enabled by default (PURGE, BAN, xkey). Configure `plone.cachepurging` to point to the VinylCache invalidation proxy endpoint.
84
84
 
85
+ :::{note}
86
+ BAN-based invalidation requires **cloud-vinyl operator ≥ 0.4.2**. Earlier versions accept the spec but do not emit the BAN ACL / handler.
87
+ Starting with 0.4.2 the operator's own pod IP is automatically added to the PURGE ACL, so purges from the operator itself work without additional configuration.
88
+ :::
89
+
85
90
  To disable invalidation:
86
91
 
87
92
  ```typescript
@@ -91,6 +96,23 @@ new PloneVinylCache(chart, 'cache', {
91
96
  });
92
97
  ```
93
98
 
99
+ ### Shard Director Tuning
100
+
101
+ For shard-based load distribution (the default), you can fine-tune the consistent-hash behavior. These options require **cloud-vinyl ≥ 0.4.2** to be honored by the generated VCL.
102
+
103
+ ```typescript
104
+ new PloneVinylCache(chart, 'cache', {
105
+ plone: plone,
106
+ director: 'shard',
107
+ shardBy: 'URL', // hash the request URL instead of Varnish's hash
108
+ shardHealthy: 'ALL', // require all backends healthy (vs. only "CHOSEN")
109
+ shardRampup: '45s', // warm-up window for newly added backends
110
+ shardReplicas: 128, // Ketama replicas per backend
111
+ });
112
+ ```
113
+
114
+ Shard options are ignored for non-shard directors (`round_robin`, `random`, `hash`).
115
+
94
116
  ## Migrating from PloneHttpcache
95
117
 
96
118
  Replace `PloneHttpcache` with `PloneVinylCache`:
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.29" };
121
+ PloneHttpcache[_a] = { fqn: "@bluedynamics/cdk8s-plone.PloneHttpcache", version: "0.1.31" };
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=