@serve.zone/interfaces 32.21.0 → 32.23.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.
Files changed (56) hide show
  1. package/changelog.md +91 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/data/clusteringress.d.ts +58 -0
  4. package/dist_ts/data/clusteringress.js +96 -2
  5. package/dist_ts/data/clusteringressdesignation.d.ts +64 -0
  6. package/dist_ts/data/clusteringressdesignation.js +84 -0
  7. package/dist_ts/data/corestorelegacyadoption.d.ts +178 -0
  8. package/dist_ts/data/corestorelegacyadoption.js +289 -0
  9. package/dist_ts/data/index.d.ts +6 -0
  10. package/dist_ts/data/index.js +6 -1
  11. package/dist_ts/data/networkprojection.d.ts +18 -0
  12. package/dist_ts/data/networkprojection.js +31 -2
  13. package/dist_ts/data/networkprotection.d.ts +13 -0
  14. package/dist_ts/data/networkprotection.js +8 -2
  15. package/dist_ts/data/networkworkloadingress.d.ts +61 -0
  16. package/dist_ts/data/networkworkloadingress.js +54 -0
  17. package/dist_ts/data/runtimelocalstorageclaim.d.ts +124 -0
  18. package/dist_ts/data/runtimelocalstorageclaim.js +167 -0
  19. package/dist_ts/data/service.d.ts +15 -1
  20. package/dist_ts/data/service.js +1 -1
  21. package/dist_ts/data/serviceruntime.d.ts +15 -3
  22. package/dist_ts/data/serviceruntime.js +7 -2
  23. package/dist_ts/data/servicevolumeinitialization.d.ts +91 -0
  24. package/dist_ts/data/servicevolumeinitialization.js +93 -0
  25. package/dist_ts/platform/types.d.ts +45 -0
  26. package/dist_ts/platform/types.js +27 -2
  27. package/dist_ts/private/storagecontract.d.ts +1 -0
  28. package/dist_ts/private/storagecontract.js +2 -1
  29. package/dist_ts/requests/clusteringress.d.ts +52 -0
  30. package/dist_ts/requests/clusteringress.js +1 -1
  31. package/dist_ts/requests/corestore.d.ts +60 -0
  32. package/dist_ts/requests/corestore.js +1 -1
  33. package/dist_ts/requests/platform.d.ts +6 -1
  34. package/dist_ts/requests/runtimesession.d.ts +12 -0
  35. package/dist_ts/requests/service.d.ts +23 -0
  36. package/package.json +1 -1
  37. package/readme.md +262 -2
  38. package/ts/00_commitinfo_data.ts +1 -1
  39. package/ts/data/clusteringress.ts +136 -1
  40. package/ts/data/clusteringressdesignation.ts +141 -0
  41. package/ts/data/corestorelegacyadoption.ts +471 -0
  42. package/ts/data/index.ts +7 -0
  43. package/ts/data/networkprojection.ts +49 -1
  44. package/ts/data/networkprotection.ts +20 -1
  45. package/ts/data/networkworkloadingress.ts +107 -0
  46. package/ts/data/runtimelocalstorageclaim.ts +275 -0
  47. package/ts/data/service.ts +16 -0
  48. package/ts/data/serviceruntime.ts +19 -2
  49. package/ts/data/servicevolumeinitialization.ts +159 -0
  50. package/ts/platform/types.ts +75 -0
  51. package/ts/private/storagecontract.ts +1 -0
  52. package/ts/requests/clusteringress.ts +65 -0
  53. package/ts/requests/corestore.ts +79 -0
  54. package/ts/requests/platform.ts +6 -0
  55. package/ts/requests/runtimesession.ts +16 -0
  56. package/ts/requests/service.ts +28 -0
@@ -0,0 +1,124 @@
1
+ import type { TSha256Digest } from './immutableimage.js';
2
+ import type { IRuntimeAssignment, IRuntimeAuthorityReference, IRuntimeController } from './runtimeassignment.js';
3
+ import type { IRuntimeSessionBinding } from './runtimesession.js';
4
+ /**
5
+ * Where a local storage claim's bytes live, named by kind and never by path.
6
+ *
7
+ * `directory` is a node-local directory the node derives from the claim's identity under a root
8
+ * only the node knows. Network filesystems join this union as further kinds; their credentials
9
+ * travel as secrets and never inside a claim.
10
+ */
11
+ export type TRuntimeLocalStorageSource = {
12
+ kind: 'directory';
13
+ };
14
+ /** The owner and permission bits a node gives an `empty` volume's root directory when it creates it. */
15
+ export interface IRuntimeLocalStorageOwnership {
16
+ uid: number;
17
+ gid: number;
18
+ /** Numeric directory permission bits, for example `0o750`; setuid is refused. */
19
+ mode: number;
20
+ }
21
+ /** Where the volume appears inside the workload's container. */
22
+ export interface IRuntimeLocalStorageMount {
23
+ mountPath: string;
24
+ readOnly: boolean;
25
+ }
26
+ /**
27
+ * `bound` keeps the volume and lets the node mount it; `purge` orders the node to delete the
28
+ * volume's bytes. A purge always follows a bound generation of the same claim.
29
+ */
30
+ export type TRuntimeLocalStorageLifecycle = 'bound' | 'purge';
31
+ /**
32
+ * A controller's authority for one retained, node-local volume of one service.
33
+ *
34
+ * Cloudly and Onebox issue it alike. It names the volume by identity only: no host path, no
35
+ * device, no mount option and no credential. The node resolves the identity to its own storage.
36
+ *
37
+ * `initialization` says what the node does when the volume does not exist yet. `empty` creates an
38
+ * empty root with `initialOwnership`, which it must state, so a workload that runs as the image's
39
+ * own user never meets a root-owned directory by accident. `import` waits for the volume's bytes to
40
+ * be imported and states no ownership: an imported tree keeps the ownership it carries.
41
+ */
42
+ export interface IRuntimeLocalStorageClaim {
43
+ id: string;
44
+ generation: number;
45
+ previous: IRuntimeAuthorityReference | null;
46
+ controller: IRuntimeController;
47
+ organizationId: string;
48
+ clusterId: string;
49
+ nodeId: string;
50
+ runtimeNamespace: string;
51
+ serviceId: string;
52
+ /** The service's own name for this volume, stable across every generation of the claim. */
53
+ volumeId: string;
54
+ source: TRuntimeLocalStorageSource;
55
+ initialization: 'empty' | 'import';
56
+ /** Required for `empty`, `null` for `import`. */
57
+ initialOwnership: IRuntimeLocalStorageOwnership | null;
58
+ mount: IRuntimeLocalStorageMount;
59
+ accessMode: 'ReadWriteOnce';
60
+ reclaimPolicy: 'retain';
61
+ lifecycle: TRuntimeLocalStorageLifecycle;
62
+ digest: TSha256Digest;
63
+ }
64
+ /**
65
+ * What the node holds for the volume after admission.
66
+ *
67
+ * `ready` exists and may be mounted; `import-required` is an `import` volume whose bytes have not
68
+ * arrived; `purged` is a volume whose bytes the node deleted; `uncertain` is a volume the node
69
+ * cannot vouch for, which it neither mounts nor deletes until an operator decides.
70
+ */
71
+ export type TRuntimeLocalStorageClaimState = 'ready' | 'import-required' | 'purged' | 'uncertain';
72
+ /** Controller push over the node's current authenticated session. */
73
+ export interface IApplyRuntimeLocalStorageClaimRequest {
74
+ session: IRuntimeSessionBinding;
75
+ claim: IRuntimeLocalStorageClaim;
76
+ }
77
+ /**
78
+ * Durable admission acknowledgement. `claim` is the reference of the claim that was sent, also on
79
+ * a `historical` answer, whose `state` describes the newer generation the node holds.
80
+ */
81
+ export interface IApplyRuntimeLocalStorageClaimResponse {
82
+ status: 'accepted' | 'replay' | 'historical';
83
+ state: TRuntimeLocalStorageClaimState;
84
+ claim: IRuntimeAuthorityReference;
85
+ }
86
+ export declare const runtimeLocalStorageClaimContract: Readonly<{
87
+ readonly digestDomain: "serve.zone/runtime-local-storage-claim";
88
+ readonly error: "Runtime local storage claim contract rejected.";
89
+ readonly accessMode: "ReadWriteOnce";
90
+ readonly reclaimPolicy: "retain";
91
+ /** Every permission bit a claim may state: setgid, sticky and the rwx triplets. */
92
+ readonly directoryModeBits: 2047;
93
+ }>;
94
+ /** Detached exact-schema snapshot. The digest is a separate check. */
95
+ export declare const snapshotRuntimeLocalStorageClaim: (valueArg: unknown) => IRuntimeLocalStorageClaim;
96
+ export declare const computeRuntimeLocalStorageClaimDigest: (valueArg: unknown) => Promise<TSha256Digest>;
97
+ export declare const validateRuntimeLocalStorageClaim: (valueArg: unknown) => Promise<string[]>;
98
+ /** The `{ id, generation, digest }` an assignment's `workload.storage` seals for this claim. */
99
+ export declare const getRuntimeLocalStorageClaimReference: (valueArg: unknown) => IRuntimeAuthorityReference;
100
+ /**
101
+ * Content binding only: the assignment seals this exact claim, and both name the same controller,
102
+ * organization, node, runtime namespace and service. A purge claim binds to no assignment, because
103
+ * no workload may mount a volume being deleted. The cluster ID must come from the authenticated
104
+ * session, because an assignment does not contain one.
105
+ */
106
+ export declare const bindRuntimeLocalStorageClaimToAssignment: (claimArg: unknown, assignmentArg: unknown, expectedClusterIdArg: unknown) => Promise<{
107
+ claim: IRuntimeLocalStorageClaim;
108
+ assignment: IRuntimeAssignment;
109
+ }>;
110
+ export declare const snapshotApplyRuntimeLocalStorageClaimRequest: (valueArg: unknown) => IApplyRuntimeLocalStorageClaimRequest;
111
+ export declare const snapshotApplyRuntimeLocalStorageClaimResponse: (valueArg: unknown) => IApplyRuntimeLocalStorageClaimResponse;
112
+ /**
113
+ * Admission-side content binding, not authentication: `trustedSessionArg` must be the node's
114
+ * CURRENT authenticated session, never read from the request. The request's session must equal it,
115
+ * the claim must name its controller, cluster, node and runtime namespace, and its digest must hold.
116
+ */
117
+ export declare const bindApplyRuntimeLocalStorageClaimRequest: (valueArg: unknown, trustedSessionArg: unknown) => Promise<IApplyRuntimeLocalStorageClaimRequest>;
118
+ /**
119
+ * Matches an answer to the exact claim that was sent. An `accepted` or `replay` answer must state a
120
+ * state the claim can be in: a bound claim is `ready`, `import-required` (for an `import` claim
121
+ * only) or `uncertain`; a purge is `purged` or `uncertain`. A `historical` answer describes the
122
+ * newer generation the node holds, so its state is not judged against the sent claim.
123
+ */
124
+ export declare const bindApplyRuntimeLocalStorageClaimResponse: (valueArg: unknown, requestArg: unknown) => IApplyRuntimeLocalStorageClaimResponse;
@@ -0,0 +1,167 @@
1
+ import { snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
2
+ import { snapshotRuntimeSessionBinding } from './runtimesession.js';
3
+ import { captureNetwork, networkController, networkDigest, networkEqual, networkHash, networkId, networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, requireNetwork, } from '../private/networkcontract.js';
4
+ import { isRuntimeIdentityNumber } from '../private/runtimepolicy.js';
5
+ import { createStorageContractReaders } from '../private/storagecontract.js';
6
+ export const runtimeLocalStorageClaimContract = Object.freeze({
7
+ digestDomain: 'serve.zone/runtime-local-storage-claim',
8
+ error: 'Runtime local storage claim contract rejected.',
9
+ accessMode: 'ReadWriteOnce',
10
+ reclaimPolicy: 'retain',
11
+ /** Every permission bit a claim may state: setgid, sticky and the rwx triplets. */
12
+ directoryModeBits: 0o3777,
13
+ });
14
+ const fail = () => { throw new Error(runtimeLocalStorageClaimContract.error); };
15
+ const safe = (operationArg) => { try {
16
+ return operationArg();
17
+ }
18
+ catch {
19
+ return fail();
20
+ } };
21
+ const { readMountPath } = createStorageContractReaders(fail);
22
+ const claimStates = ['ready', 'import-required', 'purged', 'uncertain'];
23
+ const responseStatuses = ['accepted', 'replay', 'historical'];
24
+ const sourceOf = (valueArg) => {
25
+ const value = networkRecord(valueArg, ['kind']);
26
+ requireNetwork(value.kind === 'directory');
27
+ return { kind: 'directory' };
28
+ };
29
+ const ownershipOf = (valueArg) => {
30
+ const value = networkRecord(valueArg, ['uid', 'gid', 'mode']);
31
+ requireNetwork(isRuntimeIdentityNumber(value.uid) && isRuntimeIdentityNumber(value.gid)
32
+ && Number.isSafeInteger(value.mode) && value.mode >= 0
33
+ && (value.mode & ~runtimeLocalStorageClaimContract.directoryModeBits) === 0);
34
+ return { uid: value.uid, gid: value.gid, mode: value.mode };
35
+ };
36
+ const mountOf = (valueArg) => {
37
+ const value = networkRecord(valueArg, ['mountPath', 'readOnly']);
38
+ requireNetwork(typeof value.readOnly === 'boolean');
39
+ return { mountPath: readMountPath(value.mountPath, 'mountPath'), readOnly: value.readOnly };
40
+ };
41
+ /** Detached exact-schema snapshot. The digest is a separate check. */
42
+ export const snapshotRuntimeLocalStorageClaim = (valueArg) => safe(() => {
43
+ const value = networkRecord(captureNetwork(valueArg), ['id', 'generation', 'previous', 'controller',
44
+ 'organizationId', 'clusterId', 'nodeId', 'runtimeNamespace', 'serviceId', 'volumeId', 'source',
45
+ 'initialization', 'initialOwnership', 'mount', 'accessMode', 'reclaimPolicy', 'lifecycle', 'digest']);
46
+ const { id, generation, previous } = networkRevision(value);
47
+ requireNetwork((value.initialization === 'empty' && value.initialOwnership !== null)
48
+ || (value.initialization === 'import' && value.initialOwnership === null));
49
+ requireNetwork(value.accessMode === 'ReadWriteOnce' && value.reclaimPolicy === 'retain');
50
+ requireNetwork(value.lifecycle === 'bound' || (value.lifecycle === 'purge' && previous !== null));
51
+ return {
52
+ id, generation, previous,
53
+ controller: networkController(value.controller),
54
+ organizationId: networkId(value.organizationId),
55
+ clusterId: networkId(value.clusterId),
56
+ nodeId: networkNodeId(value.nodeId),
57
+ runtimeNamespace: networkId(value.runtimeNamespace),
58
+ serviceId: networkId(value.serviceId),
59
+ volumeId: networkId(value.volumeId),
60
+ source: sourceOf(value.source),
61
+ initialization: value.initialization,
62
+ initialOwnership: value.initialOwnership === null ? null : ownershipOf(value.initialOwnership),
63
+ mount: mountOf(value.mount),
64
+ accessMode: 'ReadWriteOnce',
65
+ reclaimPolicy: 'retain',
66
+ lifecycle: value.lifecycle,
67
+ digest: networkDigest(value.digest),
68
+ };
69
+ });
70
+ export const computeRuntimeLocalStorageClaimDigest = async (valueArg) => {
71
+ const claim = snapshotRuntimeLocalStorageClaim(valueArg);
72
+ try {
73
+ return await networkHash(runtimeLocalStorageClaimContract.digestDomain, claim);
74
+ }
75
+ catch {
76
+ return fail();
77
+ }
78
+ };
79
+ export const validateRuntimeLocalStorageClaim = async (valueArg) => {
80
+ try {
81
+ const claim = snapshotRuntimeLocalStorageClaim(valueArg);
82
+ return claim.digest === await computeRuntimeLocalStorageClaimDigest(claim)
83
+ ? [] : ['runtime local storage claim digest does not match'];
84
+ }
85
+ catch {
86
+ return ['runtime local storage claim must use its exact canonical schema'];
87
+ }
88
+ };
89
+ /** The `{ id, generation, digest }` an assignment's `workload.storage` seals for this claim. */
90
+ export const getRuntimeLocalStorageClaimReference = (valueArg) => networkReferenceOf(snapshotRuntimeLocalStorageClaim(valueArg));
91
+ /**
92
+ * Content binding only: the assignment seals this exact claim, and both name the same controller,
93
+ * organization, node, runtime namespace and service. A purge claim binds to no assignment, because
94
+ * no workload may mount a volume being deleted. The cluster ID must come from the authenticated
95
+ * session, because an assignment does not contain one.
96
+ */
97
+ export const bindRuntimeLocalStorageClaimToAssignment = async (claimArg, assignmentArg, expectedClusterIdArg) => {
98
+ const claim = snapshotRuntimeLocalStorageClaim(claimArg);
99
+ const assignment = safe(() => snapshotRuntimeAssignment(assignmentArg));
100
+ if ((await validateRuntimeLocalStorageClaim(claim)).length
101
+ || (await validateRuntimeAssignment(assignment)).length)
102
+ fail();
103
+ safe(() => {
104
+ const expectedClusterId = networkId(expectedClusterIdArg);
105
+ const reference = assignment.workload.storage.find((itemArg) => itemArg.id === claim.id);
106
+ requireNetwork(reference !== undefined
107
+ && networkEqual(reference, getRuntimeLocalStorageClaimReference(claim))
108
+ && claim.lifecycle === 'bound'
109
+ && claim.clusterId === expectedClusterId
110
+ && networkEqual(assignment.controller, claim.controller)
111
+ && assignment.organizationId === claim.organizationId
112
+ && assignment.nodeId === claim.nodeId
113
+ && assignment.runtimeNamespace === claim.runtimeNamespace
114
+ && assignment.serviceId === claim.serviceId);
115
+ });
116
+ return { claim, assignment };
117
+ };
118
+ export const snapshotApplyRuntimeLocalStorageClaimRequest = (valueArg) => safe(() => {
119
+ const value = networkRecord(captureNetwork(valueArg), ['session', 'claim']);
120
+ return { session: snapshotRuntimeSessionBinding(value.session), claim: snapshotRuntimeLocalStorageClaim(value.claim) };
121
+ });
122
+ export const snapshotApplyRuntimeLocalStorageClaimResponse = (valueArg) => safe(() => {
123
+ const value = networkRecord(captureNetwork(valueArg), ['status', 'state', 'claim']);
124
+ requireNetwork(responseStatuses.includes(value.status)
125
+ && claimStates.includes(value.state));
126
+ return {
127
+ status: value.status,
128
+ state: value.state,
129
+ claim: networkReference(value.claim),
130
+ };
131
+ });
132
+ /**
133
+ * Admission-side content binding, not authentication: `trustedSessionArg` must be the node's
134
+ * CURRENT authenticated session, never read from the request. The request's session must equal it,
135
+ * the claim must name its controller, cluster, node and runtime namespace, and its digest must hold.
136
+ */
137
+ export const bindApplyRuntimeLocalStorageClaimRequest = async (valueArg, trustedSessionArg) => {
138
+ const request = snapshotApplyRuntimeLocalStorageClaimRequest(valueArg);
139
+ const trustedSession = safe(() => snapshotRuntimeSessionBinding(trustedSessionArg));
140
+ if ((await validateRuntimeLocalStorageClaim(request.claim)).length)
141
+ fail();
142
+ safe(() => requireNetwork(networkEqual(request.session, trustedSession)
143
+ && networkEqual(request.claim.controller, trustedSession.controller)
144
+ && request.claim.clusterId === trustedSession.clusterId
145
+ && request.claim.nodeId === trustedSession.nodeId
146
+ && request.claim.runtimeNamespace === trustedSession.runtimeNamespace));
147
+ return request;
148
+ };
149
+ /**
150
+ * Matches an answer to the exact claim that was sent. An `accepted` or `replay` answer must state a
151
+ * state the claim can be in: a bound claim is `ready`, `import-required` (for an `import` claim
152
+ * only) or `uncertain`; a purge is `purged` or `uncertain`. A `historical` answer describes the
153
+ * newer generation the node holds, so its state is not judged against the sent claim.
154
+ */
155
+ export const bindApplyRuntimeLocalStorageClaimResponse = (valueArg, requestArg) => safe(() => {
156
+ const response = snapshotApplyRuntimeLocalStorageClaimResponse(valueArg);
157
+ const { claim } = snapshotApplyRuntimeLocalStorageClaimRequest(requestArg);
158
+ requireNetwork(networkEqual(response.claim, getRuntimeLocalStorageClaimReference(claim)));
159
+ if (response.status !== 'historical') {
160
+ requireNetwork(claim.lifecycle === 'purge'
161
+ ? response.state === 'purged' || response.state === 'uncertain'
162
+ : response.state === 'ready' || response.state === 'uncertain'
163
+ || (response.state === 'import-required' && claim.initialization === 'import'));
164
+ }
165
+ return response;
166
+ });
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWxvY2Fsc3RvcmFnZWNsYWltLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lbG9jYWxzdG9yYWdlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQzdGLGFBQWEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGNBQWMsR0FDcEcsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQTBGN0UsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RCxZQUFZLEVBQUUsd0NBQXdDO0lBQ3RELEtBQUssRUFBRSxnREFBZ0Q7SUFDdkQsVUFBVSxFQUFFLGVBQWU7SUFDM0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsbUZBQW1GO0lBQ25GLGlCQUFpQixFQUFFLE1BQU07Q0FDakIsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RixNQUFNLElBQUksR0FBRyxDQUFJLFlBQXFCLEVBQUssRUFBRSxHQUFHLElBQUksQ0FBQztJQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7QUFBQyxDQUFDO0FBQUMsTUFBTSxDQUFDO0lBQUMs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
@@ -7,6 +7,7 @@ import type { IServiceWebPushConfig } from './webpush.js';
7
7
  import type { IImageRolloutStatus, IImmutableImageDeploymentPlan } from './immutableimage.js';
8
8
  import type { IServiceDomainRoute, IServicePublicPortMapping, IServiceTargetPort } from './serviceports.js';
9
9
  import type { IServiceSecretConfiguration, IServiceSecretDeploymentPlan } from './secret.js';
10
+ import type { TServiceVolumeInitialization } from './servicevolumeinitialization.js';
10
11
  export interface IServiceVolume {
11
12
  /** Stable Docker volume name. If omitted, Coreflow derives one from service id and mount path. */
12
13
  name?: string;
@@ -21,7 +22,15 @@ export interface IServiceVolume {
21
22
  backup?: boolean;
22
23
  /** Driver-specific options forwarded to Docker's VolumeDriver.Create request. */
23
24
  options?: Record<string, string>;
25
+ /**
26
+ * Server-managed: how the volume's node-local storage claim starts on a Pallet cluster. Only
27
+ * `setServiceVolumeInitialization` writes it; a volume without one is refused as
28
+ * `volume-initialization-unknown` instead of being created empty.
29
+ */
30
+ initialization?: TServiceVolumeInitialization;
24
31
  }
32
+ /** Caller-writable volume declaration. Its initialization has its own fenced request. */
33
+ export type TServiceWritableVolume = Omit<IServiceVolume, 'initialization'>;
25
34
  /** Validates the canonical organization authority used by service operations. */
26
35
  export declare const validateOrganizationId: (valueArg: unknown) => string[];
27
36
  export declare const serviceContainerArgLimits: {
@@ -169,12 +178,17 @@ export interface IService {
169
178
  * Caller-writable service data. Immutable rollout state and SecretSet
170
179
  * attachments are changed only through their dedicated fenced APIs.
171
180
  */
172
- export type TServiceWritableData = Omit<IService['data'], 'organizationId' | 'immutableImageRequired' | 'imageDeployment' | 'imageRolloutStatus' | 'secretConfiguration' | 'secretDeployment' | 'mail'> & {
181
+ export type TServiceWritableData = Omit<IService['data'], 'organizationId' | 'immutableImageRequired' | 'imageDeployment' | 'imageRolloutStatus' | 'secretConfiguration' | 'secretDeployment' | 'mail' | 'volumes'> & {
173
182
  /**
174
183
  * Mail configuration stays caller-writable, except for the CoreMail binding
175
184
  * metadata Cloudly derives from reconciliation.
176
185
  */
177
186
  mail?: TServiceMailWritableConfig;
187
+ /**
188
+ * Volumes stay caller-writable, except for their initialization, which Cloudly refuses here.
189
+ * A stored initialization stays with the volume of the same mount path and goes with it.
190
+ */
191
+ volumes?: TServiceWritableVolume[];
178
192
  };
179
193
  /** Caller-writable update data. Null explicitly removes an existing argument vector. */
180
194
  export type TServiceUpdateWritableData = Omit<TServiceWritableData, 'containerArgs'> & {
@@ -65,4 +65,4 @@ export const validateServiceContainerArgs = (containerArgsArg) => {
65
65
  }
66
66
  return [];
67
67
  };
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQ0EsTUFBTSxtQkFBbUIsR0FBRyxxQ0FBcUMsQ0FBQztBQUVsRSxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxRQUFpQixFQUFZLEVBQUU7SUFDcEUsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN4RSxPQUFPLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRztJQUN2QyxXQUFXLEVBQUUsRUFBRTtJQUNmLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGlCQUFpQixFQUFFLEVBQUUsR0FBRyxJQUFJO0NBQ3BCLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLE9BQWUsRUFBc0IsRUFBRTtJQUNsRixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7V0FDMUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztXQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztXQUN0QixPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsS0FBSyxNQUFNLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLEtBQUssR0FBRztZQUFFLFNBQVM7UUFDMUMsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDNUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2YsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNELE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsZ0JBQXlCLEVBQVksRUFBRTtJQUNsRixJQUFJLGdCQUFnQixLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ2hGLElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRSxPQUFPLENBQUMsc0NBQXNDLHlCQUF5QixDQUFDLFdBQVcsVUFBVSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUNELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUMzRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFELE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDcEUsSUFBSSxhQUFhLEdBQUcseUJBQXlCLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDOUQsT0FBTyxDQUFDLGlCQUFpQixLQUFLLG9DQUFvQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELFVBQVUsSUFBSSxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksVUFBVSxHQUFHLHlCQUF5QixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0QsT0FBTyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyxDQUFDIn0=
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE4Q0EsTUFBTSxtQkFBbUIsR0FBRyxxQ0FBcUMsQ0FBQztBQUVsRSxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxRQUFpQixFQUFZLEVBQUU7SUFDcEUsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN4RSxPQUFPLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRztJQUN2QyxXQUFXLEVBQUUsRUFBRTtJQUNmLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGlCQUFpQixFQUFFLEVBQUUsR0FBRyxJQUFJO0NBQ3BCLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLE9BQWUsRUFBc0IsRUFBRTtJQUNsRixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7V0FDMUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztXQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztXQUN0QixPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsS0FBSyxNQUFNLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLEtBQUssR0FBRztZQUFFLFNBQVM7UUFDMUMsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDNUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2YsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNELE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsZ0JBQXlCLEVBQVksRUFBRTtJQUNsRixJQUFJLGdCQUFnQixLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ2hGLElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRSxPQUFPLENBQUMsc0NBQXNDLHlCQUF5QixDQUFDLFdBQVcsVUFBVSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUNELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUMzRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFELE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDcEUsSUFBSSxhQUFhLEdBQUcseUJBQXlCLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDOUQsT0FBTyxDQUFDLGlCQUFpQixLQUFLLG9DQUFvQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELFVBQVUsSUFBSSxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksVUFBVSxHQUFHLHlCQUF5QixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0QsT0FBTyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyxDQUFDIn0=
@@ -71,12 +71,16 @@ export declare const serviceRuntimeContract: Readonly<{
71
71
  /** The largest `limit` `getClusterRuntimeAssignments` accepts; Cloudly refuses a larger one. */
72
72
  readonly maximumAssignmentPageSize: 256;
73
73
  }>;
74
- declare const serviceRuntimeWaitingReasons: readonly ["node-network-pending", "conflict", "failure-backoff"];
75
- declare const serviceRuntimeRefusals: readonly ["cluster-runtime-missing", "organization-missing", "image-plan-missing", "platform-unsupported", "secrets-unsupported", "volumes-unsupported", "port-protocol-unsupported", "ports-too-many", "readiness-target-undeclared", "environment-too-large", "no-eligible-node", "replica-limit", "node-authority-unsupported", "network-policy-missing", "network-policy-mismatch", "network-workload-pool-missing", "network-workload-pool-exhausted"];
74
+ declare const serviceRuntimeWaitingReasons: readonly ["node-network-pending", "conflict", "failure-backoff", "storage-import-pending", "bindings-pending", "legacy-adoption-pending"];
75
+ declare const serviceRuntimeRefusals: readonly ["cluster-runtime-missing", "organization-missing", "image-plan-missing", "platform-unsupported", "secrets-unsupported", "volumes-unsupported", "port-protocol-unsupported", "ports-too-many", "readiness-target-undeclared", "environment-too-large", "no-eligible-node", "replica-limit", "node-authority-unsupported", "network-policy-missing", "network-policy-mismatch", "network-workload-pool-missing", "network-workload-pool-exhausted", "volume-driver-unsupported", "volume-options-unsupported", "volume-shared-unsupported", "volume-placement-unsupported", "volume-initialization-unknown", "volume-ownership-unknown"];
76
76
  /**
77
77
  * Why the producer is not converging yet, though nothing needs an administrator:
78
78
  * `node-network-pending` waits for a node's network readiness, `conflict` for a sweep over inputs
79
- * that changed while it ran, `failure-backoff` for a failed replica's backoff to elapse.
79
+ * that changed while it ran, `failure-backoff` for a failed replica's backoff to elapse,
80
+ * `storage-import-pending` for an `import` local storage claim whose bytes have not arrived on its
81
+ * node, `bindings-pending` for the secret manifest to cover every enabled binding of the service, and
82
+ * `legacy-adoption-pending` for a Corestore binding whose legacy resource waits for the offline
83
+ * adoption Corestore requires (the binding's `statusReason` of the same name).
80
84
  */
81
85
  export type TServiceRuntimeWaitingReason = typeof serviceRuntimeWaitingReasons[number];
82
86
  /**
@@ -88,6 +92,14 @@ export type TServiceRuntimeWaitingReason = typeof serviceRuntimeWaitingReasons[n
88
92
  * node whose session resolved fewer workload authorities than this spec needs, which the admit step
89
93
  * refuses rather than handing the node work it would silently park. An attached network needs an
90
94
  * explicit matching policy and a current workload address pool; neither is defaulted.
95
+ *
96
+ * The volume refusals name what a local storage claim cannot express: `volume-driver-unsupported`
97
+ * a volume of a driver other than a node-local directory, `volume-options-unsupported` driver or
98
+ * mount options, `volume-shared-unsupported` one volume mounted by more than one replica or service,
99
+ * and `volume-placement-unsupported` a placement that does not pin each volume to one node.
100
+ * `volume-initialization-unknown` is a volume without an initialization and
101
+ * `volume-ownership-unknown` a `run-as` ownership under `runAs: null`
102
+ * (`deriveServiceVolumeClaimInitialization`); neither is defaulted.
91
103
  */
92
104
  export type TServiceRuntimeRefusal = typeof serviceRuntimeRefusals[number];
93
105
  interface IServiceRuntimeStatusBase {
@@ -14,13 +14,18 @@ export const serviceRuntimeContract = Object.freeze({
14
14
  /** The largest `limit` `getClusterRuntimeAssignments` accepts; Cloudly refuses a larger one. */
15
15
  maximumAssignmentPageSize: 256,
16
16
  });
17
- const serviceRuntimeWaitingReasons = ['node-network-pending', 'conflict', 'failure-backoff'];
17
+ const serviceRuntimeWaitingReasons = [
18
+ 'node-network-pending', 'conflict', 'failure-backoff', 'storage-import-pending', 'bindings-pending',
19
+ 'legacy-adoption-pending',
20
+ ];
18
21
  const serviceRuntimeRefusals = [
19
22
  'cluster-runtime-missing', 'organization-missing', 'image-plan-missing', 'platform-unsupported',
20
23
  'secrets-unsupported', 'volumes-unsupported', 'port-protocol-unsupported', 'ports-too-many',
21
24
  'readiness-target-undeclared', 'environment-too-large', 'no-eligible-node', 'replica-limit',
22
25
  'node-authority-unsupported', 'network-policy-missing', 'network-policy-mismatch',
23
26
  'network-workload-pool-missing', 'network-workload-pool-exhausted',
27
+ 'volume-driver-unsupported', 'volume-options-unsupported', 'volume-shared-unsupported',
28
+ 'volume-placement-unsupported', 'volume-initialization-unknown', 'volume-ownership-unknown',
24
29
  ];
25
30
  /** Sorted, duplicate-free and read by the vocabulary the ids belong to: a node's, or the canonical one. */
26
31
  const sortedIds = (value, maximum, read) => networkSorted(networkList(value, maximum, read), id => id);
@@ -94,4 +99,4 @@ export const snapshotServiceRuntimeStatus = (value) => producerSafe(() => {
94
99
  requireNetwork(item.state === 'refused' && isOneOf(serviceRuntimeRefusals, item.reason));
95
100
  return { ...base, state: item.state, reason: item.reason };
96
101
  });
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXJ1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL3NlcnZpY2VydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQzVILGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQ2hILG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUF3RDVELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEQsc0JBQXNCLEVBQUUsRUFBRTtJQUMxQiwrRkFBK0Y7SUFDL0YsZUFBZSxFQUFFLEVBQUU7SUFDbkIsb0hBQW9IO0lBQ3BILGtCQUFrQixFQUFFLCtCQUErQixDQUFDLHdCQUF3QjtJQUM1RSx3QkFBd0IsRUFBRSwrQkFBK0IsQ0FBQyx3QkFBd0I7SUFDbEYsMEZBQTBGO0lBQzFGLG1CQUFtQixFQUFFLEdBQUc7SUFDeEIsZ0dBQWdHO0lBQ2hHLHlCQUF5QixFQUFFLEdBQUc7Q0FDdEIsQ0FBQyxDQUFDO0FBRVosTUFBTSw0QkFBNEIsR0FBRyxDQUFDLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBVSxDQUFDO0FBQ3RHLE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IseUJBQXlCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCO0lB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
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXJ1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL3NlcnZpY2VydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQzVILGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQ2hILG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUF3RDVELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEQsc0JBQXNCLEVBQUUsRUFBRTtJQUMxQiwrRkFBK0Y7SUFDL0YsZUFBZSxFQUFFLEVBQUU7SUFDbkIsb0hBQW9IO0lBQ3BILGtCQUFrQixFQUFFLCtCQUErQixDQUFDLHdCQUF3QjtJQUM1RSx3QkFBd0IsRUFBRSwrQkFBK0IsQ0FBQyx3QkFBd0I7SUFDbEYsMEZBQTBGO0lBQzFGLG1CQUFtQixFQUFFLEdBQUc7SUFDeEIsZ0dBQWdHO0lBQ2hHLHlCQUF5QixFQUFFLEdBQUc7Q0FDdEIsQ0FBQyxDQUFDO0FBRVosTUFBTSw0QkFBNEIsR0FBRztJQUNuQyxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCO0lBQ25HLHlCQUF5QjtDQUNqQixDQUFDO0FBQ1gsTUFBTSxzQkFBc0IsR0FBRztJQUM3Qix5QkFBeUIs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
@@ -0,0 +1,91 @@
1
+ import type { IRuntimeLocalStorageOwnership } from './runtimelocalstorageclaim.js';
2
+ import type { IServiceRuntimeProfile } from './serviceruntime.js';
3
+ /**
4
+ * Where an `import` volume's bytes come from.
5
+ *
6
+ * `docker-volume` is a Docker volume on the host the claim's node runs on, named exactly as Docker
7
+ * lists it; a Corestore-driver volume is named the same way. The operator copies its tree into the
8
+ * node's import directory; the node never reads this reference, and the local storage claim does
9
+ * not carry it.
10
+ */
11
+ export type TServiceVolumeImportSource = {
12
+ kind: 'docker-volume';
13
+ volumeName: string;
14
+ };
15
+ /**
16
+ * The owner and permission bits an `empty` volume's root directory gets.
17
+ *
18
+ * `explicit` states the numeric owner. `run-as` takes the owner from the runtime spec's
19
+ * `profile.runAs` (user and group) when the claim is first issued; the mode is always stated,
20
+ * because no mode is right for every image.
21
+ */
22
+ export type TServiceVolumeOwnership = {
23
+ kind: 'explicit';
24
+ uid: number;
25
+ gid: number;
26
+ mode: number;
27
+ } | {
28
+ kind: 'run-as';
29
+ mode: number;
30
+ };
31
+ /**
32
+ * How a service volume's node-local claim starts: `empty` creates a fresh root with the stated
33
+ * ownership, `import` waits for the bytes of an existing volume.
34
+ */
35
+ export type TServiceVolumeInitialization = {
36
+ kind: 'empty';
37
+ ownership: TServiceVolumeOwnership;
38
+ } | {
39
+ kind: 'import';
40
+ source: TServiceVolumeImportSource;
41
+ };
42
+ /**
43
+ * What a volume's initialization derives for a local storage claim, or why it derives nothing.
44
+ *
45
+ * `volume-initialization-unknown` is a volume with no initialization: Cloudly never assumes
46
+ * `empty`, because an empty volume in front of a service whose data sits in a legacy volume would
47
+ * start that service without its data. `volume-ownership-unknown` is a `run-as` ownership while
48
+ * the runtime spec runs the image's own user (`runAs: null`), whose numeric identity Cloudly does
49
+ * not know.
50
+ */
51
+ export type TServiceVolumeClaimInitialization = {
52
+ status: 'derived';
53
+ initialization: 'empty';
54
+ initialOwnership: IRuntimeLocalStorageOwnership;
55
+ } | {
56
+ status: 'derived';
57
+ initialization: 'import';
58
+ initialOwnership: null;
59
+ } | {
60
+ status: 'refused';
61
+ reason: 'volume-initialization-unknown' | 'volume-ownership-unknown';
62
+ };
63
+ /**
64
+ * Why `setServiceVolumeInitialization` wrote nothing. `volume-not-found` names no declared volume
65
+ * at that mount path, `conflict` a stored initialization other than `expected`,
66
+ * `volume-initialization-invalid` a value this contract refuses, and
67
+ * `volume-initialization-bound` a change while a bound local storage claim of the volume exists:
68
+ * a claim keeps the initialization and ownership it was issued with for its whole life.
69
+ */
70
+ export type TServiceVolumeInitializationRefusal = 'volume-not-found' | 'conflict' | 'volume-initialization-invalid' | 'volume-initialization-bound';
71
+ /** The named refusal of `setServiceVolumeInitialization`, sent as `TypedResponseError.errorData`. */
72
+ export interface IServiceVolumeInitializationErrorData {
73
+ code: TServiceVolumeInitializationRefusal;
74
+ retryable: false;
75
+ }
76
+ export declare const serviceVolumeInitializationContract: Readonly<{
77
+ /** Every permission bit an ownership may state, the local storage claim's own bound. */
78
+ readonly directoryModeBits: 2047;
79
+ readonly maximumDockerVolumeNameLength: 255;
80
+ }>;
81
+ /** Validates one volume initialization and names every reason it is refused. */
82
+ export declare const validateServiceVolumeInitialization: (valueArg: unknown, pathArg?: string) => string[];
83
+ /**
84
+ * The claim fields a volume's initialization derives under a runtime spec's `runAs`.
85
+ *
86
+ * Absent initialization refuses as `volume-initialization-unknown`; a `run-as` ownership under
87
+ * `runAs: null` refuses as `volume-ownership-unknown`. Nothing is defaulted. The answer is for the
88
+ * first generation of a claim only: later generations carry that claim's own initialization and
89
+ * ownership, whatever `runAs` says by then. A malformed initialization or `runAs` throws.
90
+ */
91
+ export declare const deriveServiceVolumeClaimInitialization: (initializationArg: TServiceVolumeInitialization | undefined, runAsArg: IServiceRuntimeProfile["runAs"]) => TServiceVolumeClaimInitialization;