@camunda/ccma-shared-types 7.5.0 → 7.7.0
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/dist/_tests/utils/jvmOptions.spec.d.ts +1 -0
- package/dist/approvals/use-cases.const.d.ts +53 -0
- package/dist/approvals/use-cases.const.js +27 -1
- package/dist/approvals/use-cases.const.js.map +2 -2
- package/dist/dtos/ClusterPlanTypeChange.dto.d.ts +60 -0
- package/dist/dtos/ControlV2.dto.d.ts +49 -0
- package/dist/dtos/ControlV2.dto.js +9 -0
- package/dist/dtos/ControlV2.dto.js.map +3 -3
- package/dist/dtos/GenerationVersionsChange.dto.d.ts +51 -0
- package/dist/dtos/GenerationVersionsChange.dto.js +1 -0
- package/dist/dtos/GenerationVersionsChange.dto.js.map +7 -0
- package/dist/dtos/M2mTokenCount.dto.d.ts +41 -0
- package/dist/dtos/M2mTokenCount.dto.js +1 -0
- package/dist/dtos/M2mTokenCount.dto.js.map +7 -0
- package/dist/index.d.ts +11 -6
- package/dist/index.js +52 -0
- package/dist/index.js.map +2 -2
- package/dist/permissions/profile.permissions.js +7 -5
- package/dist/permissions/profile.permissions.js.map +2 -2
- package/dist/search/cluster-search-fields.js +24 -0
- package/dist/search/cluster-search-fields.js.map +2 -2
- package/dist/search/organization-search-fields.js +8 -0
- package/dist/search/organization-search-fields.js.map +2 -2
- package/dist/types/C8ClusterComponentVersions.type.d.ts +10 -0
- package/dist/types/C8ClusterComponentVersions.type.js +5 -0
- package/dist/types/C8ClusterComponentVersions.type.js.map +2 -2
- package/dist/types/ClusterUsageMetrics.type.d.ts +22 -0
- package/dist/utils/jvmOptions.d.ts +80 -0
- package/dist/utils/jvmOptions.js +120 -0
- package/dist/utils/jvmOptions.js.map +7 -0
- package/package.json +1 -1
|
@@ -21,5 +21,15 @@ export interface MutableZeebeClusterVersionsDto {
|
|
|
21
21
|
connectorBridgeEnvVars?: string;
|
|
22
22
|
gatewayEnvVars?: string;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* The mutable versions that are image references.
|
|
26
|
+
*
|
|
27
|
+
* The approval use case `change-generation-versions` writes these two and
|
|
28
|
+
* never an env var field. An env var text can hold a secret, and the payload
|
|
29
|
+
* of a request is a row that every approver reads and that the table keeps.
|
|
30
|
+
* The env var fields change on the direct Edit, as before.
|
|
31
|
+
*/
|
|
32
|
+
export declare const GENERATION_IMAGE_VERSION_KEYS: readonly ["zeebeAnalytics", "elasticSearchCurator"];
|
|
33
|
+
export type GenerationImageVersionsDto = Pick<MutableZeebeClusterVersionsDto, (typeof GENERATION_IMAGE_VERSION_KEYS)[number]>;
|
|
24
34
|
export declare const MutableThings: string[];
|
|
25
35
|
export declare const AllThings: string[];
|
|
@@ -6,6 +6,10 @@ const ImmutableThings = [
|
|
|
6
6
|
"optimize",
|
|
7
7
|
"connectorBridge"
|
|
8
8
|
];
|
|
9
|
+
const GENERATION_IMAGE_VERSION_KEYS = [
|
|
10
|
+
"zeebeAnalytics",
|
|
11
|
+
"elasticSearchCurator"
|
|
12
|
+
];
|
|
9
13
|
const MutableThings = [
|
|
10
14
|
"zeebeAnalytics",
|
|
11
15
|
"elasticSearchCurator",
|
|
@@ -21,6 +25,7 @@ const MutableThings = [
|
|
|
21
25
|
const AllThings = ImmutableThings.concat(MutableThings);
|
|
22
26
|
export {
|
|
23
27
|
AllThings,
|
|
28
|
+
GENERATION_IMAGE_VERSION_KEYS,
|
|
24
29
|
ImmutableThings,
|
|
25
30
|
MutableThings
|
|
26
31
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/types/C8ClusterComponentVersions.type.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nexport interface ZeebeClusterVersionsDto\n extends MutableZeebeClusterVersionsDto,\n ImmutableZeebeClusterVersionsDto {}\n\nexport interface ImmutableZeebeClusterVersionsDto {\n // make sure if you modify something here to also modify ImmutableThings\n elasticSearchOss: string\n // Optional on 8.9+ generations where tasklist + operate run inside the\n // zeebe gateway pod and no longer ship as standalone images.\n operate?: string\n zeebe: string\n // Optional on 8.9+ generations \u2014 see operate above.\n tasklist?: string\n optimize: string\n connectorBridge?: string\n}\nexport const ImmutableThings: string[] = [\n 'elasticSearchOss',\n 'operate',\n 'zeebe',\n 'tasklist',\n 'optimize',\n 'connectorBridge',\n]\n\nexport interface MutableZeebeClusterVersionsDto {\n // make sure if you modify something here to also modify MutableThings\n zeebeAnalytics?: string\n elasticSearchCurator?: string\n operateEnvVars?: string\n zeebeBrokerEnvVars?: string\n zeebeGatewayEnvVars?: string\n tasklistEnvVars?: string\n optimizeEnvVars?: string\n zeebeAnalyticsEnvVars?: string\n connectorBridgeEnvVars?: string\n gatewayEnvVars?: string\n}\nexport const MutableThings: string[] = [\n 'zeebeAnalytics',\n 'elasticSearchCurator',\n 'operateEnvVars',\n 'zeebeBrokerEnvVars',\n 'zeebeGatewayEnvVars',\n 'tasklistEnvVars',\n 'optimizeEnvVars',\n 'zeebeAnalyticsEnvVars',\n 'connectorBridgeEnvVars',\n 'gatewayEnvVars',\n]\nexport const AllThings: string[] = ImmutableThings.concat(MutableThings)\n"],
|
|
5
|
-
"mappings": "AAsBO,MAAM,kBAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;
|
|
4
|
+
"sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nexport interface ZeebeClusterVersionsDto\n extends MutableZeebeClusterVersionsDto,\n ImmutableZeebeClusterVersionsDto {}\n\nexport interface ImmutableZeebeClusterVersionsDto {\n // make sure if you modify something here to also modify ImmutableThings\n elasticSearchOss: string\n // Optional on 8.9+ generations where tasklist + operate run inside the\n // zeebe gateway pod and no longer ship as standalone images.\n operate?: string\n zeebe: string\n // Optional on 8.9+ generations \u2014 see operate above.\n tasklist?: string\n optimize: string\n connectorBridge?: string\n}\nexport const ImmutableThings: string[] = [\n 'elasticSearchOss',\n 'operate',\n 'zeebe',\n 'tasklist',\n 'optimize',\n 'connectorBridge',\n]\n\nexport interface MutableZeebeClusterVersionsDto {\n // make sure if you modify something here to also modify MutableThings\n zeebeAnalytics?: string\n elasticSearchCurator?: string\n operateEnvVars?: string\n zeebeBrokerEnvVars?: string\n zeebeGatewayEnvVars?: string\n tasklistEnvVars?: string\n optimizeEnvVars?: string\n zeebeAnalyticsEnvVars?: string\n connectorBridgeEnvVars?: string\n gatewayEnvVars?: string\n}\n/**\n * The mutable versions that are image references.\n *\n * The approval use case `change-generation-versions` writes these two and\n * never an env var field. An env var text can hold a secret, and the payload\n * of a request is a row that every approver reads and that the table keeps.\n * The env var fields change on the direct Edit, as before.\n */\nexport const GENERATION_IMAGE_VERSION_KEYS = [\n 'zeebeAnalytics',\n 'elasticSearchCurator',\n] as const\n\nexport type GenerationImageVersionsDto = Pick<\n MutableZeebeClusterVersionsDto,\n (typeof GENERATION_IMAGE_VERSION_KEYS)[number]\n>\n\nexport const MutableThings: string[] = [\n 'zeebeAnalytics',\n 'elasticSearchCurator',\n 'operateEnvVars',\n 'zeebeBrokerEnvVars',\n 'zeebeGatewayEnvVars',\n 'tasklistEnvVars',\n 'optimizeEnvVars',\n 'zeebeAnalyticsEnvVars',\n 'connectorBridgeEnvVars',\n 'gatewayEnvVars',\n]\nexport const AllThings: string[] = ImmutableThings.concat(MutableThings)\n"],
|
|
5
|
+
"mappings": "AAsBO,MAAM,kBAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAuBO,MAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AACF;AAOO,MAAM,gBAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,MAAM,YAAsB,gBAAgB,OAAO,aAAa;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -28,6 +28,28 @@ export interface ClusterUsageMetricsData {
|
|
|
28
28
|
generalUsers?: number;
|
|
29
29
|
deployedModels?: number;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* One row of the usage metadata of an organization: the unique task users
|
|
33
|
+
* and the deployed models that console counted for one billing period
|
|
34
|
+
* (`GET api/orgs/:orgId/clusters/usage/value-metrics-metadata`).
|
|
35
|
+
*
|
|
36
|
+
* `startTimestamp` is the start of the contract period that the row belongs
|
|
37
|
+
* to. A row is the whole period, so the list of an organization holds one
|
|
38
|
+
* row for each period that console counted.
|
|
39
|
+
*/
|
|
40
|
+
export interface ClusterUsageMetadataDto {
|
|
41
|
+
id: number;
|
|
42
|
+
orgId: string;
|
|
43
|
+
startTimestamp: string | Date;
|
|
44
|
+
taskUsers: {
|
|
45
|
+
clusterId: string;
|
|
46
|
+
identifier: string;
|
|
47
|
+
}[];
|
|
48
|
+
deployedModels: {
|
|
49
|
+
clusterId: string;
|
|
50
|
+
count: number;
|
|
51
|
+
}[];
|
|
52
|
+
}
|
|
31
53
|
export interface ClusterUsageDataRequest {
|
|
32
54
|
orgStartDateMap: Map<string, {
|
|
33
55
|
startDate: Date;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JVM_OPTION_PATTERN is the syntax of one flag that the CRD accepts. It is not
|
|
3
|
+
* the full check: parseJvmOption also refuses a flag that the Camunda launcher
|
|
4
|
+
* sets, for example `-XX:+ExitOnOutOfMemoryError`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const JVM_OPTION_PATTERN: RegExp;
|
|
7
|
+
/** JVM_OPTION_MAX_LENGTH is the `items:MaxLength` of `jvm.options` in the CRD. */
|
|
8
|
+
export declare const JVM_OPTION_MAX_LENGTH = 256;
|
|
9
|
+
/** JVM_OPTIONS_MAX_ITEMS is the `MaxItems` of `jvm.options` in the CRD. */
|
|
10
|
+
export declare const JVM_OPTIONS_MAX_ITEMS = 64;
|
|
11
|
+
/** JVM_OPTIONS_MODIFICATION_KEYS are the cluster modification keys that hold a list of JVM flags. */
|
|
12
|
+
export declare const JVM_OPTIONS_MODIFICATION_KEYS: readonly ["zeebe.broker.jvm.options", "gateway.jvm.options"];
|
|
13
|
+
/** JvmOptionsModificationKey is one of JVM_OPTIONS_MODIFICATION_KEYS. */
|
|
14
|
+
export type JvmOptionsModificationKey = (typeof JVM_OPTIONS_MODIFICATION_KEYS)[number];
|
|
15
|
+
/** JVM_OPTIONS_TARGETS names the ZeebeCluster spec component whose `jvm.options` each key sets. */
|
|
16
|
+
export declare const JVM_OPTIONS_TARGETS: {
|
|
17
|
+
readonly 'zeebe.broker.jvm.options': "zeebeBroker";
|
|
18
|
+
readonly 'gateway.jvm.options': "gateway";
|
|
19
|
+
};
|
|
20
|
+
/** ParsedJvmOption is a valid flag with the key that names its setting. */
|
|
21
|
+
export type ParsedJvmOption = {
|
|
22
|
+
key: string;
|
|
23
|
+
arg: string;
|
|
24
|
+
};
|
|
25
|
+
/** isJvmOptionsModificationKey tells if `key` is in JVM_OPTIONS_MODIFICATION_KEYS. */
|
|
26
|
+
export declare function isJvmOptionsModificationKey(key: string): key is JvmOptionsModificationKey;
|
|
27
|
+
/**
|
|
28
|
+
* isUnderJvmSpec tells if `key` names a `jvm` object of the spec, or a path in
|
|
29
|
+
* it, for example `zeebe.broker.jvm.options.0`. Only the keys of
|
|
30
|
+
* JVM_OPTIONS_MODIFICATION_KEYS may set it: the plan overlay turns any other
|
|
31
|
+
* such key into a list or an object in the spec.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isUnderJvmSpec(key: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* requiresEnvVarsOverride tells if only a caller with `canOverrideEnvVars` can
|
|
36
|
+
* set the modification key `key`: an `envVars` key, the JVM options keys, and
|
|
37
|
+
* every key under them, because the plan overlay turns a key such as
|
|
38
|
+
* `zeebe.broker.envVars.0` into the same field. The operator merges the JVM
|
|
39
|
+
* options into `JAVA_TOOL_OPTIONS`, and replaces matching flags in
|
|
40
|
+
* `JAVA_OPTS`, so they act like the env vars.
|
|
41
|
+
*/
|
|
42
|
+
export declare function requiresEnvVarsOverride(key: string): boolean;
|
|
43
|
+
type PlanModificationEntry = {
|
|
44
|
+
key: string;
|
|
45
|
+
value?: unknown;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* addsEnvVarsOverrideValue tells if `after` holds an entry with a key that
|
|
49
|
+
* needs `canOverrideEnvVars`, whose key and value are not in `allowed`. A
|
|
50
|
+
* caller without the permission can keep or remove such an entry, but cannot
|
|
51
|
+
* add one or change its value. A removal needs no check, because the
|
|
52
|
+
* activation of a config without the entry removes it too.
|
|
53
|
+
*/
|
|
54
|
+
export declare function addsEnvVarsOverrideValue(allowed: ReadonlyArray<PlanModificationEntry> | undefined, after: ReadonlyArray<PlanModificationEntry> | undefined): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* parseJvmOption returns the key and the flag, or an error message when `arg`
|
|
57
|
+
* is too long, does not match JVM_OPTION_PATTERN, or names a flag that the
|
|
58
|
+
* Camunda launcher sets. Two flags with the same key set the same setting.
|
|
59
|
+
*/
|
|
60
|
+
export declare function parseJvmOption(arg: string): ParsedJvmOption | {
|
|
61
|
+
error: string;
|
|
62
|
+
};
|
|
63
|
+
/** splitJvmOptions splits a stored value on any white space and drops empty tokens. */
|
|
64
|
+
export declare function splitJvmOptions(value: string | undefined): string[];
|
|
65
|
+
/** joinJvmOptions returns the stored form of a list: the flags joined by a space. */
|
|
66
|
+
export declare function joinJvmOptions(options: string[]): string;
|
|
67
|
+
/**
|
|
68
|
+
* validateJvmOptions returns one message per problem of `options`, or an empty
|
|
69
|
+
* array when `options` is valid. `existing` holds the flags that come before
|
|
70
|
+
* `options` in the list. They count for duplicates and for the maximum number
|
|
71
|
+
* of flags, but their own problems are not reported.
|
|
72
|
+
*/
|
|
73
|
+
export declare function validateJvmOptions(options: string[], existing?: string[]): string[];
|
|
74
|
+
/**
|
|
75
|
+
* validateJvmOptionsValue returns one message per problem of the stored value
|
|
76
|
+
* of a JVM options key, or an empty array when the value is valid. The stored
|
|
77
|
+
* value is a string of flags separated by white space.
|
|
78
|
+
*/
|
|
79
|
+
export declare function validateJvmOptionsValue(value: unknown): string[];
|
|
80
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
const JVM_OPTION_PATTERN = /^(-XX:([+-][A-Za-z][A-Za-z0-9_]*|[A-Za-z][A-Za-z0-9_]*=[\x21\x23\x25\x26\x28-\x5b\x5d-\x7e]+)|-X(mx|ms|ss)[0-9]+[kKmMgGtT]?)$/;
|
|
2
|
+
const JVM_OPTION_MAX_LENGTH = 256;
|
|
3
|
+
const JVM_OPTIONS_MAX_ITEMS = 64;
|
|
4
|
+
const JVM_OPTIONS_MODIFICATION_KEYS = [
|
|
5
|
+
"zeebe.broker.jvm.options",
|
|
6
|
+
"gateway.jvm.options"
|
|
7
|
+
];
|
|
8
|
+
const JVM_OPTIONS_TARGETS = {
|
|
9
|
+
"zeebe.broker.jvm.options": "zeebeBroker",
|
|
10
|
+
"gateway.jvm.options": "gateway"
|
|
11
|
+
};
|
|
12
|
+
const SIZE_FLAG_KEYS = {
|
|
13
|
+
"-Xmx": "XX:MaxHeapSize",
|
|
14
|
+
"-Xms": "XX:InitialHeapSize",
|
|
15
|
+
"-Xss": "XX:ThreadStackSize"
|
|
16
|
+
};
|
|
17
|
+
const LAUNCHER_KEYS = ["XX:ExitOnOutOfMemoryError"];
|
|
18
|
+
function isJvmOptionsModificationKey(key) {
|
|
19
|
+
return JVM_OPTIONS_MODIFICATION_KEYS.includes(key);
|
|
20
|
+
}
|
|
21
|
+
const JVM_SPEC_PATHS = JVM_OPTIONS_MODIFICATION_KEYS.map(
|
|
22
|
+
(key) => key.slice(0, -".options".length)
|
|
23
|
+
);
|
|
24
|
+
function isUnderJvmSpec(key) {
|
|
25
|
+
return JVM_SPEC_PATHS.some(
|
|
26
|
+
(path) => key === path || key.startsWith(`${path}.`)
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
function requiresEnvVarsOverride(key) {
|
|
30
|
+
return key.split(".").includes("envVars") || isUnderJvmSpec(key);
|
|
31
|
+
}
|
|
32
|
+
function envVarsOverrideEntries(modifications) {
|
|
33
|
+
return (modifications ?? []).filter(({ key }) => requiresEnvVarsOverride(key)).map(({ key, value }) => JSON.stringify([key, String(value)]));
|
|
34
|
+
}
|
|
35
|
+
function addsEnvVarsOverrideValue(allowed, after) {
|
|
36
|
+
const known = new Set(envVarsOverrideEntries(allowed));
|
|
37
|
+
return envVarsOverrideEntries(after).some((entry) => !known.has(entry));
|
|
38
|
+
}
|
|
39
|
+
function keyOf(arg) {
|
|
40
|
+
if (arg.startsWith("-XX:")) {
|
|
41
|
+
const name = arg.slice("-XX:".length).replace(/^[+-]+/, "").split("=")[0];
|
|
42
|
+
return name === "" ? "" : `XX:${name}`;
|
|
43
|
+
}
|
|
44
|
+
return SIZE_FLAG_KEYS[arg.slice(0, 4)] ?? "";
|
|
45
|
+
}
|
|
46
|
+
function parseJvmOption(arg) {
|
|
47
|
+
if (arg.length > JVM_OPTION_MAX_LENGTH) {
|
|
48
|
+
return {
|
|
49
|
+
error: `"${arg}" is longer than ${JVM_OPTION_MAX_LENGTH} characters`
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (!JVM_OPTION_PATTERN.test(arg)) {
|
|
53
|
+
return {
|
|
54
|
+
error: `"${arg}" is not a JVM flag of the form -XX:+Name, -XX:-Name, -XX:Name=value or -Xmx, -Xms, -Xss with a size, where a value is printable ASCII without spaces, quotes, $ or backslashes`
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const key = keyOf(arg);
|
|
58
|
+
if (LAUNCHER_KEYS.includes(key)) {
|
|
59
|
+
return {
|
|
60
|
+
error: `"${arg}" cannot be changed, because the Camunda launcher sets it on the command line`
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return { key, arg };
|
|
64
|
+
}
|
|
65
|
+
function splitJvmOptions(value) {
|
|
66
|
+
return value?.split(/\s+/).filter(Boolean) ?? [];
|
|
67
|
+
}
|
|
68
|
+
function joinJvmOptions(options) {
|
|
69
|
+
return options.join(" ");
|
|
70
|
+
}
|
|
71
|
+
function validateJvmOptions(options, existing = []) {
|
|
72
|
+
const errors = [];
|
|
73
|
+
const firstByKey = /* @__PURE__ */ new Map();
|
|
74
|
+
for (const arg of existing) {
|
|
75
|
+
const parsed = parseJvmOption(arg);
|
|
76
|
+
if (!("error" in parsed) && !firstByKey.has(parsed.key)) {
|
|
77
|
+
firstByKey.set(parsed.key, arg);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
for (const arg of options) {
|
|
81
|
+
const parsed = parseJvmOption(arg);
|
|
82
|
+
if ("error" in parsed) {
|
|
83
|
+
errors.push(parsed.error);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const first = firstByKey.get(parsed.key);
|
|
87
|
+
if (first === void 0) {
|
|
88
|
+
firstByKey.set(parsed.key, arg);
|
|
89
|
+
} else {
|
|
90
|
+
errors.push(`"${arg}" sets the same flag as "${first}"`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (existing.length + options.length > JVM_OPTIONS_MAX_ITEMS) {
|
|
94
|
+
errors.push(`Use at most ${JVM_OPTIONS_MAX_ITEMS} JVM flags`);
|
|
95
|
+
}
|
|
96
|
+
return errors;
|
|
97
|
+
}
|
|
98
|
+
function validateJvmOptionsValue(value) {
|
|
99
|
+
if (typeof value !== "string") {
|
|
100
|
+
return ["JVM options must be a string of flags"];
|
|
101
|
+
}
|
|
102
|
+
return validateJvmOptions(splitJvmOptions(value));
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
JVM_OPTIONS_MAX_ITEMS,
|
|
106
|
+
JVM_OPTIONS_MODIFICATION_KEYS,
|
|
107
|
+
JVM_OPTIONS_TARGETS,
|
|
108
|
+
JVM_OPTION_MAX_LENGTH,
|
|
109
|
+
JVM_OPTION_PATTERN,
|
|
110
|
+
addsEnvVarsOverrideValue,
|
|
111
|
+
isJvmOptionsModificationKey,
|
|
112
|
+
isUnderJvmSpec,
|
|
113
|
+
joinJvmOptions,
|
|
114
|
+
parseJvmOption,
|
|
115
|
+
requiresEnvVarsOverride,
|
|
116
|
+
splitJvmOptions,
|
|
117
|
+
validateJvmOptions,
|
|
118
|
+
validateJvmOptionsValue
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=jvmOptions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/jvmOptions.ts"],
|
|
4
|
+
"sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\n// Port of the parsing rules in pkg/jvm/options.go and of the limits in the\n// JVMSpec kubebuilder markers in api/cloud/v1alpha1/zeebecluster_types.go, both\n// in camunda/camunda-operator. The operator rejects flags that do not match, so\n// change both files together.\n\n/**\n * JVM_OPTION_PATTERN is the syntax of one flag that the CRD accepts. It is not\n * the full check: parseJvmOption also refuses a flag that the Camunda launcher\n * sets, for example `-XX:+ExitOnOutOfMemoryError`.\n */\nexport const JVM_OPTION_PATTERN =\n /^(-XX:([+-][A-Za-z][A-Za-z0-9_]*|[A-Za-z][A-Za-z0-9_]*=[\\x21\\x23\\x25\\x26\\x28-\\x5b\\x5d-\\x7e]+)|-X(mx|ms|ss)[0-9]+[kKmMgGtT]?)$/\n\n/** JVM_OPTION_MAX_LENGTH is the `items:MaxLength` of `jvm.options` in the CRD. */\nexport const JVM_OPTION_MAX_LENGTH = 256\n\n/** JVM_OPTIONS_MAX_ITEMS is the `MaxItems` of `jvm.options` in the CRD. */\nexport const JVM_OPTIONS_MAX_ITEMS = 64\n\n/** JVM_OPTIONS_MODIFICATION_KEYS are the cluster modification keys that hold a list of JVM flags. */\nexport const JVM_OPTIONS_MODIFICATION_KEYS = [\n 'zeebe.broker.jvm.options',\n 'gateway.jvm.options',\n] as const\n\n/** JvmOptionsModificationKey is one of JVM_OPTIONS_MODIFICATION_KEYS. */\nexport type JvmOptionsModificationKey =\n (typeof JVM_OPTIONS_MODIFICATION_KEYS)[number]\n\n/** JVM_OPTIONS_TARGETS names the ZeebeCluster spec component whose `jvm.options` each key sets. */\nexport const JVM_OPTIONS_TARGETS = {\n 'zeebe.broker.jvm.options': 'zeebeBroker',\n 'gateway.jvm.options': 'gateway',\n} as const satisfies Record<\n JvmOptionsModificationKey,\n 'zeebeBroker' | 'gateway'\n>\n\n// -Xmx, -Xms and -Xss set the same setting as their -XX spelling\nconst SIZE_FLAG_KEYS: Record<string, string> = {\n '-Xmx': 'XX:MaxHeapSize',\n '-Xms': 'XX:InitialHeapSize',\n '-Xss': 'XX:ThreadStackSize',\n}\n\n// the Camunda launcher passes these after JAVA_OPTS, so no option can change them\nconst LAUNCHER_KEYS = ['XX:ExitOnOutOfMemoryError']\n\n/** ParsedJvmOption is a valid flag with the key that names its setting. */\nexport type ParsedJvmOption = { key: string; arg: string }\n\n/** isJvmOptionsModificationKey tells if `key` is in JVM_OPTIONS_MODIFICATION_KEYS. */\nexport function isJvmOptionsModificationKey(\n key: string,\n): key is JvmOptionsModificationKey {\n return (JVM_OPTIONS_MODIFICATION_KEYS as readonly string[]).includes(key)\n}\n\n// The `jvm` objects of the spec that JVM_OPTIONS_MODIFICATION_KEYS set a list in.\nconst JVM_SPEC_PATHS = JVM_OPTIONS_MODIFICATION_KEYS.map((key) =>\n key.slice(0, -'.options'.length),\n)\n\n/**\n * isUnderJvmSpec tells if `key` names a `jvm` object of the spec, or a path in\n * it, for example `zeebe.broker.jvm.options.0`. Only the keys of\n * JVM_OPTIONS_MODIFICATION_KEYS may set it: the plan overlay turns any other\n * such key into a list or an object in the spec.\n */\nexport function isUnderJvmSpec(key: string): boolean {\n return JVM_SPEC_PATHS.some(\n (path) => key === path || key.startsWith(`${path}.`),\n )\n}\n\n/**\n * requiresEnvVarsOverride tells if only a caller with `canOverrideEnvVars` can\n * set the modification key `key`: an `envVars` key, the JVM options keys, and\n * every key under them, because the plan overlay turns a key such as\n * `zeebe.broker.envVars.0` into the same field. The operator merges the JVM\n * options into `JAVA_TOOL_OPTIONS`, and replaces matching flags in\n * `JAVA_OPTS`, so they act like the env vars.\n */\nexport function requiresEnvVarsOverride(key: string): boolean {\n return key.split('.').includes('envVars') || isUnderJvmSpec(key)\n}\n\ntype PlanModificationEntry = { key: string; value?: unknown }\n\n// One string for each entry with a key that requiresEnvVarsOverride names, so\n// that a Set compares the key and the value together.\nfunction envVarsOverrideEntries(\n modifications: ReadonlyArray<PlanModificationEntry> | undefined,\n): string[] {\n return (modifications ?? [])\n .filter(({ key }) => requiresEnvVarsOverride(key))\n .map(({ key, value }) => JSON.stringify([key, String(value)]))\n}\n\n/**\n * addsEnvVarsOverrideValue tells if `after` holds an entry with a key that\n * needs `canOverrideEnvVars`, whose key and value are not in `allowed`. A\n * caller without the permission can keep or remove such an entry, but cannot\n * add one or change its value. A removal needs no check, because the\n * activation of a config without the entry removes it too.\n */\nexport function addsEnvVarsOverrideValue(\n allowed: ReadonlyArray<PlanModificationEntry> | undefined,\n after: ReadonlyArray<PlanModificationEntry> | undefined,\n): boolean {\n const known = new Set(envVarsOverrideEntries(allowed))\n return envVarsOverrideEntries(after).some((entry) => !known.has(entry))\n}\n\nfunction keyOf(arg: string): string {\n if (arg.startsWith('-XX:')) {\n const name = arg\n .slice('-XX:'.length)\n .replace(/^[+-]+/, '')\n .split('=')[0]\n return name === '' ? '' : `XX:${name}`\n }\n return SIZE_FLAG_KEYS[arg.slice(0, 4)] ?? ''\n}\n\n/**\n * parseJvmOption returns the key and the flag, or an error message when `arg`\n * is too long, does not match JVM_OPTION_PATTERN, or names a flag that the\n * Camunda launcher sets. Two flags with the same key set the same setting.\n */\nexport function parseJvmOption(\n arg: string,\n): ParsedJvmOption | { error: string } {\n if (arg.length > JVM_OPTION_MAX_LENGTH) {\n return {\n error: `\"${arg}\" is longer than ${JVM_OPTION_MAX_LENGTH} characters`,\n }\n }\n\n if (!JVM_OPTION_PATTERN.test(arg)) {\n return {\n error: `\"${arg}\" is not a JVM flag of the form -XX:+Name, -XX:-Name, -XX:Name=value or -Xmx, -Xms, -Xss with a size, where a value is printable ASCII without spaces, quotes, $ or backslashes`,\n }\n }\n\n const key = keyOf(arg)\n if (LAUNCHER_KEYS.includes(key)) {\n return {\n error: `\"${arg}\" cannot be changed, because the Camunda launcher sets it on the command line`,\n }\n }\n\n return { key, arg }\n}\n\n/** splitJvmOptions splits a stored value on any white space and drops empty tokens. */\nexport function splitJvmOptions(value: string | undefined): string[] {\n return value?.split(/\\s+/).filter(Boolean) ?? []\n}\n\n/** joinJvmOptions returns the stored form of a list: the flags joined by a space. */\nexport function joinJvmOptions(options: string[]): string {\n return options.join(' ')\n}\n\n/**\n * validateJvmOptions returns one message per problem of `options`, or an empty\n * array when `options` is valid. `existing` holds the flags that come before\n * `options` in the list. They count for duplicates and for the maximum number\n * of flags, but their own problems are not reported.\n */\nexport function validateJvmOptions(\n options: string[],\n existing: string[] = [],\n): string[] {\n const errors: string[] = []\n const firstByKey = new Map<string, string>()\n\n for (const arg of existing) {\n const parsed = parseJvmOption(arg)\n if (!('error' in parsed) && !firstByKey.has(parsed.key)) {\n firstByKey.set(parsed.key, arg)\n }\n }\n\n for (const arg of options) {\n const parsed = parseJvmOption(arg)\n if ('error' in parsed) {\n errors.push(parsed.error)\n continue\n }\n\n const first = firstByKey.get(parsed.key)\n if (first === undefined) {\n firstByKey.set(parsed.key, arg)\n } else {\n errors.push(`\"${arg}\" sets the same flag as \"${first}\"`)\n }\n }\n\n if (existing.length + options.length > JVM_OPTIONS_MAX_ITEMS) {\n errors.push(`Use at most ${JVM_OPTIONS_MAX_ITEMS} JVM flags`)\n }\n\n return errors\n}\n\n/**\n * validateJvmOptionsValue returns one message per problem of the stored value\n * of a JVM options key, or an empty array when the value is valid. The stored\n * value is a string of flags separated by white space.\n */\nexport function validateJvmOptionsValue(value: unknown): string[] {\n if (typeof value !== 'string') {\n return ['JVM options must be a string of flags']\n }\n return validateJvmOptions(splitJvmOptions(value))\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED