@serve.zone/interfaces 23.1.0 → 24.0.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/changelog.md +17 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/appstore/types.d.ts +2 -2
- package/dist_ts/appstore/types.js +1 -1
- package/dist_ts/data/clusternode.d.ts +85 -0
- package/dist_ts/data/clusternode.js +355 -1
- package/dist_ts/data/secret.d.ts +51 -4
- package/dist_ts/data/secret.js +326 -10
- package/dist_ts/requests/secret.d.ts +33 -6
- package/dist_ts/requests/secret.js +198 -1
- package/dist_ts/runtime.d.ts +61 -25
- package/dist_ts/runtime.js +256 -93
- package/dist_ts/runtime.workloadinit.d.ts +129 -0
- package/dist_ts/runtime.workloadinit.js +405 -0
- package/package.json +1 -1
- package/readme.md +48 -13
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/appstore/types.ts +2 -2
- package/ts/data/clusternode.ts +513 -0
- package/ts/data/secret.ts +402 -16
- package/ts/requests/secret.ts +248 -6
- package/ts/runtime.ts +399 -137
- package/ts/runtime.workloadinit.ts +582 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-31 - 24.0.0
|
|
4
|
+
|
|
5
|
+
### Breaking Changes
|
|
6
|
+
|
|
7
|
+
- replace pre-cutover secret lifecycle and runtime authority contracts (secrets-runtime)
|
|
8
|
+
- Replace caller-timestamp envelope opening and retiring ingress recipients with active-only recipient metadata and reproducible admission bindings.
|
|
9
|
+
- Add version-specific purge preflight and purgeSecretVersion contracts with revision fences, retention blockers, and durable purge operation metadata.
|
|
10
|
+
- Replace runtime registration v1 self-attested node and WorkloadInit evidence with v2 Cloudly target authority, Spark Swarm observations, and WorkloadInit approval authority contracts.
|
|
11
|
+
|
|
12
|
+
## 2026-07-31 - 23.2.0
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- add registration expectation contract (secret-runtime)
|
|
17
|
+
- Adds getCoreflowSecretRuntimeRegistrationExpectation for JWT-derived secret runtime registration expectations.
|
|
18
|
+
- Exposes a dedicated coreflowSecretRuntimeRegistrationTagId and validation that only accepts identity.jwt in expectation requests.
|
|
19
|
+
|
|
3
20
|
## 2026-07-31 - 23.1.0
|
|
4
21
|
|
|
5
22
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '
|
|
6
|
+
version: '24.0.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type TSecretDelivery, type TSecretGeneratedEncoding, type
|
|
1
|
+
import { type TSecretDelivery, type TSecretGeneratedEncoding, type IActiveSecretRecipientMetadata, type TSecretValueInput } from '../data/secret.js';
|
|
2
2
|
import { type IHostedAppRoleDefinition } from '../data/hostedapp.js';
|
|
3
3
|
import type { IServiceDomainRoute, IServicePublicPortMapping, IServiceTargetPort } from '../data/serviceports.js';
|
|
4
4
|
import type { IStorageCapacityRequest, IStorageClassRequirement, TFilesystemStorageAccessMode, TObjectStorageAccessMode, TObjectStorageDelivery, TStorageReclaimPolicy, TStorageResourceKind, TStorageSnapshotMode } from '../platform/storage.js';
|
|
@@ -292,7 +292,7 @@ export interface IAppStoreInstallRequest {
|
|
|
292
292
|
}>;
|
|
293
293
|
}
|
|
294
294
|
export declare const validateAppStoreEnvironmentDeclarations: (declarationsArg: unknown) => string[];
|
|
295
|
-
export declare const validateAppStoreInstallRequest: (requestArg: unknown, configArg: IAppStoreVersionConfig, activeIngressRecipientArg:
|
|
295
|
+
export declare const validateAppStoreInstallRequest: (requestArg: unknown, configArg: IAppStoreVersionConfig, activeIngressRecipientArg: IActiveSecretRecipientMetadata) => Promise<string[]>;
|
|
296
296
|
export interface IUpgradeableAppStoreService {
|
|
297
297
|
serviceId?: string;
|
|
298
298
|
serviceName: string;
|
|
@@ -282,4 +282,4 @@ export const validateAppStoreInstallRequest = async (requestArg, configArg, acti
|
|
|
282
282
|
}
|
|
283
283
|
return errors;
|
|
284
284
|
};
|
|
285
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9hcHBzdG9yZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsMENBQTBDLEVBQzFDLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsb0NBQW9DLEdBS3JDLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLGdDQUFnQyxHQUVqQyxNQUFNLHNCQUFzQixDQUFDO0FBaUM5QixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRztJQUN2QyxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFlBQVksRUFBRSx1QkFBdUI7SUFDckMsZUFBZSxFQUFFLDJCQUEyQjtJQUM1QyxtQkFBbUIsRUFBRSxnQ0FBZ0M7Q0FDN0MsQ0FBQztBQThLWCxNQUFNLHlCQUF5QixHQUFHLGdDQUFnQyxDQUFDO0FBQ25FLE1BQU0sc0JBQXNCLEdBQUcsMEJBQTBCLENBQUM7QUFFMUQsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsQ0FDcEQsYUFBc0IsRUFDWixFQUFFO0lBQ1osSUFBSSxhQUFhLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNDLElBQUksQ0FBQyxhQUFhLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN4RixPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsYUFBd0MsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxPQUFPLFVBQVUsQ0FBQyxZQUFZLEtBQUssUUFBUTtXQUMxQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztXQUN4QyxVQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7V0FDeEMsVUFBVSxDQUFD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
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9hcHBzdG9yZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsMENBQTBDLEVBQzFDLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsb0NBQW9DLEdBS3JDLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLGdDQUFnQyxHQUVqQyxNQUFNLHNCQUFzQixDQUFDO0FBaUM5QixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRztJQUN2QyxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFlBQVksRUFBRSx1QkFBdUI7SUFDckMsZUFBZSxFQUFFLDJCQUEyQjtJQUM1QyxtQkFBbUIsRUFBRSxnQ0FBZ0M7Q0FDN0MsQ0FBQztBQThLWCxNQUFNLHlCQUF5QixHQUFHLGdDQUFnQyxDQUFDO0FBQ25FLE1BQU0sc0JBQXNCLEdBQUcsMEJBQTBCLENBQUM7QUFFMUQsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsQ0FDcEQsYUFBc0IsRUFDWixFQUFFO0lBQ1osSUFBSSxhQUFhLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNDLElBQUksQ0FBQyxhQUFhLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN4RixPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsYUFBd0MsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxPQUFPLFVBQVUsQ0FBQyxZQUFZLEtBQUssUUFBUTtXQUMxQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztXQUN4QyxVQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7V0FDeEMsVUFBVSxDQUFD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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
+
import type { TSha256Digest, TImmutableContainerPlatform } from './immutableimage.js';
|
|
2
3
|
export interface IClusterNodeMetrics {
|
|
3
4
|
cpuUsagePercent: number;
|
|
4
5
|
memoryUsedMB: number;
|
|
@@ -80,6 +81,89 @@ export interface ISparkActionResultResponse {
|
|
|
80
81
|
accepted: boolean;
|
|
81
82
|
message?: string;
|
|
82
83
|
}
|
|
84
|
+
export interface ISwarmManagerObservedNodeV1 {
|
|
85
|
+
swarmNodeId: string;
|
|
86
|
+
nodeName: string;
|
|
87
|
+
platform: TImmutableContainerPlatform;
|
|
88
|
+
role: 'manager' | 'worker';
|
|
89
|
+
availability: 'active' | 'pause' | 'drain';
|
|
90
|
+
state: 'unknown' | 'down' | 'ready' | 'disconnected';
|
|
91
|
+
managerStatus?: {
|
|
92
|
+
leader: boolean;
|
|
93
|
+
reachability: 'unknown' | 'unreachable' | 'reachable';
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export interface ISwarmManagerSnapshotV1 {
|
|
97
|
+
snapshotVersion: 1;
|
|
98
|
+
snapshotDigest: TSha256Digest;
|
|
99
|
+
nodeCount: number;
|
|
100
|
+
managerCount: number;
|
|
101
|
+
nodes: ISwarmManagerObservedNodeV1[];
|
|
102
|
+
}
|
|
103
|
+
interface ISparkSwarmObservationBaseV1 {
|
|
104
|
+
schemaVersion: 1;
|
|
105
|
+
reporterSessionId: string;
|
|
106
|
+
observationSequence: number;
|
|
107
|
+
observedAt: number;
|
|
108
|
+
}
|
|
109
|
+
export type TSparkSwarmObservationV1 = (ISparkSwarmObservationBaseV1 & {
|
|
110
|
+
state: 'unknown';
|
|
111
|
+
reason: 'docker-unavailable' | 'query-failed' | 'not-initialized';
|
|
112
|
+
}) | (ISparkSwarmObservationBaseV1 & {
|
|
113
|
+
state: 'not-member';
|
|
114
|
+
}) | (ISparkSwarmObservationBaseV1 & {
|
|
115
|
+
state: 'member';
|
|
116
|
+
swarmClusterId: string;
|
|
117
|
+
localSwarmNodeId: string;
|
|
118
|
+
controlAvailable: boolean;
|
|
119
|
+
managerSnapshot?: ISwarmManagerSnapshotV1;
|
|
120
|
+
});
|
|
121
|
+
/** Cloudly derives node and cluster scope from this authenticated Spark request. */
|
|
122
|
+
export interface ISparkSwarmObservationRequest {
|
|
123
|
+
nodeId: string;
|
|
124
|
+
nodeToken: string;
|
|
125
|
+
observation: TSparkSwarmObservationV1;
|
|
126
|
+
}
|
|
127
|
+
export interface ISparkSwarmObservationResponse {
|
|
128
|
+
accepted: boolean;
|
|
129
|
+
acceptedSequence?: number;
|
|
130
|
+
targetGeneration?: number;
|
|
131
|
+
message?: string;
|
|
132
|
+
}
|
|
133
|
+
export interface IClusterRuntimeTargetV1 {
|
|
134
|
+
cloudlyNodeId: string;
|
|
135
|
+
swarmClusterId: string;
|
|
136
|
+
swarmNodeId: string;
|
|
137
|
+
nodeName: string;
|
|
138
|
+
platform: TImmutableContainerPlatform;
|
|
139
|
+
}
|
|
140
|
+
export interface IClusterRuntimeTargetSetReadyV1 {
|
|
141
|
+
schemaVersion: 1;
|
|
142
|
+
state: 'ready';
|
|
143
|
+
cloudlyClusterId: string;
|
|
144
|
+
swarmClusterId: string;
|
|
145
|
+
generation: number;
|
|
146
|
+
targetSetDigest: TSha256Digest;
|
|
147
|
+
acceptedAt: number;
|
|
148
|
+
freshUntil: number;
|
|
149
|
+
targets: IClusterRuntimeTargetV1[];
|
|
150
|
+
}
|
|
151
|
+
export interface IClusterRuntimeTargetSetUnavailableV1 {
|
|
152
|
+
schemaVersion: 1;
|
|
153
|
+
state: 'unavailable';
|
|
154
|
+
cloudlyClusterId: string;
|
|
155
|
+
generation: number;
|
|
156
|
+
changedAt: number;
|
|
157
|
+
reason: 'never-observed' | 'stale' | 'no-manager-consensus' | 'identity-conflict' | 'no-schedulable-targets';
|
|
158
|
+
}
|
|
159
|
+
export type TClusterRuntimeTargetSetV1 = IClusterRuntimeTargetSetReadyV1 | IClusterRuntimeTargetSetUnavailableV1;
|
|
160
|
+
export declare const createSwarmManagerSnapshotDigestInput: (swarmClusterIdArg: string, snapshotArg: ISwarmManagerSnapshotV1) => string;
|
|
161
|
+
export declare const computeSwarmManagerSnapshotDigest: (swarmClusterIdArg: string, snapshotArg: ISwarmManagerSnapshotV1) => Promise<TSha256Digest>;
|
|
162
|
+
export declare const validateSparkSwarmObservation: (observationArg: unknown) => Promise<string[]>;
|
|
163
|
+
export declare const createClusterRuntimeTargetSetDigestInput: (targetSetArg: IClusterRuntimeTargetSetReadyV1) => string;
|
|
164
|
+
export declare const computeClusterRuntimeTargetSetDigest: (targetSetArg: IClusterRuntimeTargetSetReadyV1) => Promise<TSha256Digest>;
|
|
165
|
+
export declare const validateClusterRuntimeTargetSet: (targetSetArg: unknown) => Promise<string[]>;
|
|
166
|
+
export declare const isClusterRuntimeTargetSetFresh: (targetSetArg: TClusterRuntimeTargetSetV1, nowArg: number) => targetSetArg is IClusterRuntimeTargetSetReadyV1;
|
|
83
167
|
export type TSparkNodeMode = 'cloudly' | 'coreflow-node';
|
|
84
168
|
export type TSparkCloudlyConnectionStatus = 'not-configured' | 'connecting' | 'connected' | 'failed';
|
|
85
169
|
export interface ISparkNodeRuntimeInfo {
|
|
@@ -152,3 +236,4 @@ export interface IClusterNode {
|
|
|
152
236
|
requiredDebianPackages: string[];
|
|
153
237
|
};
|
|
154
238
|
}
|
|
239
|
+
export {};
|
|
@@ -1,2 +1,356 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
-
|
|
2
|
+
const runtimeIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
3
|
+
const runtimeDigestRegex = /^sha256:[a-f0-9]{64}$/;
|
|
4
|
+
const runtimePlatforms = new Set([
|
|
5
|
+
'linux/amd64',
|
|
6
|
+
'linux/arm64',
|
|
7
|
+
]);
|
|
8
|
+
const maximumSwarmNodes = 1024;
|
|
9
|
+
const isRuntimeRecord = (valueArg) => (Boolean(valueArg) && typeof valueArg === 'object' && !Array.isArray(valueArg));
|
|
10
|
+
const hasExactRuntimeKeys = (valueArg, keysArg) => JSON.stringify(Object.keys(valueArg).sort()) === JSON.stringify([...keysArg].sort());
|
|
11
|
+
const isRuntimeIdentifier = (valueArg) => (typeof valueArg === 'string' && runtimeIdentifierRegex.test(valueArg));
|
|
12
|
+
const isPositiveSafeInteger = (valueArg) => (Number.isSafeInteger(valueArg) && valueArg > 0);
|
|
13
|
+
const computeSha256 = async (inputArg) => {
|
|
14
|
+
const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(inputArg)));
|
|
15
|
+
return `sha256:${[...digest]
|
|
16
|
+
.map((byteArg) => byteArg.toString(16).padStart(2, '0'))
|
|
17
|
+
.join('')}`;
|
|
18
|
+
};
|
|
19
|
+
const canonicalSwarmNode = (nodeArg) => ({
|
|
20
|
+
swarmNodeId: nodeArg.swarmNodeId,
|
|
21
|
+
nodeName: nodeArg.nodeName,
|
|
22
|
+
platform: nodeArg.platform,
|
|
23
|
+
role: nodeArg.role,
|
|
24
|
+
availability: nodeArg.availability,
|
|
25
|
+
state: nodeArg.state,
|
|
26
|
+
managerStatus: nodeArg.managerStatus
|
|
27
|
+
? {
|
|
28
|
+
leader: nodeArg.managerStatus.leader,
|
|
29
|
+
reachability: nodeArg.managerStatus.reachability,
|
|
30
|
+
}
|
|
31
|
+
: null,
|
|
32
|
+
});
|
|
33
|
+
export const createSwarmManagerSnapshotDigestInput = (swarmClusterIdArg, snapshotArg) => JSON.stringify({
|
|
34
|
+
schemaVersion: 1,
|
|
35
|
+
purpose: 'serve.zone/swarm-manager-snapshot',
|
|
36
|
+
swarmClusterId: swarmClusterIdArg,
|
|
37
|
+
snapshotVersion: snapshotArg.snapshotVersion,
|
|
38
|
+
nodeCount: snapshotArg.nodeCount,
|
|
39
|
+
managerCount: snapshotArg.managerCount,
|
|
40
|
+
nodes: snapshotArg.nodes.map(canonicalSwarmNode),
|
|
41
|
+
});
|
|
42
|
+
export const computeSwarmManagerSnapshotDigest = async (swarmClusterIdArg, snapshotArg) => computeSha256(createSwarmManagerSnapshotDigestInput(swarmClusterIdArg, snapshotArg));
|
|
43
|
+
const validateSwarmManagerSnapshot = async (swarmClusterIdArg, localSwarmNodeIdArg, snapshotArg) => {
|
|
44
|
+
if (!isRuntimeRecord(snapshotArg)
|
|
45
|
+
|| !hasExactRuntimeKeys(snapshotArg, [
|
|
46
|
+
'snapshotVersion',
|
|
47
|
+
'snapshotDigest',
|
|
48
|
+
'nodeCount',
|
|
49
|
+
'managerCount',
|
|
50
|
+
'nodes',
|
|
51
|
+
])) {
|
|
52
|
+
return ['Spark Swarm manager snapshot must use its exact schema'];
|
|
53
|
+
}
|
|
54
|
+
const errors = [];
|
|
55
|
+
if (snapshotArg.snapshotVersion !== 1) {
|
|
56
|
+
errors.push('Spark Swarm manager snapshotVersion must be 1');
|
|
57
|
+
}
|
|
58
|
+
if (typeof snapshotArg.snapshotDigest !== 'string'
|
|
59
|
+
|| !runtimeDigestRegex.test(snapshotArg.snapshotDigest)) {
|
|
60
|
+
errors.push('Spark Swarm manager snapshot digest must be canonical');
|
|
61
|
+
}
|
|
62
|
+
if (!Array.isArray(snapshotArg.nodes)
|
|
63
|
+
|| snapshotArg.nodes.length === 0
|
|
64
|
+
|| snapshotArg.nodes.length > maximumSwarmNodes) {
|
|
65
|
+
errors.push('Spark Swarm manager snapshot nodes must be a non-empty bounded array');
|
|
66
|
+
return errors;
|
|
67
|
+
}
|
|
68
|
+
if (snapshotArg.nodeCount !== snapshotArg.nodes.length
|
|
69
|
+
|| !isPositiveSafeInteger(snapshotArg.nodeCount)) {
|
|
70
|
+
errors.push('Spark Swarm manager snapshot nodeCount must match nodes');
|
|
71
|
+
}
|
|
72
|
+
const nodeIds = new Set();
|
|
73
|
+
const nodeNames = new Set();
|
|
74
|
+
let managerCount = 0;
|
|
75
|
+
let leaderCount = 0;
|
|
76
|
+
let previousSortKey;
|
|
77
|
+
for (const [index, nodeArg] of snapshotArg.nodes.entries()) {
|
|
78
|
+
if (!isRuntimeRecord(nodeArg)) {
|
|
79
|
+
errors.push(`Spark Swarm manager snapshot nodes[${index}] must be an object`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const isManager = nodeArg.role === 'manager';
|
|
83
|
+
const expectedKeys = [
|
|
84
|
+
'swarmNodeId',
|
|
85
|
+
'nodeName',
|
|
86
|
+
'platform',
|
|
87
|
+
'role',
|
|
88
|
+
'availability',
|
|
89
|
+
'state',
|
|
90
|
+
...(isManager ? ['managerStatus'] : []),
|
|
91
|
+
];
|
|
92
|
+
if (!hasExactRuntimeKeys(nodeArg, expectedKeys)) {
|
|
93
|
+
errors.push(`Spark Swarm manager snapshot nodes[${index}] must use its exact role schema`);
|
|
94
|
+
}
|
|
95
|
+
if (!isRuntimeIdentifier(nodeArg.swarmNodeId) || !isRuntimeIdentifier(nodeArg.nodeName)) {
|
|
96
|
+
errors.push(`Spark Swarm manager snapshot nodes[${index}] identity must be canonical`);
|
|
97
|
+
}
|
|
98
|
+
if (!runtimePlatforms.has(nodeArg.platform)) {
|
|
99
|
+
errors.push(`Spark Swarm manager snapshot nodes[${index}] platform must be supported`);
|
|
100
|
+
}
|
|
101
|
+
if (!['manager', 'worker'].includes(nodeArg.role)
|
|
102
|
+
|| !['active', 'pause', 'drain'].includes(nodeArg.availability)
|
|
103
|
+
|| !['unknown', 'down', 'ready', 'disconnected'].includes(nodeArg.state)) {
|
|
104
|
+
errors.push(`Spark Swarm manager snapshot nodes[${index}] scheduler state must be canonical`);
|
|
105
|
+
}
|
|
106
|
+
if (isManager) {
|
|
107
|
+
managerCount++;
|
|
108
|
+
if (!isRuntimeRecord(nodeArg.managerStatus)
|
|
109
|
+
|| !hasExactRuntimeKeys(nodeArg.managerStatus, ['leader', 'reachability'])
|
|
110
|
+
|| typeof nodeArg.managerStatus.leader !== 'boolean'
|
|
111
|
+
|| !['unknown', 'unreachable', 'reachable']
|
|
112
|
+
.includes(nodeArg.managerStatus.reachability)) {
|
|
113
|
+
errors.push(`Spark Swarm manager snapshot nodes[${index}] managerStatus must be canonical`);
|
|
114
|
+
}
|
|
115
|
+
else if (nodeArg.managerStatus.leader) {
|
|
116
|
+
leaderCount++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (isRuntimeIdentifier(nodeArg.swarmNodeId)) {
|
|
120
|
+
if (nodeIds.has(nodeArg.swarmNodeId)) {
|
|
121
|
+
errors.push('Spark Swarm manager snapshot node IDs must be unique');
|
|
122
|
+
}
|
|
123
|
+
nodeIds.add(nodeArg.swarmNodeId);
|
|
124
|
+
}
|
|
125
|
+
if (isRuntimeIdentifier(nodeArg.nodeName)) {
|
|
126
|
+
if (nodeNames.has(nodeArg.nodeName)) {
|
|
127
|
+
errors.push('Spark Swarm manager snapshot node names must be unique');
|
|
128
|
+
}
|
|
129
|
+
nodeNames.add(nodeArg.nodeName);
|
|
130
|
+
}
|
|
131
|
+
if (isRuntimeIdentifier(nodeArg.swarmNodeId) && isRuntimeIdentifier(nodeArg.nodeName)) {
|
|
132
|
+
const sortKey = `${nodeArg.swarmNodeId}\0${nodeArg.nodeName}\0${nodeArg.platform}`;
|
|
133
|
+
if (previousSortKey !== undefined && sortKey <= previousSortKey) {
|
|
134
|
+
errors.push('Spark Swarm manager snapshot nodes must be uniquely sorted');
|
|
135
|
+
}
|
|
136
|
+
previousSortKey = sortKey;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (snapshotArg.managerCount !== managerCount || !isPositiveSafeInteger(snapshotArg.managerCount)) {
|
|
140
|
+
errors.push('Spark Swarm manager snapshot managerCount must match nodes');
|
|
141
|
+
}
|
|
142
|
+
if (leaderCount > 1)
|
|
143
|
+
errors.push('Spark Swarm manager snapshot may contain at most one leader');
|
|
144
|
+
const sourceNode = snapshotArg.nodes.find((nodeArg) => (isRuntimeRecord(nodeArg) && nodeArg.swarmNodeId === localSwarmNodeIdArg));
|
|
145
|
+
if (!isRuntimeRecord(sourceNode)
|
|
146
|
+
|| sourceNode.role !== 'manager'
|
|
147
|
+
|| sourceNode.availability !== 'active'
|
|
148
|
+
|| sourceNode.state !== 'ready'
|
|
149
|
+
|| !isRuntimeRecord(sourceNode.managerStatus)
|
|
150
|
+
|| sourceNode.managerStatus.reachability !== 'reachable') {
|
|
151
|
+
errors.push('Spark Swarm manager snapshot source must be an active reachable manager');
|
|
152
|
+
}
|
|
153
|
+
if (errors.length === 0
|
|
154
|
+
&& snapshotArg.snapshotDigest !== await computeSwarmManagerSnapshotDigest(swarmClusterIdArg, snapshotArg)) {
|
|
155
|
+
errors.push('Spark Swarm manager snapshot digest does not match');
|
|
156
|
+
}
|
|
157
|
+
return errors;
|
|
158
|
+
};
|
|
159
|
+
export const validateSparkSwarmObservation = async (observationArg) => {
|
|
160
|
+
try {
|
|
161
|
+
if (!isRuntimeRecord(observationArg))
|
|
162
|
+
return ['Spark Swarm observation must be an object'];
|
|
163
|
+
const observation = observationArg;
|
|
164
|
+
const commonKeys = [
|
|
165
|
+
'schemaVersion',
|
|
166
|
+
'reporterSessionId',
|
|
167
|
+
'observationSequence',
|
|
168
|
+
'observedAt',
|
|
169
|
+
'state',
|
|
170
|
+
];
|
|
171
|
+
const expectedKeys = observation.state === 'unknown'
|
|
172
|
+
? [...commonKeys, 'reason']
|
|
173
|
+
: observation.state === 'not-member'
|
|
174
|
+
? commonKeys
|
|
175
|
+
: observation.state === 'member'
|
|
176
|
+
? [
|
|
177
|
+
...commonKeys,
|
|
178
|
+
'swarmClusterId',
|
|
179
|
+
'localSwarmNodeId',
|
|
180
|
+
'controlAvailable',
|
|
181
|
+
...(observation.managerSnapshot === undefined ? [] : ['managerSnapshot']),
|
|
182
|
+
]
|
|
183
|
+
: [];
|
|
184
|
+
if (expectedKeys.length === 0 || !hasExactRuntimeKeys(observation, expectedKeys)) {
|
|
185
|
+
return ['Spark Swarm observation must use its exact state schema'];
|
|
186
|
+
}
|
|
187
|
+
const errors = [];
|
|
188
|
+
if (observation.schemaVersion !== 1)
|
|
189
|
+
errors.push('Spark Swarm observation schemaVersion must be 1');
|
|
190
|
+
if (!isRuntimeIdentifier(observation.reporterSessionId)
|
|
191
|
+
|| !isPositiveSafeInteger(observation.observationSequence)
|
|
192
|
+
|| !isPositiveSafeInteger(observation.observedAt)) {
|
|
193
|
+
errors.push('Spark Swarm observation identity, sequence, and timestamp must be canonical');
|
|
194
|
+
}
|
|
195
|
+
if (observation.state === 'unknown'
|
|
196
|
+
&& !['docker-unavailable', 'query-failed', 'not-initialized']
|
|
197
|
+
.includes(observation.reason)) {
|
|
198
|
+
errors.push('Spark Swarm observation unknown reason must be canonical');
|
|
199
|
+
}
|
|
200
|
+
if (observation.state === 'member') {
|
|
201
|
+
if (!isRuntimeIdentifier(observation.swarmClusterId)
|
|
202
|
+
|| !isRuntimeIdentifier(observation.localSwarmNodeId)
|
|
203
|
+
|| typeof observation.controlAvailable !== 'boolean') {
|
|
204
|
+
errors.push('Spark Swarm member observation must have canonical local authority');
|
|
205
|
+
}
|
|
206
|
+
if (observation.managerSnapshot !== undefined) {
|
|
207
|
+
if (observation.controlAvailable !== true) {
|
|
208
|
+
errors.push('Spark Swarm manager snapshot requires controlAvailable');
|
|
209
|
+
}
|
|
210
|
+
else if (isRuntimeIdentifier(observation.swarmClusterId)
|
|
211
|
+
&& isRuntimeIdentifier(observation.localSwarmNodeId)) {
|
|
212
|
+
errors.push(...await validateSwarmManagerSnapshot(observation.swarmClusterId, observation.localSwarmNodeId, observation.managerSnapshot));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return errors;
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return ['Spark Swarm observation must be safely inspectable'];
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
const canonicalRuntimeTarget = (targetArg) => ({
|
|
223
|
+
cloudlyNodeId: targetArg.cloudlyNodeId,
|
|
224
|
+
swarmClusterId: targetArg.swarmClusterId,
|
|
225
|
+
swarmNodeId: targetArg.swarmNodeId,
|
|
226
|
+
nodeName: targetArg.nodeName,
|
|
227
|
+
platform: targetArg.platform,
|
|
228
|
+
});
|
|
229
|
+
export const createClusterRuntimeTargetSetDigestInput = (targetSetArg) => JSON.stringify({
|
|
230
|
+
schemaVersion: targetSetArg.schemaVersion,
|
|
231
|
+
purpose: 'serve.zone/cluster-runtime-target-set',
|
|
232
|
+
cloudlyClusterId: targetSetArg.cloudlyClusterId,
|
|
233
|
+
swarmClusterId: targetSetArg.swarmClusterId,
|
|
234
|
+
generation: targetSetArg.generation,
|
|
235
|
+
targets: targetSetArg.targets.map(canonicalRuntimeTarget),
|
|
236
|
+
});
|
|
237
|
+
export const computeClusterRuntimeTargetSetDigest = async (targetSetArg) => computeSha256(createClusterRuntimeTargetSetDigestInput(targetSetArg));
|
|
238
|
+
export const validateClusterRuntimeTargetSet = async (targetSetArg) => {
|
|
239
|
+
try {
|
|
240
|
+
if (!isRuntimeRecord(targetSetArg))
|
|
241
|
+
return ['cluster runtime target set must be an object'];
|
|
242
|
+
if (targetSetArg.state === 'unavailable') {
|
|
243
|
+
if (!hasExactRuntimeKeys(targetSetArg, [
|
|
244
|
+
'schemaVersion',
|
|
245
|
+
'state',
|
|
246
|
+
'cloudlyClusterId',
|
|
247
|
+
'generation',
|
|
248
|
+
'changedAt',
|
|
249
|
+
'reason',
|
|
250
|
+
])) {
|
|
251
|
+
return ['unavailable cluster runtime target set must use its exact schema'];
|
|
252
|
+
}
|
|
253
|
+
const errors = [];
|
|
254
|
+
if (targetSetArg.schemaVersion !== 1
|
|
255
|
+
|| !isRuntimeIdentifier(targetSetArg.cloudlyClusterId)
|
|
256
|
+
|| !Number.isSafeInteger(targetSetArg.generation)
|
|
257
|
+
|| targetSetArg.generation < 0
|
|
258
|
+
|| !isPositiveSafeInteger(targetSetArg.changedAt)
|
|
259
|
+
|| ![
|
|
260
|
+
'never-observed',
|
|
261
|
+
'stale',
|
|
262
|
+
'no-manager-consensus',
|
|
263
|
+
'identity-conflict',
|
|
264
|
+
'no-schedulable-targets',
|
|
265
|
+
].includes(targetSetArg.reason)) {
|
|
266
|
+
errors.push('unavailable cluster runtime target set fields must be canonical');
|
|
267
|
+
}
|
|
268
|
+
if (targetSetArg.reason === 'never-observed' && targetSetArg.generation !== 0) {
|
|
269
|
+
errors.push('never-observed target state must use generation zero');
|
|
270
|
+
}
|
|
271
|
+
return errors;
|
|
272
|
+
}
|
|
273
|
+
if (targetSetArg.state !== 'ready'
|
|
274
|
+
|| !hasExactRuntimeKeys(targetSetArg, [
|
|
275
|
+
'schemaVersion',
|
|
276
|
+
'state',
|
|
277
|
+
'cloudlyClusterId',
|
|
278
|
+
'swarmClusterId',
|
|
279
|
+
'generation',
|
|
280
|
+
'targetSetDigest',
|
|
281
|
+
'acceptedAt',
|
|
282
|
+
'freshUntil',
|
|
283
|
+
'targets',
|
|
284
|
+
])) {
|
|
285
|
+
return ['ready cluster runtime target set must use its exact schema'];
|
|
286
|
+
}
|
|
287
|
+
const errors = [];
|
|
288
|
+
if (targetSetArg.schemaVersion !== 1
|
|
289
|
+
|| !isRuntimeIdentifier(targetSetArg.cloudlyClusterId)
|
|
290
|
+
|| !isRuntimeIdentifier(targetSetArg.swarmClusterId)
|
|
291
|
+
|| !isPositiveSafeInteger(targetSetArg.generation)
|
|
292
|
+
|| !isPositiveSafeInteger(targetSetArg.acceptedAt)
|
|
293
|
+
|| !isPositiveSafeInteger(targetSetArg.freshUntil)
|
|
294
|
+
|| targetSetArg.freshUntil <= targetSetArg.acceptedAt
|
|
295
|
+
|| typeof targetSetArg.targetSetDigest !== 'string'
|
|
296
|
+
|| !runtimeDigestRegex.test(targetSetArg.targetSetDigest)) {
|
|
297
|
+
errors.push('ready cluster runtime target set authority fields must be canonical');
|
|
298
|
+
}
|
|
299
|
+
if (!Array.isArray(targetSetArg.targets)
|
|
300
|
+
|| targetSetArg.targets.length === 0
|
|
301
|
+
|| targetSetArg.targets.length > maximumSwarmNodes) {
|
|
302
|
+
errors.push('ready cluster runtime target set targets must be a non-empty bounded array');
|
|
303
|
+
return errors;
|
|
304
|
+
}
|
|
305
|
+
const cloudlyNodeIds = new Set();
|
|
306
|
+
const swarmNodeScopes = new Set();
|
|
307
|
+
const nodeNames = new Set();
|
|
308
|
+
let previousSortKey;
|
|
309
|
+
for (const [index, targetArg] of targetSetArg.targets.entries()) {
|
|
310
|
+
if (!isRuntimeRecord(targetArg)
|
|
311
|
+
|| !hasExactRuntimeKeys(targetArg, [
|
|
312
|
+
'cloudlyNodeId',
|
|
313
|
+
'swarmClusterId',
|
|
314
|
+
'swarmNodeId',
|
|
315
|
+
'nodeName',
|
|
316
|
+
'platform',
|
|
317
|
+
])
|
|
318
|
+
|| !isRuntimeIdentifier(targetArg.cloudlyNodeId)
|
|
319
|
+
|| !isRuntimeIdentifier(targetArg.swarmClusterId)
|
|
320
|
+
|| !isRuntimeIdentifier(targetArg.swarmNodeId)
|
|
321
|
+
|| !isRuntimeIdentifier(targetArg.nodeName)
|
|
322
|
+
|| targetArg.swarmClusterId !== targetSetArg.swarmClusterId
|
|
323
|
+
|| !runtimePlatforms.has(targetArg.platform)) {
|
|
324
|
+
errors.push(`cluster runtime target set targets[${index}] must be canonical`);
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
const sortKey = `${targetArg.cloudlyNodeId}\0${targetArg.swarmClusterId}\0${targetArg.swarmNodeId}\0${targetArg.nodeName}\0${targetArg.platform}`;
|
|
328
|
+
if (previousSortKey !== undefined && sortKey <= previousSortKey) {
|
|
329
|
+
errors.push('cluster runtime target set targets must be uniquely sorted');
|
|
330
|
+
}
|
|
331
|
+
previousSortKey = sortKey;
|
|
332
|
+
const swarmScope = `${targetArg.swarmClusterId}\0${targetArg.swarmNodeId}`;
|
|
333
|
+
if (cloudlyNodeIds.has(targetArg.cloudlyNodeId)
|
|
334
|
+
|| swarmNodeScopes.has(swarmScope)
|
|
335
|
+
|| nodeNames.has(targetArg.nodeName)) {
|
|
336
|
+
errors.push('cluster runtime target identities must be unique');
|
|
337
|
+
}
|
|
338
|
+
cloudlyNodeIds.add(targetArg.cloudlyNodeId);
|
|
339
|
+
swarmNodeScopes.add(swarmScope);
|
|
340
|
+
nodeNames.add(targetArg.nodeName);
|
|
341
|
+
}
|
|
342
|
+
if (errors.length === 0
|
|
343
|
+
&& targetSetArg.targetSetDigest !== await computeClusterRuntimeTargetSetDigest(targetSetArg)) {
|
|
344
|
+
errors.push('cluster runtime target set digest does not match');
|
|
345
|
+
}
|
|
346
|
+
return errors;
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
return ['cluster runtime target set must be safely inspectable'];
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
export const isClusterRuntimeTargetSetFresh = (targetSetArg, nowArg) => (targetSetArg.state === 'ready'
|
|
353
|
+
&& Number.isSafeInteger(nowArg)
|
|
354
|
+
&& nowArg >= targetSetArg.acceptedAt
|
|
355
|
+
&& nowArg < targetSetArg.freshUntil);
|
|
356
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlcm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2NsdXN0ZXJub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBOEx6QyxNQUFNLHNCQUFzQixHQUFHLHFDQUFxQyxDQUFDO0FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFDbkQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBOEI7SUFDNUQsYUFBYTtJQUNiLGFBQWE7Q0FDZCxDQUFDLENBQUM7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQixNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQWlCLEVBQXVDLEVBQUUsQ0FBQyxDQUNsRixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FDOUUsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsUUFBaUMsRUFDakMsT0FBaUIsRUFDUixFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUVuRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUFDLENBQ3JFLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3RFLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUFDLENBQ3ZFLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUssUUFB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
|