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.
@@ -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). The sidecar reads its license JWT from a
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`. Each forwarder has a different
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: chart-managed Secret by default (JWT inlined into
31
- * `log10xLicenseJwt`), or user-supplied Secret via
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. `['log10x']` is
142
- * the chart default (SaaS Prometheus); additional / replacement
143
- * backends are wired via `tenx.extraArgs` (`@run/output/metric/<b>`)
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 pattern
284
- * (`TENX_LICENSE_FILE=/etc/tenx/license/license.jwt`). For demo licenses
285
- * the caller's pre-install step still has to create the Secret — there
286
- * is no "inline JWT" path for the Receiver. The chart values belong to
287
- * the user's upstream chart, which interprets no Log10x-specific
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). The sidecar reads its license JWT from a
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`. Each forwarder has a different
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: chart-managed Secret by default (JWT inlined into
31
- * `log10xLicenseJwt`), or user-supplied Secret via
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
- * additional metrics backends (beyond the chart-default `log10x`) and
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 (default `['log10x']` and
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 pattern
194
- * (`TENX_LICENSE_FILE=/etc/tenx/license/license.jwt`). For demo licenses
195
- * the caller's pre-install step still has to create the Secret — there
196
- * is no "inline JWT" path for the Receiver. The chart values belong to
197
- * the user's upstream chart, which interprets no Log10x-specific
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
- ` - name: TENX_LICENSE_FILE`,
319
- ` value: /etc/tenx/license/license.jwt`,
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
- return `extraContainers:
350
- - name: log10x
351
- image: ${EDGE_MANIFEST_IMAGE}
352
- imagePullPolicy: IfNotPresent
353
- args:
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
- resources:
362
- requests: { cpu: 100m, memory: 256Mi }
363
- limits: { cpu: 500m, memory: 512Mi }
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
- ` - name: TENX_LICENSE_FILE`,
687
- ` value: /etc/tenx/license/license.jwt`,
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 in
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. Always emits
849
- // TENX_LICENSE_FILE + TENX_RUN_ARGS; appends TENX_AIRGAPPED and
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
- ` - name: TENX_LICENSE_FILE`,
857
- ` value: /etc/tenx/license/license.jwt`,
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
- ` - name: TENX_LICENSE_FILE`,
1024
- ` value: /etc/tenx/license/license.jwt`,
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 = isDemoLicense === false
1474
- ? `log10xLicenseJwt: "" # Provided via the Secret below (create it before \`helm upgrade\`)
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
- : `log10xLicenseJwt: "${licenseJwt}"`;
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}