log10x-mcp 1.30.22 → 1.30.23
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/build/lib/advisor/envelope.d.ts +1 -1
- package/build/lib/advisor/reporter-forwarders.d.ts +32 -13
- package/build/lib/advisor/reporter-forwarders.js +148 -94
- package/build/lib/advisor/reporter-forwarders.js.map +1 -1
- package/build/lib/advisor/reporter.d.ts +18 -10
- package/build/lib/advisor/reporter.js +38 -14
- package/build/lib/advisor/reporter.js.map +1 -1
- package/build/lib/advisor/retriever.d.ts +6 -0
- package/build/lib/advisor/retriever.js +5 -3
- package/build/lib/advisor/retriever.js.map +1 -1
- package/build/lib/advisor/types.d.ts +3 -1
- package/build/lib/cdk-recipes.js +17 -5
- package/build/lib/cdk-recipes.js.map +1 -1
- package/build/lib/discovery/types.d.ts +15 -10
- package/build/lib/offload-recipes.js +7 -5
- package/build/lib/offload-recipes.js.map +1 -1
- package/build/lib/runtime-image.d.ts +5 -2
- package/build/lib/runtime-image.js +5 -2
- package/build/lib/runtime-image.js.map +1 -1
- package/build/product-kb/docs/engine/launcher/extension.md +20 -20
- package/build/product-kb/docs/summary.md +0 -1
- package/build/tools/advise-install.d.ts +25 -18
- package/build/tools/advise-install.js +150 -89
- package/build/tools/advise-install.js.map +1 -1
- package/build/tools/advise-retriever.d.ts +5 -5
- package/build/tools/advise-retriever.js +25 -9
- package/build/tools/advise-retriever.js.map +1 -1
- package/package.json +1 -1
- package/build/product-kb/docs/run/output/event/dev/index.md +0 -351
|
@@ -24,7 +24,7 @@ import { type StructuredOutput } from '../output-types.js';
|
|
|
24
24
|
* it is not introspected.
|
|
25
25
|
* failed and the plan was emitted with REPLACE_WITH_LICENSE_JWT).
|
|
26
26
|
*/
|
|
27
|
-
export type PlanLicenseKind = 'user-scoped' | 'demo' | 'user-pasted' | 'placeholder';
|
|
27
|
+
export type PlanLicenseKind = 'user-scoped' | 'demo' | 'user-pasted' | 'placeholder' | 'builtin';
|
|
28
28
|
export interface AdvisePlanSummary {
|
|
29
29
|
ok: boolean;
|
|
30
30
|
app: 'reporter' | 'receiver' | 'retriever';
|
|
@@ -8,9 +8,12 @@
|
|
|
8
8
|
* the user's existing forwarder pod via a values overlay
|
|
9
9
|
* (`extraContainers` + `extraVolumes` + per-chart config rewiring).
|
|
10
10
|
* The forwarder chart is always the UPSTREAM one (no Log10x
|
|
11
|
-
* repackages).
|
|
11
|
+
* repackages). With a licence JWT, the sidecar reads it from a
|
|
12
12
|
* Kubernetes Secret mounted at `/etc/tenx/license/license.jwt`
|
|
13
|
-
* via `TENX_LICENSE_FILE`.
|
|
13
|
+
* via `TENX_LICENSE_FILE`. With none (the default), the overlay
|
|
14
|
+
* carries no licence env, volume or mount, and the engine runs its
|
|
15
|
+
* built-in evaluation licence: 10 nodes, 30 days from each start,
|
|
16
|
+
* airgapped. Each forwarder has a different
|
|
14
17
|
* config-rewiring shape (Fluent Bit replaces `config:`, OTel
|
|
15
18
|
* deep-merges `config:`, Vector replaces `customConfig`, Logstash
|
|
16
19
|
* uses `logstashConfig` + `logstashPipeline`, Fluentd needs a
|
|
@@ -27,8 +30,11 @@
|
|
|
27
30
|
* Read-only, zero-touch. The chart uses a flat values layout with
|
|
28
31
|
* `log10xLicenseJwt` at the top level and a `tenx:` block ONLY for
|
|
29
32
|
* engine resource overrides / extraArgs / extraEnv. License
|
|
30
|
-
* delivery:
|
|
31
|
-
* `log10xLicenseJwt`
|
|
33
|
+
* delivery: none by default (chart 1.2.0+ renders no Secret, env or
|
|
34
|
+
* mount when `log10xLicenseJwt` is empty, and the engine runs its
|
|
35
|
+
* built-in evaluation licence), a chart-managed Secret for a demo
|
|
36
|
+
* or pasted JWT (inlined into `log10xLicenseJwt`), or a
|
|
37
|
+
* user-supplied Secret via
|
|
32
38
|
* `licenseSecret.{create:false, existingSecret, secretKey}` for
|
|
33
39
|
* real (non-demo) licenses.
|
|
34
40
|
*
|
|
@@ -119,6 +125,14 @@ export interface ForwarderSpec {
|
|
|
119
125
|
licenseSecretName?: string;
|
|
120
126
|
/** Key inside the Secret whose value is the JWT (when isDemoLicense=false). */
|
|
121
127
|
licenseSecretKey?: string;
|
|
128
|
+
/**
|
|
129
|
+
* True when the plan carries no licence at all. The engine then runs its
|
|
130
|
+
* built-in evaluation licence (10 nodes, 30 days from each start,
|
|
131
|
+
* airgapped), and the overlay must name no licence: a TENX_LICENSE_FILE
|
|
132
|
+
* pointing at a file that is not there, or a volume naming a Secret that
|
|
133
|
+
* does not exist, keeps the pod from starting.
|
|
134
|
+
*/
|
|
135
|
+
builtinLicense?: boolean;
|
|
122
136
|
releaseName: string;
|
|
123
137
|
destination: OutputDestination;
|
|
124
138
|
outputHost?: string;
|
|
@@ -138,9 +152,10 @@ export interface ForwarderSpec {
|
|
|
138
152
|
*/
|
|
139
153
|
readOnly?: boolean;
|
|
140
154
|
/**
|
|
141
|
-
* Metrics backends the engine emits TenXSummary to
|
|
142
|
-
* the
|
|
143
|
-
*
|
|
155
|
+
* Metrics backends the engine emits TenXSummary to: the user's own
|
|
156
|
+
* TSDBs. `log10x` (the hosted TSDB behind the public demo) adds no
|
|
157
|
+
* output module here and appears only when passed explicitly. Backends
|
|
158
|
+
* are wired via `tenx.extraArgs` (`@run/output/metric/<b>`)
|
|
144
159
|
* and `tenx.extraEnv` (vendor-specific env vars).
|
|
145
160
|
*/
|
|
146
161
|
backends?: MetricsBackendKind[];
|
|
@@ -198,6 +213,8 @@ export interface ForwarderSpec {
|
|
|
198
213
|
airgapped?: boolean;
|
|
199
214
|
licenseSecretName: string;
|
|
200
215
|
licenseSecretKey: string;
|
|
216
|
+
/** No licence: the patch carries no licence env, volume or mount. */
|
|
217
|
+
builtinLicense?: boolean;
|
|
201
218
|
}) => import('./types.js').PlanFile[];
|
|
202
219
|
/**
|
|
203
220
|
* Optional: extra command-line flags appended to the
|
|
@@ -280,12 +297,14 @@ export declare function defaultSecretNameFor(kind: MetricsBackendKind): string;
|
|
|
280
297
|
* it at column 0 of the values overlay. The two top-level keys it emits
|
|
281
298
|
* are `extraContainers:` and `extraVolumes:`.
|
|
282
299
|
*
|
|
283
|
-
* License delivery: always via the Secret-mounted file
|
|
284
|
-
* (`TENX_LICENSE_FILE=/etc/tenx/license/license.jwt`). For demo
|
|
285
|
-
* the caller's pre-install step still has to create the Secret
|
|
286
|
-
* is no "inline JWT" path for the Receiver. The chart values
|
|
287
|
-
* the user's upstream chart, which interprets no
|
|
288
|
-
* top-level field.
|
|
300
|
+
* License delivery: with a JWT, always via the Secret-mounted file
|
|
301
|
+
* pattern (`TENX_LICENSE_FILE=/etc/tenx/license/license.jwt`). For demo
|
|
302
|
+
* licenses the caller's pre-install step still has to create the Secret,
|
|
303
|
+
* since there is no "inline JWT" path for the Receiver. The chart values
|
|
304
|
+
* belong to the user's upstream chart, which interprets no
|
|
305
|
+
* Log10x-specific top-level field. With `builtinLicense`, the block
|
|
306
|
+
* carries no licence env, no volumeMounts and no extraVolumes, and the
|
|
307
|
+
* engine runs its built-in evaluation licence.
|
|
289
308
|
*/
|
|
290
309
|
/** Name of the policy ConfigMap the engine's kubernetes pull lane reads
|
|
291
310
|
* (matches the engine's $K8S_CONFIGMAP default and configure_engine's
|
|
@@ -8,9 +8,12 @@
|
|
|
8
8
|
* the user's existing forwarder pod via a values overlay
|
|
9
9
|
* (`extraContainers` + `extraVolumes` + per-chart config rewiring).
|
|
10
10
|
* The forwarder chart is always the UPSTREAM one (no Log10x
|
|
11
|
-
* repackages).
|
|
11
|
+
* repackages). With a licence JWT, the sidecar reads it from a
|
|
12
12
|
* Kubernetes Secret mounted at `/etc/tenx/license/license.jwt`
|
|
13
|
-
* via `TENX_LICENSE_FILE`.
|
|
13
|
+
* via `TENX_LICENSE_FILE`. With none (the default), the overlay
|
|
14
|
+
* carries no licence env, volume or mount, and the engine runs its
|
|
15
|
+
* built-in evaluation licence: 10 nodes, 30 days from each start,
|
|
16
|
+
* airgapped. Each forwarder has a different
|
|
14
17
|
* config-rewiring shape (Fluent Bit replaces `config:`, OTel
|
|
15
18
|
* deep-merges `config:`, Vector replaces `customConfig`, Logstash
|
|
16
19
|
* uses `logstashConfig` + `logstashPipeline`, Fluentd needs a
|
|
@@ -27,8 +30,11 @@
|
|
|
27
30
|
* Read-only, zero-touch. The chart uses a flat values layout with
|
|
28
31
|
* `log10xLicenseJwt` at the top level and a `tenx:` block ONLY for
|
|
29
32
|
* engine resource overrides / extraArgs / extraEnv. License
|
|
30
|
-
* delivery:
|
|
31
|
-
* `log10xLicenseJwt`
|
|
33
|
+
* delivery: none by default (chart 1.2.0+ renders no Secret, env or
|
|
34
|
+
* mount when `log10xLicenseJwt` is empty, and the engine runs its
|
|
35
|
+
* built-in evaluation licence), a chart-managed Secret for a demo
|
|
36
|
+
* or pasted JWT (inlined into `log10xLicenseJwt`), or a
|
|
37
|
+
* user-supplied Secret via
|
|
32
38
|
* `licenseSecret.{create:false, existingSecret, secretKey}` for
|
|
33
39
|
* real (non-demo) licenses.
|
|
34
40
|
*
|
|
@@ -109,10 +115,10 @@ export function defaultSecretNameFor(kind) {
|
|
|
109
115
|
}
|
|
110
116
|
/**
|
|
111
117
|
* Render the `tenx.extraArgs` + `tenx.extraEnv` blocks that wire up
|
|
112
|
-
*
|
|
118
|
+
* the user's metrics backends (`log10x` adds no module) and
|
|
113
119
|
* the `TENX_AIRGAPPED` env var for Receiver inline overlays.
|
|
114
120
|
*
|
|
115
|
-
* Emits nothing when there's nothing to add (
|
|
121
|
+
* Emits nothing when there's nothing to add (no non-log10x backend and
|
|
116
122
|
* not airgapped). Always emits 2-space-indented YAML to nest under
|
|
117
123
|
* `tenx:`.
|
|
118
124
|
*
|
|
@@ -190,12 +196,14 @@ function legacyElasticSelector(releaseName, chartSubstring) {
|
|
|
190
196
|
* it at column 0 of the values overlay. The two top-level keys it emits
|
|
191
197
|
* are `extraContainers:` and `extraVolumes:`.
|
|
192
198
|
*
|
|
193
|
-
* License delivery: always via the Secret-mounted file
|
|
194
|
-
* (`TENX_LICENSE_FILE=/etc/tenx/license/license.jwt`). For demo
|
|
195
|
-
* the caller's pre-install step still has to create the Secret
|
|
196
|
-
* is no "inline JWT" path for the Receiver. The chart values
|
|
197
|
-
* the user's upstream chart, which interprets no
|
|
198
|
-
* top-level field.
|
|
199
|
+
* License delivery: with a JWT, always via the Secret-mounted file
|
|
200
|
+
* pattern (`TENX_LICENSE_FILE=/etc/tenx/license/license.jwt`). For demo
|
|
201
|
+
* licenses the caller's pre-install step still has to create the Secret,
|
|
202
|
+
* since there is no "inline JWT" path for the Receiver. The chart values
|
|
203
|
+
* belong to the user's upstream chart, which interprets no
|
|
204
|
+
* Log10x-specific top-level field. With `builtinLicense`, the block
|
|
205
|
+
* carries no licence env, no volumeMounts and no extraVolumes, and the
|
|
206
|
+
* engine runs its built-in evaluation licence.
|
|
199
207
|
*/
|
|
200
208
|
/** Name of the policy ConfigMap the engine's kubernetes pull lane reads
|
|
201
209
|
* (matches the engine's $K8S_CONFIGMAP default and configure_engine's
|
|
@@ -314,10 +322,12 @@ function renderLog10xSidecar(opts) {
|
|
|
314
322
|
argLines.push(` - "receiverOptimize"`);
|
|
315
323
|
argLines.push(` - "true"`);
|
|
316
324
|
}
|
|
317
|
-
const envLines =
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
325
|
+
const envLines = opts.builtinLicense
|
|
326
|
+
? []
|
|
327
|
+
: [
|
|
328
|
+
` - name: TENX_LICENSE_FILE`,
|
|
329
|
+
` value: /etc/tenx/license/license.jwt`,
|
|
330
|
+
];
|
|
321
331
|
if (opts.airgapped) {
|
|
322
332
|
envLines.push(` - name: TENX_AIRGAPPED`);
|
|
323
333
|
envLines.push(` value: "true"`);
|
|
@@ -346,21 +356,18 @@ function renderLog10xSidecar(opts) {
|
|
|
346
356
|
}
|
|
347
357
|
}
|
|
348
358
|
envLines.push(...renderPolicyPullEnvLines(' '));
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
${argLines.join('\n')}
|
|
355
|
-
env:
|
|
356
|
-
${envLines.join('\n')}
|
|
359
|
+
// No licence: no mount and no volume. The container then has nothing to
|
|
360
|
+
// wait on, and the engine logs that it runs the built-in evaluation licence.
|
|
361
|
+
const mountBlock = opts.builtinLicense
|
|
362
|
+
? ''
|
|
363
|
+
: `
|
|
357
364
|
volumeMounts:
|
|
358
365
|
- name: tenx-license
|
|
359
366
|
mountPath: /etc/tenx/license
|
|
360
|
-
readOnly: true
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
367
|
+
readOnly: true`;
|
|
368
|
+
const volumeBlock = opts.builtinLicense
|
|
369
|
+
? ''
|
|
370
|
+
: `
|
|
364
371
|
|
|
365
372
|
extraVolumes:
|
|
366
373
|
- name: tenx-license
|
|
@@ -369,6 +376,17 @@ extraVolumes:
|
|
|
369
376
|
items:
|
|
370
377
|
- key: ${opts.licenseSecretKey}
|
|
371
378
|
path: license.jwt`;
|
|
379
|
+
return `extraContainers:
|
|
380
|
+
- name: log10x
|
|
381
|
+
image: ${EDGE_MANIFEST_IMAGE}
|
|
382
|
+
imagePullPolicy: IfNotPresent
|
|
383
|
+
args:
|
|
384
|
+
${argLines.join('\n')}
|
|
385
|
+
env:
|
|
386
|
+
${envLines.join('\n')}${mountBlock}
|
|
387
|
+
resources:
|
|
388
|
+
requests: { cpu: 100m, memory: 256Mi }
|
|
389
|
+
limits: { cpu: 500m, memory: 512Mi }${volumeBlock}`;
|
|
372
390
|
}
|
|
373
391
|
// ── The spec map ──
|
|
374
392
|
export const RECEIVER_FORWARDER_SPECS = {
|
|
@@ -384,7 +402,7 @@ export const RECEIVER_FORWARDER_SPECS = {
|
|
|
384
402
|
hasTenxSidecar: true,
|
|
385
403
|
selectorStyle: 'k8s-recommended',
|
|
386
404
|
selectorLabel: (r) => k8sRecommendedSelector(r),
|
|
387
|
-
renderValues: ({ destination, outputHost, splunkHecToken, optimize, airgapped, licenseSecretName, licenseSecretKey, backends, backendCredentials }) => {
|
|
405
|
+
renderValues: ({ destination, outputHost, splunkHecToken, optimize, airgapped, licenseSecretName, licenseSecretKey, builtinLicense, backends, backendCredentials }) => {
|
|
388
406
|
const sidecar = renderLog10xSidecar({
|
|
389
407
|
backends,
|
|
390
408
|
backendCredentials,
|
|
@@ -393,6 +411,7 @@ export const RECEIVER_FORWARDER_SPECS = {
|
|
|
393
411
|
airgapped,
|
|
394
412
|
licenseSecretName: licenseSecretName ?? 'log10x-license',
|
|
395
413
|
licenseSecretKey: licenseSecretKey ?? 'license-jwt',
|
|
414
|
+
builtinLicense,
|
|
396
415
|
});
|
|
397
416
|
const destOutput = renderFluentBitDestinationOutput(destination, outputHost, splunkHecToken);
|
|
398
417
|
return `# Receiver overlay for Fluent Bit (upstream fluent/fluent-bit chart).
|
|
@@ -668,7 +687,7 @@ podSecurityPolicy:
|
|
|
668
687
|
# on :24225 and writes them to your destinations.
|
|
669
688
|
${fileConfigsBlock}`;
|
|
670
689
|
},
|
|
671
|
-
renderExtraFiles: ({ releaseName, optimize, airgapped, licenseSecretName, licenseSecretKey }) => {
|
|
690
|
+
renderExtraFiles: ({ releaseName, optimize, airgapped, licenseSecretName, licenseSecretKey, builtinLicense }) => {
|
|
672
691
|
const deploymentName = `${releaseName}-fluentd`;
|
|
673
692
|
// engine args for the sidecar — same convention as
|
|
674
693
|
// renderLog10xSidecar but inline because the patch YAML lives
|
|
@@ -682,15 +701,36 @@ ${fileConfigsBlock}`;
|
|
|
682
701
|
argLines.push(` - "receiverOptimize"`);
|
|
683
702
|
argLines.push(` - "true"`);
|
|
684
703
|
}
|
|
685
|
-
const envLines =
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
704
|
+
const envLines = builtinLicense
|
|
705
|
+
? []
|
|
706
|
+
: [
|
|
707
|
+
` - name: TENX_LICENSE_FILE`,
|
|
708
|
+
` value: /etc/tenx/license/license.jwt`,
|
|
709
|
+
];
|
|
689
710
|
if (airgapped) {
|
|
690
711
|
envLines.push(` - name: TENX_AIRGAPPED`);
|
|
691
712
|
envLines.push(` value: "true"`);
|
|
692
713
|
}
|
|
693
714
|
envLines.push(...renderPolicyPullEnvLines(' '));
|
|
715
|
+
// No licence: the patch adds the container only, with no licence
|
|
716
|
+
// mount and no pod volume (see renderLog10xSidecar).
|
|
717
|
+
const patchMounts = builtinLicense
|
|
718
|
+
? ''
|
|
719
|
+
: `
|
|
720
|
+
volumeMounts:
|
|
721
|
+
- name: tenx-license
|
|
722
|
+
mountPath: /etc/tenx/license
|
|
723
|
+
readOnly: true`;
|
|
724
|
+
const patchVolumes = builtinLicense
|
|
725
|
+
? ''
|
|
726
|
+
: `
|
|
727
|
+
volumes:
|
|
728
|
+
- name: tenx-license
|
|
729
|
+
secret:
|
|
730
|
+
secretName: ${licenseSecretName}
|
|
731
|
+
items:
|
|
732
|
+
- key: ${licenseSecretKey}
|
|
733
|
+
path: license.jwt`;
|
|
694
734
|
return [
|
|
695
735
|
{
|
|
696
736
|
path: 'tenx-kustomize/kustomization.yaml',
|
|
@@ -723,21 +763,10 @@ spec:
|
|
|
723
763
|
args:
|
|
724
764
|
${argLines.join('\n')}
|
|
725
765
|
env:
|
|
726
|
-
${envLines.join('\n')}
|
|
727
|
-
volumeMounts:
|
|
728
|
-
- name: tenx-license
|
|
729
|
-
mountPath: /etc/tenx/license
|
|
730
|
-
readOnly: true
|
|
766
|
+
${envLines.join('\n')}${patchMounts}
|
|
731
767
|
resources:
|
|
732
768
|
requests: { cpu: 100m, memory: 256Mi }
|
|
733
|
-
limits: { cpu: 500m, memory: 512Mi }
|
|
734
|
-
volumes:
|
|
735
|
-
- name: tenx-license
|
|
736
|
-
secret:
|
|
737
|
-
secretName: ${licenseSecretName}
|
|
738
|
-
items:
|
|
739
|
-
- key: ${licenseSecretKey}
|
|
740
|
-
path: license.jwt
|
|
769
|
+
limits: { cpu: 500m, memory: 512Mi }${patchVolumes}
|
|
741
770
|
`,
|
|
742
771
|
},
|
|
743
772
|
{
|
|
@@ -831,12 +860,11 @@ bash "%~dp0post-render.sh"
|
|
|
831
860
|
hasTenxSidecar: false,
|
|
832
861
|
selectorStyle: 'k8s-recommended',
|
|
833
862
|
selectorLabel: (r) => k8sRecommendedSelector(r),
|
|
834
|
-
renderValues: ({ optimize, readOnly, backends, backendCredentials, airgapped, licenseSecretName, licenseSecretKey }) => {
|
|
863
|
+
renderValues: ({ optimize, readOnly, backends, backendCredentials, airgapped, licenseSecretName, licenseSecretKey, builtinLicense }) => {
|
|
835
864
|
// Build TENX_RUN_ARGS. Default args wire the filebeat input and
|
|
836
865
|
// the receiver app; optimize/readOnly add their mode flags;
|
|
837
866
|
// non-log10x backends append @run/output/metric/<b> entries so
|
|
838
|
-
// the in-container engine emits metrics to those backends
|
|
839
|
-
// addition to log10x SaaS (the chart default).
|
|
867
|
+
// the in-container engine emits metrics to those backends.
|
|
840
868
|
const nonLog10xBackends = (backends ?? []).filter((b) => b !== 'log10x');
|
|
841
869
|
const runArgs = ['@run/input/forwarder/filebeat', '@apps/receiver'];
|
|
842
870
|
if (optimize)
|
|
@@ -845,16 +873,19 @@ bash "%~dp0post-render.sh"
|
|
|
845
873
|
runArgs.push('receiverReadOnly', 'true');
|
|
846
874
|
for (const b of nonLog10xBackends)
|
|
847
875
|
runArgs.push(`@run/output/metric/${b}`);
|
|
848
|
-
// Build the daemonset.extraEnvs block.
|
|
849
|
-
// TENX_LICENSE_FILE
|
|
876
|
+
// Build the daemonset.extraEnvs block. Emits TENX_RUN_ARGS, plus
|
|
877
|
+
// TENX_LICENSE_FILE when the plan carries a licence (the
|
|
878
|
+
// log10x/filebeat-10x image sets no licence env of its own, so with
|
|
879
|
+
// none the engine runs its built-in evaluation licence); appends TENX_AIRGAPPED and
|
|
850
880
|
// per-backend env vars (secret + plain) when applicable. The
|
|
851
881
|
// backend env-var contract is identical to the sidecar path: the
|
|
852
882
|
// same BACKEND_ENV_SPECS entries, so DD_API_KEY/ELASTIC_API_KEY/etc.
|
|
853
883
|
// come from the same Kubernetes Secret the user creates
|
|
854
884
|
// out-of-band.
|
|
855
885
|
const envLines = [
|
|
856
|
-
|
|
857
|
-
|
|
886
|
+
...(builtinLicense
|
|
887
|
+
? []
|
|
888
|
+
: [` - name: TENX_LICENSE_FILE`, ` value: /etc/tenx/license/license.jwt`]),
|
|
858
889
|
` - name: TENX_RUN_ARGS`,
|
|
859
890
|
` value: "${runArgs.join(' ')}"`,
|
|
860
891
|
];
|
|
@@ -885,6 +916,22 @@ bash "%~dp0post-render.sh"
|
|
|
885
916
|
}
|
|
886
917
|
const secretName = licenseSecretName ?? 'log10x-license';
|
|
887
918
|
const secretKey = licenseSecretKey ?? 'license-jwt';
|
|
919
|
+
const licenseVolumes = builtinLicense
|
|
920
|
+
? ''
|
|
921
|
+
: `
|
|
922
|
+
|
|
923
|
+
extraVolumes:
|
|
924
|
+
- name: tenx-license
|
|
925
|
+
secret:
|
|
926
|
+
secretName: ${secretName}
|
|
927
|
+
items:
|
|
928
|
+
- key: ${secretKey}
|
|
929
|
+
path: license.jwt
|
|
930
|
+
|
|
931
|
+
extraVolumeMounts:
|
|
932
|
+
- name: tenx-license
|
|
933
|
+
mountPath: /etc/tenx/license
|
|
934
|
+
readOnly: true`;
|
|
888
935
|
return `# Receiver overlay for Filebeat (upstream elastic/filebeat chart).
|
|
889
936
|
# Layer on top of your existing values:
|
|
890
937
|
# helm upgrade --install <release> elastic/filebeat \\
|
|
@@ -906,20 +953,7 @@ imagePullPolicy: IfNotPresent
|
|
|
906
953
|
|
|
907
954
|
daemonset:
|
|
908
955
|
extraEnvs:
|
|
909
|
-
${envLines.join('\n')}
|
|
910
|
-
|
|
911
|
-
extraVolumes:
|
|
912
|
-
- name: tenx-license
|
|
913
|
-
secret:
|
|
914
|
-
secretName: ${secretName}
|
|
915
|
-
items:
|
|
916
|
-
- key: ${secretKey}
|
|
917
|
-
path: license.jwt
|
|
918
|
-
|
|
919
|
-
extraVolumeMounts:
|
|
920
|
-
- name: tenx-license
|
|
921
|
-
mountPath: /etc/tenx/license
|
|
922
|
-
readOnly: true
|
|
956
|
+
${envLines.join('\n')}${licenseVolumes}
|
|
923
957
|
|
|
924
958
|
# filebeat.config.inputs loads the unix-socket input that receives
|
|
925
959
|
# processed events back from the engine; the script processor on each
|
|
@@ -1000,7 +1034,7 @@ ${envLines.join('\n')}
|
|
|
1000
1034
|
hasTenxSidecar: true,
|
|
1001
1035
|
selectorStyle: 'k8s-recommended',
|
|
1002
1036
|
selectorLabel: (r) => k8sRecommendedSelector(r),
|
|
1003
|
-
renderValues: ({ destination, outputHost, optimize, airgapped, licenseSecretName, licenseSecretKey }) => {
|
|
1037
|
+
renderValues: ({ destination, outputHost, optimize, airgapped, licenseSecretName, licenseSecretKey, builtinLicense }) => {
|
|
1004
1038
|
// Logstash chart quirks (vs the other receiver overlays):
|
|
1005
1039
|
// - `extraContainers` is a YAML pipe-string, not a list, so the
|
|
1006
1040
|
// log10x container block is inlined here rather than taken from
|
|
@@ -1019,16 +1053,38 @@ ${envLines.join('\n')}
|
|
|
1019
1053
|
argLines.push(` - "receiverOptimize"`);
|
|
1020
1054
|
argLines.push(` - "true"`);
|
|
1021
1055
|
}
|
|
1022
|
-
const envLines =
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1056
|
+
const envLines = builtinLicense
|
|
1057
|
+
? []
|
|
1058
|
+
: [
|
|
1059
|
+
` - name: TENX_LICENSE_FILE`,
|
|
1060
|
+
` value: /etc/tenx/license/license.jwt`,
|
|
1061
|
+
];
|
|
1026
1062
|
if (airgapped) {
|
|
1027
1063
|
envLines.push(` - name: TENX_AIRGAPPED`);
|
|
1028
1064
|
envLines.push(` value: "true"`);
|
|
1029
1065
|
}
|
|
1030
1066
|
envLines.push(...renderPolicyPullEnvLines(' '));
|
|
1031
1067
|
const destOutput = renderLogstashDestinationOutput(destination, outputHost);
|
|
1068
|
+
// No licence: no mount and no secretMounts entry (see renderLog10xSidecar).
|
|
1069
|
+
const licenseMount = builtinLicense
|
|
1070
|
+
? ''
|
|
1071
|
+
: `
|
|
1072
|
+
volumeMounts:
|
|
1073
|
+
- name: tenx-license
|
|
1074
|
+
mountPath: /etc/tenx/license/license.jwt
|
|
1075
|
+
subPath: license.jwt
|
|
1076
|
+
readOnly: true`;
|
|
1077
|
+
const licenseSecretMounts = builtinLicense
|
|
1078
|
+
? ''
|
|
1079
|
+
: `
|
|
1080
|
+
|
|
1081
|
+
# License via the chart's secretMounts (not extraVolumes). subPath
|
|
1082
|
+
# projects the Secret's \`${secretKey}\` key to a single file.
|
|
1083
|
+
secretMounts:
|
|
1084
|
+
- name: tenx-license
|
|
1085
|
+
secretName: ${secretName}
|
|
1086
|
+
path: /etc/tenx/license/license.jwt
|
|
1087
|
+
subPath: ${secretKey}`;
|
|
1032
1088
|
return `# Receiver overlay for Logstash (upstream elastic/logstash chart).
|
|
1033
1089
|
# Layer on top of your existing values:
|
|
1034
1090
|
# helm upgrade --install <release> elastic/logstash \\
|
|
@@ -1043,23 +1099,10 @@ extraContainers: |
|
|
|
1043
1099
|
args:
|
|
1044
1100
|
${argLines.join('\n')}
|
|
1045
1101
|
env:
|
|
1046
|
-
${envLines.join('\n')}
|
|
1047
|
-
volumeMounts:
|
|
1048
|
-
- name: tenx-license
|
|
1049
|
-
mountPath: /etc/tenx/license/license.jwt
|
|
1050
|
-
subPath: license.jwt
|
|
1051
|
-
readOnly: true
|
|
1102
|
+
${envLines.join('\n')}${licenseMount}
|
|
1052
1103
|
resources:
|
|
1053
1104
|
requests: { cpu: 100m, memory: 256Mi }
|
|
1054
|
-
limits: { cpu: 500m, memory: 512Mi }
|
|
1055
|
-
|
|
1056
|
-
# License via the chart's secretMounts (not extraVolumes). subPath
|
|
1057
|
-
# projects the Secret's \`${secretKey}\` key to a single file.
|
|
1058
|
-
secretMounts:
|
|
1059
|
-
- name: tenx-license
|
|
1060
|
-
secretName: ${secretName}
|
|
1061
|
-
path: /etc/tenx/license/license.jwt
|
|
1062
|
-
subPath: ${secretKey}
|
|
1105
|
+
limits: { cpu: 500m, memory: 512Mi }${licenseSecretMounts}
|
|
1063
1106
|
|
|
1064
1107
|
# Two-pipeline driver: ingest runs your filters and hands off to the
|
|
1065
1108
|
# sidecar; destinations consumes returning events filter-free, so
|
|
@@ -1173,7 +1216,7 @@ ${indent(destOutput, 6)}
|
|
|
1173
1216
|
hasTenxSidecar: true,
|
|
1174
1217
|
selectorStyle: 'k8s-recommended',
|
|
1175
1218
|
selectorLabel: (r) => k8sRecommendedSelector(r),
|
|
1176
|
-
renderValues: ({ destination, outputHost, optimize, airgapped, licenseSecretName, licenseSecretKey, backends, backendCredentials }) => {
|
|
1219
|
+
renderValues: ({ destination, outputHost, optimize, airgapped, licenseSecretName, licenseSecretKey, builtinLicense, backends, backendCredentials }) => {
|
|
1177
1220
|
const sidecar = renderLog10xSidecar({
|
|
1178
1221
|
backends,
|
|
1179
1222
|
backendCredentials,
|
|
@@ -1182,6 +1225,7 @@ ${indent(destOutput, 6)}
|
|
|
1182
1225
|
airgapped,
|
|
1183
1226
|
licenseSecretName: licenseSecretName ?? 'log10x-license',
|
|
1184
1227
|
licenseSecretKey: licenseSecretKey ?? 'license-jwt',
|
|
1228
|
+
builtinLicense,
|
|
1185
1229
|
});
|
|
1186
1230
|
const destSink = renderVectorDestinationSink(destination, outputHost);
|
|
1187
1231
|
return `# Receiver overlay for Vector (upstream vector/vector chart).
|
|
@@ -1299,7 +1343,7 @@ ${indent(destSink, 4)}
|
|
|
1299
1343
|
hasTenxSidecar: true,
|
|
1300
1344
|
selectorStyle: 'k8s-recommended',
|
|
1301
1345
|
selectorLabel: (r) => k8sRecommendedSelector(r),
|
|
1302
|
-
renderValues: ({ destination, outputHost, optimize, airgapped, licenseSecretName, licenseSecretKey, backends, backendCredentials }) => {
|
|
1346
|
+
renderValues: ({ destination, outputHost, optimize, airgapped, licenseSecretName, licenseSecretKey, builtinLicense, backends, backendCredentials }) => {
|
|
1303
1347
|
const sidecar = renderLog10xSidecar({
|
|
1304
1348
|
backends,
|
|
1305
1349
|
backendCredentials,
|
|
@@ -1308,6 +1352,7 @@ ${indent(destSink, 4)}
|
|
|
1308
1352
|
airgapped,
|
|
1309
1353
|
licenseSecretName: licenseSecretName ?? 'log10x-license',
|
|
1310
1354
|
licenseSecretKey: licenseSecretKey ?? 'license-jwt',
|
|
1355
|
+
builtinLicense,
|
|
1311
1356
|
});
|
|
1312
1357
|
// OTel destination exporter declaration + the exporter name(s) the
|
|
1313
1358
|
// from-tenx pipeline references. `mock` uses the chart's built-in
|
|
@@ -1439,7 +1484,7 @@ export const STANDALONE_SPEC = {
|
|
|
1439
1484
|
hasTenxSidecar: true,
|
|
1440
1485
|
selectorStyle: 'k8s-recommended',
|
|
1441
1486
|
selectorLabel: (r) => k8sRecommendedSelector(r),
|
|
1442
|
-
renderValues: ({ licenseJwt, isDemoLicense, licenseSecretName, licenseSecretKey, releaseName, backends, backendCredentials, airgapped }) => {
|
|
1487
|
+
renderValues: ({ licenseJwt, isDemoLicense, licenseSecretName, licenseSecretKey, builtinLicense, releaseName, backends, backendCredentials, airgapped }) => {
|
|
1443
1488
|
// reporter-10x uses a flat values layout: top-level log10xLicenseJwt
|
|
1444
1489
|
// + runtimeName (NOT nested under `tenx:`). The chart turns the JWT
|
|
1445
1490
|
// into a Kubernetes Secret and mounts it as a file pointed at by
|
|
@@ -1454,6 +1499,11 @@ export const STANDALONE_SPEC = {
|
|
|
1454
1499
|
// out-of-band. The chart's `licenseSecret.create=false` mode skips
|
|
1455
1500
|
// the auto-Secret generation and mounts the user's existing one.
|
|
1456
1501
|
//
|
|
1502
|
+
// No licence (builtin, the default): emit no licence value at all.
|
|
1503
|
+
// Chart 1.2.0+ renders no Secret, no TENX_LICENSE_FILE and no mount when
|
|
1504
|
+
// `log10xLicenseJwt` is empty and `licenseSecret.create` keeps its
|
|
1505
|
+
// default, and the engine runs its built-in evaluation licence.
|
|
1506
|
+
//
|
|
1457
1507
|
// `gitToken` and `config.git` defaults are deliberately not emitted:
|
|
1458
1508
|
// both match chart defaults, and the chart's secret-template only
|
|
1459
1509
|
// creates the git-token Secret when `config.git.enabled` OR
|
|
@@ -1470,13 +1520,17 @@ export const STANDALONE_SPEC = {
|
|
|
1470
1520
|
const tenxBlock = extras
|
|
1471
1521
|
? `\ntenx:${extras}\n`
|
|
1472
1522
|
: '';
|
|
1473
|
-
const licenseBlock =
|
|
1474
|
-
?
|
|
1523
|
+
const licenseBlock = builtinLicense
|
|
1524
|
+
? `# No license: the engine runs its built-in evaluation license (10 nodes,
|
|
1525
|
+
# 30 days from each start, airgapped). To license it, set log10xLicenseJwt,
|
|
1526
|
+
# or point licenseSecret at a Secret holding the JWT.`
|
|
1527
|
+
: isDemoLicense === false
|
|
1528
|
+
? `log10xLicenseJwt: "" # Provided via the Secret below (create it before \`helm upgrade\`)
|
|
1475
1529
|
licenseSecret:
|
|
1476
1530
|
create: false
|
|
1477
1531
|
existingSecret: ${licenseSecretName ?? 'log10x-license'}
|
|
1478
1532
|
secretKey: ${licenseSecretKey ?? 'license-jwt'}`
|
|
1479
|
-
|
|
1533
|
+
: `log10xLicenseJwt: "${licenseJwt}"`;
|
|
1480
1534
|
return `# reporter-10x: non-invasive parallel DaemonSet.
|
|
1481
1535
|
# Runs alongside the user's existing forwarder without touching it.
|
|
1482
1536
|
${licenseBlock}
|