@serve.zone/interfaces 32.23.0 → 32.25.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 +55 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/clusternode.d.ts +16 -1
- package/dist_ts/data/clusternode.js +1 -1
- package/dist_ts/data/corestorelegacyadoption.d.ts +6 -2
- package/dist_ts/data/corestorelegacyadoption.js +11 -8
- package/dist_ts/data/runtimelocalstorageclaim.d.ts +73 -10
- package/dist_ts/data/runtimelocalstorageclaim.js +89 -2
- package/dist_ts/platform/index.d.ts +3 -1
- package/dist_ts/platform/index.js +4 -2
- package/dist_ts/platform/objectstorage.d.ts +58 -0
- package/dist_ts/platform/objectstorage.js +136 -1
- package/dist_ts/platform/objectstorageenvironment.d.ts +49 -0
- package/dist_ts/platform/objectstorageenvironment.js +119 -0
- package/dist_ts/platform/objectstorageretention.d.ts +40 -0
- package/dist_ts/platform/objectstorageretention.js +121 -1
- package/dist_ts/requests/node.d.ts +29 -0
- package/package.json +1 -1
- package/readme.md +130 -13
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/clusternode.ts +17 -1
- package/ts/data/corestorelegacyadoption.ts +19 -9
- package/ts/data/runtimelocalstorageclaim.ts +169 -10
- package/ts/platform/index.ts +3 -0
- package/ts/platform/objectstorage.ts +180 -0
- package/ts/platform/objectstorageenvironment.ts +176 -0
- package/ts/platform/objectstorageretention.ts +141 -0
- package/ts/requests/node.ts +33 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
|
|
2
2
|
import { snapshotRuntimeSessionBinding } from './runtimesession.js';
|
|
3
3
|
import { captureNetwork, networkController, networkDigest, networkEqual, networkHash, networkId, networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, requireNetwork, } from '../private/networkcontract.js';
|
|
4
|
+
import { parseCanonicalIpAddress } from '../private/ipaddress.js';
|
|
4
5
|
import { isRuntimeIdentityNumber } from '../private/runtimepolicy.js';
|
|
5
6
|
import { createStorageContractReaders } from '../private/storagecontract.js';
|
|
6
7
|
export const runtimeLocalStorageClaimContract = Object.freeze({
|
|
@@ -10,6 +11,16 @@ export const runtimeLocalStorageClaimContract = Object.freeze({
|
|
|
10
11
|
reclaimPolicy: 'retain',
|
|
11
12
|
/** Every permission bit a claim may state: setgid, sticky and the rwx triplets. */
|
|
12
13
|
directoryModeBits: 0o3777,
|
|
14
|
+
nfsVersions: ['3', '4.0', '4.1', '4.2'],
|
|
15
|
+
smbVersions: ['3.0', '3.02', '3.1.1'],
|
|
16
|
+
/** The longest hostname a network source may name, in characters. */
|
|
17
|
+
maximumServerLength: 253,
|
|
18
|
+
/** The longest `export` or `subPath`, in characters; every character is printable ASCII. */
|
|
19
|
+
maximumPathLength: 1024,
|
|
20
|
+
/** The longest segment of an `export` or `subPath`. */
|
|
21
|
+
maximumSegmentLength: 255,
|
|
22
|
+
/** The longest SMB share name. */
|
|
23
|
+
maximumShareLength: 80,
|
|
13
24
|
});
|
|
14
25
|
const fail = () => { throw new Error(runtimeLocalStorageClaimContract.error); };
|
|
15
26
|
const safe = (operationArg) => { try {
|
|
@@ -21,7 +32,81 @@ catch {
|
|
|
21
32
|
const { readMountPath } = createStorageContractReaders(fail);
|
|
22
33
|
const claimStates = ['ready', 'import-required', 'purged', 'uncertain'];
|
|
23
34
|
const responseStatuses = ['accepted', 'replay', 'historical'];
|
|
35
|
+
const hostnameLabelPattern = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
|
|
36
|
+
/**
|
|
37
|
+
* Printable ASCII without a space. One spelling per name, so two claims cannot name one directory
|
|
38
|
+
* two ways, and nothing a mount source or an option string reads as a separator.
|
|
39
|
+
*/
|
|
40
|
+
const printableAsciiPattern = /^[\x21-\x7e]+$/;
|
|
41
|
+
/** A comma or `=` would read as a mount option; the rest have meaning in a mount source or an SMB name. */
|
|
42
|
+
const pathSegmentForbiddenPattern = /["*,/:<=>?\\|]/;
|
|
43
|
+
/** SMB refuses these in a share name, beyond what it refuses in a path segment. */
|
|
44
|
+
const shareForbiddenPattern = /[+;\[\]]/;
|
|
45
|
+
/**
|
|
46
|
+
* A lowercase fully qualified hostname of two or more labels whose last label is not numeric, or a
|
|
47
|
+
* canonical IP literal. One label would resolve through each node's own search domains; a numeric
|
|
48
|
+
* last label would let a non-canonical address pass as a hostname. There is no port and no
|
|
49
|
+
* userinfo: the node connects to the protocol's standard port.
|
|
50
|
+
*/
|
|
51
|
+
const serverOf = (valueArg) => {
|
|
52
|
+
requireNetwork(typeof valueArg === 'string');
|
|
53
|
+
if (parseCanonicalIpAddress(valueArg) !== null)
|
|
54
|
+
return valueArg;
|
|
55
|
+
const labels = valueArg.split('.');
|
|
56
|
+
requireNetwork(valueArg.length <= runtimeLocalStorageClaimContract.maximumServerLength && labels.length >= 2
|
|
57
|
+
&& labels.every((labelArg) => hostnameLabelPattern.test(labelArg))
|
|
58
|
+
&& !/^[0-9]+$/.test(labels[labels.length - 1]));
|
|
59
|
+
return valueArg;
|
|
60
|
+
};
|
|
61
|
+
const isPathSegment = (valueArg) => valueArg.length <= runtimeLocalStorageClaimContract.maximumSegmentLength
|
|
62
|
+
&& printableAsciiPattern.test(valueArg) && !pathSegmentForbiddenPattern.test(valueArg)
|
|
63
|
+
&& valueArg !== '.' && valueArg !== '..';
|
|
64
|
+
const isRelativeSegments = (valueArg) => valueArg.length <= runtimeLocalStorageClaimContract.maximumPathLength
|
|
65
|
+
&& valueArg.split('/').every(isPathSegment);
|
|
66
|
+
/** `/`, or `/` followed by canonical segments without a trailing slash. */
|
|
67
|
+
const exportOf = (valueArg) => {
|
|
68
|
+
requireNetwork(typeof valueArg === 'string' && valueArg.length <= runtimeLocalStorageClaimContract.maximumPathLength
|
|
69
|
+
&& valueArg.startsWith('/') && (valueArg === '/' || isRelativeSegments(valueArg.slice(1))));
|
|
70
|
+
return valueArg;
|
|
71
|
+
};
|
|
72
|
+
/** `.`, or canonical relative segments. */
|
|
73
|
+
const subPathOf = (valueArg) => {
|
|
74
|
+
requireNetwork(typeof valueArg === 'string' && (valueArg === '.' || isRelativeSegments(valueArg)));
|
|
75
|
+
return valueArg;
|
|
76
|
+
};
|
|
77
|
+
const shareOf = (valueArg) => {
|
|
78
|
+
requireNetwork(typeof valueArg === 'string' && valueArg.length <= runtimeLocalStorageClaimContract.maximumShareLength
|
|
79
|
+
&& isPathSegment(valueArg) && !shareForbiddenPattern.test(valueArg));
|
|
80
|
+
return valueArg;
|
|
81
|
+
};
|
|
82
|
+
const literalOf = (valueArg, allowedArg) => {
|
|
83
|
+
requireNetwork(allowedArg.includes(valueArg));
|
|
84
|
+
return valueArg;
|
|
85
|
+
};
|
|
24
86
|
const sourceOf = (valueArg) => {
|
|
87
|
+
requireNetwork(valueArg !== null && typeof valueArg === 'object');
|
|
88
|
+
const { kind } = valueArg;
|
|
89
|
+
if (kind === 'nfs') {
|
|
90
|
+
const value = networkRecord(valueArg, ['kind', 'server', 'export', 'subPath', 'version']);
|
|
91
|
+
return {
|
|
92
|
+
kind: 'nfs',
|
|
93
|
+
server: serverOf(value.server),
|
|
94
|
+
export: exportOf(value.export),
|
|
95
|
+
subPath: subPathOf(value.subPath),
|
|
96
|
+
version: literalOf(value.version, runtimeLocalStorageClaimContract.nfsVersions),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (kind === 'smb') {
|
|
100
|
+
const value = networkRecord(valueArg, ['kind', 'server', 'share', 'subPath', 'version', 'credential']);
|
|
101
|
+
return {
|
|
102
|
+
kind: 'smb',
|
|
103
|
+
server: serverOf(value.server),
|
|
104
|
+
share: shareOf(value.share),
|
|
105
|
+
subPath: subPathOf(value.subPath),
|
|
106
|
+
version: literalOf(value.version, runtimeLocalStorageClaimContract.smbVersions),
|
|
107
|
+
credential: networkReference(value.credential),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
25
110
|
const value = networkRecord(valueArg, ['kind']);
|
|
26
111
|
requireNetwork(value.kind === 'directory');
|
|
27
112
|
return { kind: 'directory' };
|
|
@@ -48,6 +133,8 @@ export const snapshotRuntimeLocalStorageClaim = (valueArg) => safe(() => {
|
|
|
48
133
|
|| (value.initialization === 'import' && value.initialOwnership === null));
|
|
49
134
|
requireNetwork(value.accessMode === 'ReadWriteOnce' && value.reclaimPolicy === 'retain');
|
|
50
135
|
requireNetwork(value.lifecycle === 'bound' || (value.lifecycle === 'purge' && previous !== null));
|
|
136
|
+
const source = sourceOf(value.source);
|
|
137
|
+
requireNetwork(source.kind !== 'smb' || value.initialization === 'empty');
|
|
51
138
|
return {
|
|
52
139
|
id, generation, previous,
|
|
53
140
|
controller: networkController(value.controller),
|
|
@@ -57,7 +144,7 @@ export const snapshotRuntimeLocalStorageClaim = (valueArg) => safe(() => {
|
|
|
57
144
|
runtimeNamespace: networkId(value.runtimeNamespace),
|
|
58
145
|
serviceId: networkId(value.serviceId),
|
|
59
146
|
volumeId: networkId(value.volumeId),
|
|
60
|
-
source
|
|
147
|
+
source,
|
|
61
148
|
initialization: value.initialization,
|
|
62
149
|
initialOwnership: value.initialOwnership === null ? null : ownershipOf(value.initialOwnership),
|
|
63
150
|
mount: mountOf(value.mount),
|
|
@@ -164,4 +251,4 @@ export const bindApplyRuntimeLocalStorageClaimResponse = (valueArg, requestArg)
|
|
|
164
251
|
}
|
|
165
252
|
return response;
|
|
166
253
|
});
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWxvY2Fsc3RvcmFnZWNsYWltLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lbG9jYWxzdG9yYWdlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQzdGLGFBQWEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGNBQWMsR0FDcEcsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQTBGN0UsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RCxZQUFZLEVBQUUsd0NBQXdDO0lBQ3RELEtBQUssRUFBRSxnREFBZ0Q7SUFDdkQsVUFBVSxFQUFFLGVBQWU7SUFDM0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsbUZBQW1GO0lBQ25GLGlCQUFpQixFQUFFLE1BQU07Q0FDakIsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RixNQUFNLElBQUksR0FBRyxDQUFJLFlBQXFCLEVBQUssRUFBRSxHQUFHLElBQUksQ0FBQztJQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7QUFBQyxDQUFDO0FBQUMsTUFBTSxDQUFDO0lBQUMs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
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWxvY2Fsc3RvcmFnZWNsYWltLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lbG9jYWxzdG9yYWdlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQzdGLGFBQWEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGNBQWMsR0FDcEcsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQXlKN0UsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RCxZQUFZLEVBQUUsd0NBQXdDO0lBQ3RELEtBQUssRUFBRSxnREFBZ0Q7SUFDdkQsVUFBVSxFQUFFLGVBQWU7SUFDM0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsbUZBQW1GO0lBQ25GLGlCQUFpQixFQUFFLE1BQU07SUFDekIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQ3ZDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3JDLHFFQUFxRTtJQUNyRSxtQkFBbUIsRUFBRSxHQUFHO0lBQ3hCLDRGQUE0RjtJQUM1RixpQkFBaUIsRUFBRSxJ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
|
|
@@ -5,6 +5,7 @@ import * as email from './email.js';
|
|
|
5
5
|
import * as letter from './letter.js';
|
|
6
6
|
import * as logging from './logging.js';
|
|
7
7
|
import * as objectstorage from './objectstorage.js';
|
|
8
|
+
import * as objectstorageenvironment from './objectstorageenvironment.js';
|
|
8
9
|
import * as objectstorageretention from './objectstorageretention.js';
|
|
9
10
|
import * as pushnotification from './pushnotification.js';
|
|
10
11
|
import * as sip from './sip.js';
|
|
@@ -12,9 +13,10 @@ import * as sms from './sms.js';
|
|
|
12
13
|
import * as storage from './storage.js';
|
|
13
14
|
import * as storagemigration from './storagemigration.js';
|
|
14
15
|
import * as types from './types.js';
|
|
15
|
-
export { ai, backup, database, email, letter, logging, objectstorage, objectstorageretention, pushnotification, sip, sms, storage, storagemigration, types, };
|
|
16
|
+
export { ai, backup, database, email, letter, logging, objectstorage, objectstorageenvironment, objectstorageretention, pushnotification, sip, sms, storage, storagemigration, types, };
|
|
16
17
|
export * from './storage.js';
|
|
17
18
|
export * from './objectstorage.js';
|
|
19
|
+
export * from './objectstorageenvironment.js';
|
|
18
20
|
export * from './objectstorageretention.js';
|
|
19
21
|
export * from './storagemigration.js';
|
|
20
22
|
export * from './types.js';
|
|
@@ -5,6 +5,7 @@ import * as email from './email.js';
|
|
|
5
5
|
import * as letter from './letter.js';
|
|
6
6
|
import * as logging from './logging.js';
|
|
7
7
|
import * as objectstorage from './objectstorage.js';
|
|
8
|
+
import * as objectstorageenvironment from './objectstorageenvironment.js';
|
|
8
9
|
import * as objectstorageretention from './objectstorageretention.js';
|
|
9
10
|
import * as pushnotification from './pushnotification.js';
|
|
10
11
|
import * as sip from './sip.js';
|
|
@@ -12,10 +13,11 @@ import * as sms from './sms.js';
|
|
|
12
13
|
import * as storage from './storage.js';
|
|
13
14
|
import * as storagemigration from './storagemigration.js';
|
|
14
15
|
import * as types from './types.js';
|
|
15
|
-
export { ai, backup, database, email, letter, logging, objectstorage, objectstorageretention, pushnotification, sip, sms, storage, storagemigration, types, };
|
|
16
|
+
export { ai, backup, database, email, letter, logging, objectstorage, objectstorageenvironment, objectstorageretention, pushnotification, sip, sms, storage, storagemigration, types, };
|
|
16
17
|
export * from './storage.js';
|
|
17
18
|
export * from './objectstorage.js';
|
|
19
|
+
export * from './objectstorageenvironment.js';
|
|
18
20
|
export * from './objectstorageretention.js';
|
|
19
21
|
export * from './storagemigration.js';
|
|
20
22
|
export * from './types.js';
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wbGF0Zm9ybS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssUUFBUSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssYUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sS0FBSyx3QkFBd0IsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRSxPQUFPLEtBQUssc0JBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQ0wsRUFBRSxFQUNGLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1AsYUFBYSxFQUNiLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLEdBQUcsRUFDSCxHQUFHLEVBQ0gsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixLQUFLLEdBQ04sQ0FBQztBQUVGLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxZQUFZLENBQUMifQ==
|
|
@@ -10,3 +10,61 @@ export declare const platformObjectStorageBucketNameLimits: Readonly<{
|
|
|
10
10
|
}>;
|
|
11
11
|
/** Mirrors ObjectStorage's canonical S3 bucket boundary without normalizing input. */
|
|
12
12
|
export declare const validatePlatformObjectStorageBucketName: (bucketNameArg: unknown, pathArg?: string) => string[];
|
|
13
|
+
/**
|
|
14
|
+
* Where a workload reaches one node's S3 object storage, and the region it signs requests for.
|
|
15
|
+
*
|
|
16
|
+
* Non-secret and value-free: it says where, never with what. The access key and secret stay in
|
|
17
|
+
* the binding's sealed Secret set. Corestore is node-local, so this is a fact about the node that
|
|
18
|
+
* holds the bucket, stated by an administrator on `IClusterNode.data.corestoreObjectStorage`;
|
|
19
|
+
* Cloudly reads it from there and never derives a port, a scheme or a region.
|
|
20
|
+
*/
|
|
21
|
+
export interface IPlatformObjectStorageEndpoint {
|
|
22
|
+
/**
|
|
23
|
+
* The canonical `http:` or `https:` origin of the S3 API, for example `http://192.0.2.15:9000`:
|
|
24
|
+
* a host, an optional port, and nothing else — no path, query, fragment, userinfo, trailing
|
|
25
|
+
* slash or default port. The host is the one a workload on that node can reach.
|
|
26
|
+
*/
|
|
27
|
+
endpoint: string;
|
|
28
|
+
/** The SigV4 signing region the object storage answers for, for example `us-east-1`. */
|
|
29
|
+
region: string;
|
|
30
|
+
}
|
|
31
|
+
export declare const platformObjectStorageEndpointLimits: Readonly<{
|
|
32
|
+
maximumEndpointLength: 2048;
|
|
33
|
+
maximumRegionLength: 64;
|
|
34
|
+
}>;
|
|
35
|
+
/** Validates an object-storage endpoint and names every reason it is refused. */
|
|
36
|
+
export declare const validatePlatformObjectStorageEndpoint: (valueArg: unknown, pathArg?: string) => string[];
|
|
37
|
+
/**
|
|
38
|
+
* The non-secret environment names that tell a workload where its bucket is.
|
|
39
|
+
*
|
|
40
|
+
* These are the names Corestore has always handed a workload for a bucket, so an application that
|
|
41
|
+
* read them keeps working unchanged. The six credential aliases (`S3_ACCESS_KEY`,
|
|
42
|
+
* `S3_ACCESS_KEY_ID`, `S3_SECRET_KEY`, `S3_SECRET_ACCESS_KEY`, `AWS_ACCESS_KEY_ID`,
|
|
43
|
+
* `AWS_SECRET_ACCESS_KEY`) are not among them: they are Secrets and reach the workload only through
|
|
44
|
+
* the binding's sealed Secret set.
|
|
45
|
+
*
|
|
46
|
+
* - `S3_ENDPOINT`, `AWS_ENDPOINT_URL`: the endpoint origin, identical.
|
|
47
|
+
* - `S3_ENDPOINT_HOST`: the origin's host, as the URL states it (an IPv6 literal keeps its brackets).
|
|
48
|
+
* - `S3_PORT`: the origin's port in decimal, `80` or `443` when the origin states none.
|
|
49
|
+
* - `S3_USE_SSL`: `true` for an `https:` origin, `false` for `http:`.
|
|
50
|
+
* - `S3_REGION`, `AWS_REGION`: the signing region, identical.
|
|
51
|
+
* - `S3_BUCKET`: the binding's bucket, `IPlatformBinding.objectstorageBucketName`.
|
|
52
|
+
* - `AWS_S3_FORCE_PATH_STYLE`: always `true` — a node-local origin has no wildcard DNS and a bucket
|
|
53
|
+
* name may contain dots, so path-style addressing is the only one that reaches the bucket.
|
|
54
|
+
*/
|
|
55
|
+
export declare const objectStorageEndpointEnvironmentKeys: readonly ["S3_ENDPOINT", "S3_ENDPOINT_HOST", "S3_PORT", "S3_REGION", "S3_BUCKET", "S3_USE_SSL", "AWS_ENDPOINT_URL", "AWS_REGION", "AWS_S3_FORCE_PATH_STYLE"];
|
|
56
|
+
export type TObjectStorageEndpointEnvironmentKey = typeof objectStorageEndpointEnvironmentKeys[number];
|
|
57
|
+
export type TObjectStorageEndpointEnvironment = {
|
|
58
|
+
[TKey in TObjectStorageEndpointEnvironmentKey]: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* The endpoint environment for one bucket.
|
|
62
|
+
*
|
|
63
|
+
* Throws the first reason the endpoint or the bucket name is refused; nothing is defaulted.
|
|
64
|
+
*/
|
|
65
|
+
export declare const createObjectStorageEndpointEnvironment: (endpointArg: IPlatformObjectStorageEndpoint, bucketNameArg: string) => TObjectStorageEndpointEnvironment;
|
|
66
|
+
/**
|
|
67
|
+
* Validates an endpoint environment: exactly its nine keys, each value the one
|
|
68
|
+
* `createObjectStorageEndpointEnvironment()` derives from the same endpoint and bucket.
|
|
69
|
+
*/
|
|
70
|
+
export declare const validateObjectStorageEndpointEnvironment: (environmentArg: unknown, pathArg?: string) => string[];
|
|
@@ -18,4 +18,139 @@ export const validatePlatformObjectStorageBucketName = (bucketNameArg, pathArg =
|
|
|
18
18
|
}
|
|
19
19
|
return [];
|
|
20
20
|
};
|
|
21
|
-
|
|
21
|
+
export const platformObjectStorageEndpointLimits = Object.freeze({
|
|
22
|
+
maximumEndpointLength: 2048,
|
|
23
|
+
maximumRegionLength: 64,
|
|
24
|
+
});
|
|
25
|
+
const platformObjectStorageRegionPattern = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
|
|
26
|
+
const isPlainObject = (valueArg) => (Boolean(valueArg)
|
|
27
|
+
&& typeof valueArg === 'object'
|
|
28
|
+
&& !Array.isArray(valueArg)
|
|
29
|
+
&& (Object.getPrototypeOf(valueArg) === Object.prototype
|
|
30
|
+
|| Object.getPrototypeOf(valueArg) === null));
|
|
31
|
+
/** Validates an object-storage endpoint and names every reason it is refused. */
|
|
32
|
+
export const validatePlatformObjectStorageEndpoint = (valueArg, pathArg = 'objectstorage endpoint') => {
|
|
33
|
+
if (!isPlainObject(valueArg)
|
|
34
|
+
|| Object.keys(valueArg).length !== 2
|
|
35
|
+
|| !Object.hasOwn(valueArg, 'endpoint')
|
|
36
|
+
|| !Object.hasOwn(valueArg, 'region')) {
|
|
37
|
+
return [`${pathArg} must use its exact schema`];
|
|
38
|
+
}
|
|
39
|
+
const errors = [];
|
|
40
|
+
const endpoint = valueArg.endpoint;
|
|
41
|
+
if (typeof endpoint !== 'string'
|
|
42
|
+
|| endpoint.length === 0
|
|
43
|
+
|| endpoint.length > platformObjectStorageEndpointLimits.maximumEndpointLength) {
|
|
44
|
+
errors.push(`${pathArg} endpoint must be a string of 1 to `
|
|
45
|
+
+ `${platformObjectStorageEndpointLimits.maximumEndpointLength} characters`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
let parsedEndpoint;
|
|
49
|
+
try {
|
|
50
|
+
parsedEndpoint = new URL(endpoint);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
errors.push(`${pathArg} endpoint must be a parsable URL`);
|
|
54
|
+
}
|
|
55
|
+
if (parsedEndpoint) {
|
|
56
|
+
if (parsedEndpoint.protocol !== 'http:' && parsedEndpoint.protocol !== 'https:') {
|
|
57
|
+
errors.push(`${pathArg} endpoint must use the http or https scheme`);
|
|
58
|
+
}
|
|
59
|
+
if (parsedEndpoint.username || parsedEndpoint.password) {
|
|
60
|
+
errors.push(`${pathArg} endpoint must not carry userinfo`);
|
|
61
|
+
}
|
|
62
|
+
if (parsedEndpoint.origin !== endpoint) {
|
|
63
|
+
errors.push(`${pathArg} endpoint must be a canonical origin without a path, query, `
|
|
64
|
+
+ 'fragment, trailing slash or default port');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (typeof valueArg.region !== 'string'
|
|
69
|
+
|| !platformObjectStorageRegionPattern.test(valueArg.region)) {
|
|
70
|
+
errors.push(`${pathArg} region must be 1 to `
|
|
71
|
+
+ `${platformObjectStorageEndpointLimits.maximumRegionLength} lowercase letters, digits `
|
|
72
|
+
+ 'and inner hyphens');
|
|
73
|
+
}
|
|
74
|
+
return errors;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* The non-secret environment names that tell a workload where its bucket is.
|
|
78
|
+
*
|
|
79
|
+
* These are the names Corestore has always handed a workload for a bucket, so an application that
|
|
80
|
+
* read them keeps working unchanged. The six credential aliases (`S3_ACCESS_KEY`,
|
|
81
|
+
* `S3_ACCESS_KEY_ID`, `S3_SECRET_KEY`, `S3_SECRET_ACCESS_KEY`, `AWS_ACCESS_KEY_ID`,
|
|
82
|
+
* `AWS_SECRET_ACCESS_KEY`) are not among them: they are Secrets and reach the workload only through
|
|
83
|
+
* the binding's sealed Secret set.
|
|
84
|
+
*
|
|
85
|
+
* - `S3_ENDPOINT`, `AWS_ENDPOINT_URL`: the endpoint origin, identical.
|
|
86
|
+
* - `S3_ENDPOINT_HOST`: the origin's host, as the URL states it (an IPv6 literal keeps its brackets).
|
|
87
|
+
* - `S3_PORT`: the origin's port in decimal, `80` or `443` when the origin states none.
|
|
88
|
+
* - `S3_USE_SSL`: `true` for an `https:` origin, `false` for `http:`.
|
|
89
|
+
* - `S3_REGION`, `AWS_REGION`: the signing region, identical.
|
|
90
|
+
* - `S3_BUCKET`: the binding's bucket, `IPlatformBinding.objectstorageBucketName`.
|
|
91
|
+
* - `AWS_S3_FORCE_PATH_STYLE`: always `true` — a node-local origin has no wildcard DNS and a bucket
|
|
92
|
+
* name may contain dots, so path-style addressing is the only one that reaches the bucket.
|
|
93
|
+
*/
|
|
94
|
+
export const objectStorageEndpointEnvironmentKeys = Object.freeze([
|
|
95
|
+
'S3_ENDPOINT',
|
|
96
|
+
'S3_ENDPOINT_HOST',
|
|
97
|
+
'S3_PORT',
|
|
98
|
+
'S3_REGION',
|
|
99
|
+
'S3_BUCKET',
|
|
100
|
+
'S3_USE_SSL',
|
|
101
|
+
'AWS_ENDPOINT_URL',
|
|
102
|
+
'AWS_REGION',
|
|
103
|
+
'AWS_S3_FORCE_PATH_STYLE',
|
|
104
|
+
]);
|
|
105
|
+
/**
|
|
106
|
+
* The endpoint environment for one bucket.
|
|
107
|
+
*
|
|
108
|
+
* Throws the first reason the endpoint or the bucket name is refused; nothing is defaulted.
|
|
109
|
+
*/
|
|
110
|
+
export const createObjectStorageEndpointEnvironment = (endpointArg, bucketNameArg) => {
|
|
111
|
+
const errors = [
|
|
112
|
+
...validatePlatformObjectStorageEndpoint(endpointArg),
|
|
113
|
+
...validatePlatformObjectStorageBucketName(bucketNameArg),
|
|
114
|
+
];
|
|
115
|
+
if (errors.length > 0)
|
|
116
|
+
throw new Error(errors[0]);
|
|
117
|
+
const origin = new URL(endpointArg.endpoint);
|
|
118
|
+
const useSsl = origin.protocol === 'https:';
|
|
119
|
+
return {
|
|
120
|
+
S3_ENDPOINT: endpointArg.endpoint,
|
|
121
|
+
S3_ENDPOINT_HOST: origin.hostname,
|
|
122
|
+
S3_PORT: origin.port || (useSsl ? '443' : '80'),
|
|
123
|
+
S3_REGION: endpointArg.region,
|
|
124
|
+
S3_BUCKET: bucketNameArg,
|
|
125
|
+
S3_USE_SSL: useSsl ? 'true' : 'false',
|
|
126
|
+
AWS_ENDPOINT_URL: endpointArg.endpoint,
|
|
127
|
+
AWS_REGION: endpointArg.region,
|
|
128
|
+
AWS_S3_FORCE_PATH_STYLE: 'true',
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Validates an endpoint environment: exactly its nine keys, each value the one
|
|
133
|
+
* `createObjectStorageEndpointEnvironment()` derives from the same endpoint and bucket.
|
|
134
|
+
*/
|
|
135
|
+
export const validateObjectStorageEndpointEnvironment = (environmentArg, pathArg = 'objectstorage endpoint environment') => {
|
|
136
|
+
if (!isPlainObject(environmentArg)
|
|
137
|
+
|| Object.keys(environmentArg).length !== objectStorageEndpointEnvironmentKeys.length
|
|
138
|
+
|| objectStorageEndpointEnvironmentKeys.some((keyArg) => (!Object.hasOwn(environmentArg, keyArg) || typeof environmentArg[keyArg] !== 'string'))) {
|
|
139
|
+
return [`${pathArg} must contain exactly its string keys`];
|
|
140
|
+
}
|
|
141
|
+
const endpoint = { endpoint: environmentArg.S3_ENDPOINT, region: environmentArg.S3_REGION };
|
|
142
|
+
const errors = [
|
|
143
|
+
...validatePlatformObjectStorageEndpoint(endpoint, pathArg),
|
|
144
|
+
...validatePlatformObjectStorageBucketName(environmentArg.S3_BUCKET, `${pathArg} S3_BUCKET`),
|
|
145
|
+
];
|
|
146
|
+
if (errors.length > 0)
|
|
147
|
+
return errors;
|
|
148
|
+
const expected = createObjectStorageEndpointEnvironment(endpoint, environmentArg.S3_BUCKET);
|
|
149
|
+
for (const key of objectStorageEndpointEnvironmentKeys) {
|
|
150
|
+
if (environmentArg[key] !== expected[key]) {
|
|
151
|
+
errors.push(`${pathArg} ${key} must equal the value derived from its endpoint`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return errors;
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0c3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsYXRmb3JtL29iamVjdHN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqRSxZQUFZLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxFQUFFO0NBQ2pCLENBQUMsQ0FBQztBQUVILHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRyxDQUNyRCxhQUFzQixFQUN0QixPQUFPLEdBQUcsMEJBQTBCLEVBQzFCLEVBQUU7SUFDWixJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLE9BQU8scUNBQXFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUMzRSxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQ25ELENBQUMsQ0FBQztJQUNILElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxxQ0FBcUMsQ0FBQyxZQUFZO1dBQ3hFLGFBQWEsQ0FBQyxNQUFNLEdBQUcscUNBQXFDLENBQUMsWUFBWTtXQUN6RSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7V0FDcEQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7V0FDNUIsYUFBYSxFQUFFLENBQUM7UUFDbkIsT0FBTyxDQUFDLEdBQUcsT0FBTyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUMsQ0FBQztBQXFCRixNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQy9ELHFCQUFxQixFQUFFLElBQUk7SUFDM0IsbUJBQW1CLEVBQUUsRUFBRTtDQUN4QixDQUFDLENBQUM7QUFFSCxNQUFNLGtDQUFrQyxHQUFHLHdDQUF3QyxDQUFDO0FBRXBGLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBaUIsRUFBdUMsRUFBRSxDQUFDLENBQ2hGLE9BQU8sQ0FBQyxRQUFRLENBQUM7T0FDZCxPQUFPLFFBQVEsS0FBSyxRQUFRO09BQzVCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7T0FDeEIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTO1dBQ25ELE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQy9DLENBQUM7QUFFRixpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUcsQ0FDbkQsUUFBaUIsRUFDakIsT0FBTyxHQUFHLHdCQUF3QixFQUN4QixFQUFFO0lBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7V0FDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztXQUNsQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztXQUNwQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEMsT0FBTyxDQUFDLEdBQUcsT0FBTyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNuQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7V0FDM0IsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1dBQ3JCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsbUNBQW1DLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNqRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxxQ0FBcUM7Y0FDdkQsR0FBRyxtQ0FBbUMsQ0FBQyxxQkFBcUIsYUFBYSxDQUFDLENBQUM7SUFDakYsQ0FBQztTQUFNLENBQUM7UUFDTixJQUFJLGNBQStCLENBQUM7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLElBQUksY0FBYyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksY0FBYyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEYsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sNkNBQTZDLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBQ0QsSUFBSSxjQUFjLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sbUNBQW1DLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyw4REFBOEQ7c0JBQ2hGLDBDQUEwQyxDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEtBQUssUUFBUTtXQUNsQyxDQUFDLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyx1QkFBdUI7Y0FDekMsR0FBRyxtQ0FBbUMsQ0FBQyxtQkFBbUIsNkJBQTZCO2NBQ3ZGLG1CQUFtQixDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEUsYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWix5QkFBeUI7Q0FDakIsQ0FBQyxDQUFDO0FBU1o7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUFHLENBQ3BELFdBQTJDLEVBQzNDLGFBQXFCLEVBQ2MsRUFBRTtJQUNyQyxNQUFNLE1BQU0sR0FBRztRQUNiLEdBQUcscUNBQXFDLENBQUMsV0FBVyxDQUFDO1FBQ3JELEdBQUcsdUNBQXVDLENBQUMsYUFBYSxDQUFDO0tBQzFELENBQUM7SUFDRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDO0lBQzVDLE9BQU87UUFDTCxXQUFXLEVBQUUsV0FBVyxDQUFDLFFBQVE7UUFDakMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDakMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQy9DLFNBQVMsRUFBRSxXQUFXLENBQUMsTUFBTTtRQUM3QixTQUFTLEVBQUUsYUFBYTtRQUN4QixVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87UUFDckMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLFFBQVE7UUFDdEMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1FBQzlCLHVCQUF1QixFQUFFLE1BQU07S0FDaEMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLENBQ3RELGNBQXVCLEVBQ3ZCLE9BQU8sR0FBRyxvQ0FBb0MsRUFDcEMsRUFBRTtJQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO1dBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxLQUFLLG9DQUFvQyxDQUFDLE1BQU07V0FDbEYsb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUN2RCxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFFBQVEsQ0FDckYsQ0FBQyxFQUFFLENBQUM7UUFDTCxPQUFPLENBQUMsR0FBRyxPQUFPLHVDQUF1QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1RixNQUFNLE1BQU0sR0FBRztRQUNiLEdBQUcscUNBQXFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztRQUMzRCxHQUFHLHVDQUF1QyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxPQUFPLFlBQVksQ0FBQztLQUM3RixDQUFDO0lBQ0YsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxzQ0FBc0MsQ0FDckQsUUFBMEMsRUFDMUMsY0FBYyxDQUFDLFNBQW1CLENBQ25DLENBQUM7SUFDRixLQUFLLE1BQU0sR0FBRyxJQUFJLG9DQUFvQyxFQUFFLENBQUM7UUFDdkQsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sSUFBSSxHQUFHLGlEQUFpRCxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { IPlatformBinding } from './types.js';
|
|
2
|
+
import type { IPlatformObjectStorageEndpoint, TObjectStorageEndpointEnvironment, TObjectStorageEndpointEnvironmentKey } from './objectstorage.js';
|
|
3
|
+
import type { TObjectStorageRetentionEnvironment, TObjectStorageRetentionEnvironmentKey } from './objectstorageretention.js';
|
|
4
|
+
/**
|
|
5
|
+
* Every non-secret environment name an object-storage binding can give a workload: the nine
|
|
6
|
+
* endpoint names first, then the eleven retention names.
|
|
7
|
+
*/
|
|
8
|
+
export declare const objectStorageBindingEnvironmentKeys: readonly ["S3_ENDPOINT", "S3_ENDPOINT_HOST", "S3_PORT", "S3_REGION", "S3_BUCKET", "S3_USE_SSL", "AWS_ENDPOINT_URL", "AWS_REGION", "AWS_S3_FORCE_PATH_STYLE", "S3_RETENTION_MODE", "S3_RETENTION_POLICY_ID", "S3_RETENTION_DURATION_SECONDS", "S3_RETENTION_INTENT_SHA256", "S3_RETENTION_SENTINEL_KEY", "S3_RETENTION_CONFIGURED_AT", "S3_RETENTION_SENTINEL_CREATED_AT", "S3_RETENTION_SENTINEL_RETAIN_UNTIL", "S3_RETENTION_SENTINEL_PAYLOAD_SHA256", "S3_RETENTION_SENTINEL_METADATA_SHA256", "S3_RETENTION_SENTINEL_ETAG"];
|
|
9
|
+
export type TObjectStorageBindingEnvironmentKey = TObjectStorageEndpointEnvironmentKey | TObjectStorageRetentionEnvironmentKey;
|
|
10
|
+
/**
|
|
11
|
+
* The non-secret environment of one object-storage binding: always the endpoint names, and the
|
|
12
|
+
* retention names exactly when the binding declares compliance retention. Never a credential.
|
|
13
|
+
*/
|
|
14
|
+
export type TObjectStorageBindingEnvironment = TObjectStorageEndpointEnvironment | (TObjectStorageEndpointEnvironment & TObjectStorageRetentionEnvironment);
|
|
15
|
+
/**
|
|
16
|
+
* The environment Cloudly composes into a workload's runtime configuration for one binding.
|
|
17
|
+
*
|
|
18
|
+
* `bindingArg` is the Cloudly binding document and `endpointArg` the
|
|
19
|
+
* `IClusterNode.data.corestoreObjectStorage` of the node the binding is placed on. Refused by
|
|
20
|
+
* name, never guessed:
|
|
21
|
+
*
|
|
22
|
+
* - a binding that is not `objectstorage` or carries no canonical `objectstorageBucketName`;
|
|
23
|
+
* - an endpoint that `validatePlatformObjectStorageEndpoint()` refuses;
|
|
24
|
+
* - a binding that declares `objectstorageRetention` without `evidence`. Its bucket's retention is
|
|
25
|
+
* not proven yet, so the workload is not given an environment that would let it run as if its
|
|
26
|
+
* bucket were ordinary storage; the caller waits for the evidence.
|
|
27
|
+
* - evidence that does not prove the binding's own service, binding id, bucket and intent.
|
|
28
|
+
*
|
|
29
|
+
* A binding without `objectstorageRetention` gets the endpoint names alone: it promised no
|
|
30
|
+
* retention, so there is nothing to state.
|
|
31
|
+
*
|
|
32
|
+
* The evidence's reconciliation generation and binding-request digest are read from its own
|
|
33
|
+
* authority: they are what Cloudly checked when it admitted the evidence, and the binding document
|
|
34
|
+
* does not repeat them. Everything the binding does state is checked again here.
|
|
35
|
+
*/
|
|
36
|
+
export declare const createObjectStorageBindingEnvironment: (bindingArg: IPlatformBinding, endpointArg: IPlatformObjectStorageEndpoint) => Promise<TObjectStorageBindingEnvironment>;
|
|
37
|
+
/**
|
|
38
|
+
* Validates one binding's environment: the nine endpoint names, the eleven retention names all or
|
|
39
|
+
* none, and nothing else — so a credential alias, or any other name, is refused.
|
|
40
|
+
*/
|
|
41
|
+
export declare const validateObjectStorageBindingEnvironment: (environmentArg: unknown, pathArg?: string) => Promise<string[]>;
|
|
42
|
+
/**
|
|
43
|
+
* A workload environment with one binding's environment added.
|
|
44
|
+
*
|
|
45
|
+
* Refuses, naming every key, when the environment already holds one of the binding's names: a
|
|
46
|
+
* service that sets `S3_ENDPOINT` itself, or a second object-storage binding on the same service,
|
|
47
|
+
* would otherwise have one value silently replace the other. The inputs are not changed.
|
|
48
|
+
*/
|
|
49
|
+
export declare const mergeObjectStorageBindingEnvironment: (environmentArg: Readonly<Record<string, string>>, bindingEnvironmentArg: TObjectStorageBindingEnvironment) => Record<string, string>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createObjectStorageEndpointEnvironment, objectStorageEndpointEnvironmentKeys, validateObjectStorageEndpointEnvironment, validatePlatformObjectStorageBucketName, } from './objectstorage.js';
|
|
2
|
+
import { createObjectStorageRetentionEnvironment, objectStorageRetentionEnvironmentKeys, validateObjectStorageRetentionEnvironment, validateObjectStorageRetentionIntent, } from './objectstorageretention.js';
|
|
3
|
+
import { isPlainRecord, readDataProperties } from '../private/dataproperties.js';
|
|
4
|
+
/**
|
|
5
|
+
* Every non-secret environment name an object-storage binding can give a workload: the nine
|
|
6
|
+
* endpoint names first, then the eleven retention names.
|
|
7
|
+
*/
|
|
8
|
+
export const objectStorageBindingEnvironmentKeys = Object.freeze([
|
|
9
|
+
...objectStorageEndpointEnvironmentKeys,
|
|
10
|
+
...objectStorageRetentionEnvironmentKeys,
|
|
11
|
+
]);
|
|
12
|
+
/**
|
|
13
|
+
* The environment Cloudly composes into a workload's runtime configuration for one binding.
|
|
14
|
+
*
|
|
15
|
+
* `bindingArg` is the Cloudly binding document and `endpointArg` the
|
|
16
|
+
* `IClusterNode.data.corestoreObjectStorage` of the node the binding is placed on. Refused by
|
|
17
|
+
* name, never guessed:
|
|
18
|
+
*
|
|
19
|
+
* - a binding that is not `objectstorage` or carries no canonical `objectstorageBucketName`;
|
|
20
|
+
* - an endpoint that `validatePlatformObjectStorageEndpoint()` refuses;
|
|
21
|
+
* - a binding that declares `objectstorageRetention` without `evidence`. Its bucket's retention is
|
|
22
|
+
* not proven yet, so the workload is not given an environment that would let it run as if its
|
|
23
|
+
* bucket were ordinary storage; the caller waits for the evidence.
|
|
24
|
+
* - evidence that does not prove the binding's own service, binding id, bucket and intent.
|
|
25
|
+
*
|
|
26
|
+
* A binding without `objectstorageRetention` gets the endpoint names alone: it promised no
|
|
27
|
+
* retention, so there is nothing to state.
|
|
28
|
+
*
|
|
29
|
+
* The evidence's reconciliation generation and binding-request digest are read from its own
|
|
30
|
+
* authority: they are what Cloudly checked when it admitted the evidence, and the binding document
|
|
31
|
+
* does not repeat them. Everything the binding does state is checked again here.
|
|
32
|
+
*/
|
|
33
|
+
export const createObjectStorageBindingEnvironment = async (bindingArg, endpointArg) => {
|
|
34
|
+
const binding = readDataProperties(bindingArg);
|
|
35
|
+
if (binding === null || binding.capability !== 'objectstorage') {
|
|
36
|
+
throw new Error('objectstorage binding environment requires an objectstorage binding');
|
|
37
|
+
}
|
|
38
|
+
const bindingName = typeof binding.id === 'string' ? binding.id : '(unnamed)';
|
|
39
|
+
if (validatePlatformObjectStorageBucketName(binding.objectstorageBucketName).length > 0) {
|
|
40
|
+
throw new Error(`objectstorage binding ${bindingName} carries no canonical bucket name; Cloudly owns it and `
|
|
41
|
+
+ 'no environment invents one');
|
|
42
|
+
}
|
|
43
|
+
const bucketName = binding.objectstorageBucketName;
|
|
44
|
+
const endpointEnvironment = createObjectStorageEndpointEnvironment(endpointArg, bucketName);
|
|
45
|
+
const retention = binding.objectstorageRetention;
|
|
46
|
+
if (retention === undefined) {
|
|
47
|
+
return endpointEnvironment;
|
|
48
|
+
}
|
|
49
|
+
const retentionBinding = readDataProperties(retention);
|
|
50
|
+
if (retentionBinding === null
|
|
51
|
+
|| validateObjectStorageRetentionIntent(retentionBinding.intent).length > 0) {
|
|
52
|
+
throw new Error(`objectstorage binding ${bindingName} must declare canonical compliance-retention intent`);
|
|
53
|
+
}
|
|
54
|
+
const evidence = retentionBinding.evidence;
|
|
55
|
+
if (evidence === undefined) {
|
|
56
|
+
throw new Error(`objectstorage binding ${bindingName} declares compliance retention without verified `
|
|
57
|
+
+ 'evidence; its workload environment waits for the evidence');
|
|
58
|
+
}
|
|
59
|
+
const authority = isPlainRecord(evidence) ? readDataProperties(evidence.authority) : null;
|
|
60
|
+
if (authority === null) {
|
|
61
|
+
throw new Error('objectstorage retention evidence must use its exact schema');
|
|
62
|
+
}
|
|
63
|
+
const retentionEnvironment = await createObjectStorageRetentionEnvironment(evidence, {
|
|
64
|
+
serviceId: binding.serviceId,
|
|
65
|
+
bindingId: binding.id,
|
|
66
|
+
reconciliationGeneration: authority.reconciliationGeneration,
|
|
67
|
+
bindingRequestDigest: authority.bindingRequestDigest,
|
|
68
|
+
bucketName,
|
|
69
|
+
intent: retentionBinding.intent,
|
|
70
|
+
});
|
|
71
|
+
return { ...endpointEnvironment, ...retentionEnvironment };
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Validates one binding's environment: the nine endpoint names, the eleven retention names all or
|
|
75
|
+
* none, and nothing else — so a credential alias, or any other name, is refused.
|
|
76
|
+
*/
|
|
77
|
+
export const validateObjectStorageBindingEnvironment = async (environmentArg, pathArg = 'objectstorage binding environment') => {
|
|
78
|
+
const environment = readDataProperties(environmentArg);
|
|
79
|
+
if (environment === null) {
|
|
80
|
+
return [`${pathArg} must be a plain record of data properties`];
|
|
81
|
+
}
|
|
82
|
+
const allowedKeys = objectStorageBindingEnvironmentKeys;
|
|
83
|
+
const foreignKeys = Object.keys(environment).filter((keyArg) => !allowedKeys.includes(keyArg));
|
|
84
|
+
if (foreignKeys.length > 0) {
|
|
85
|
+
return [`${pathArg} must not contain ${foreignKeys.sort().join(', ')}`];
|
|
86
|
+
}
|
|
87
|
+
const endpointEnvironment = {};
|
|
88
|
+
for (const key of objectStorageEndpointEnvironmentKeys) {
|
|
89
|
+
if (Object.hasOwn(environment, key))
|
|
90
|
+
endpointEnvironment[key] = environment[key];
|
|
91
|
+
}
|
|
92
|
+
const errors = validateObjectStorageEndpointEnvironment(endpointEnvironment, pathArg);
|
|
93
|
+
const retentionKeys = objectStorageRetentionEnvironmentKeys.filter((keyArg) => (Object.hasOwn(environment, keyArg)));
|
|
94
|
+
if (retentionKeys.length > 0) {
|
|
95
|
+
const retentionEnvironment = {};
|
|
96
|
+
for (const key of retentionKeys)
|
|
97
|
+
retentionEnvironment[key] = environment[key];
|
|
98
|
+
errors.push(...await validateObjectStorageRetentionEnvironment(retentionEnvironment, pathArg));
|
|
99
|
+
}
|
|
100
|
+
return errors;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* A workload environment with one binding's environment added.
|
|
104
|
+
*
|
|
105
|
+
* Refuses, naming every key, when the environment already holds one of the binding's names: a
|
|
106
|
+
* service that sets `S3_ENDPOINT` itself, or a second object-storage binding on the same service,
|
|
107
|
+
* would otherwise have one value silently replace the other. The inputs are not changed.
|
|
108
|
+
*/
|
|
109
|
+
export const mergeObjectStorageBindingEnvironment = (environmentArg, bindingEnvironmentArg) => {
|
|
110
|
+
const collisions = Object.keys(bindingEnvironmentArg)
|
|
111
|
+
.filter((keyArg) => Object.hasOwn(environmentArg, keyArg))
|
|
112
|
+
.sort();
|
|
113
|
+
if (collisions.length > 0) {
|
|
114
|
+
throw new Error(`objectstorage binding environment collides with ${collisions.join(', ')} already set on the `
|
|
115
|
+
+ 'workload');
|
|
116
|
+
}
|
|
117
|
+
return { ...environmentArg, ...bindingEnvironmentArg };
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0c3RvcmFnZWVudmlyb25tZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvcGxhdGZvcm0vb2JqZWN0c3RvcmFnZWVudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsb0NBQW9DLEVBQ3BDLHdDQUF3QyxFQUN4Qyx1Q0FBdUMsR0FDeEMsTUFBTSxvQkFBb0IsQ0FBQztBQU81QixPQUFPLEVBQ0wsdUNBQXVDLEVBQ3ZDLHFDQUFxQyxFQUNyQyx5Q0FBeUMsRUFDekMsb0NBQW9DLEdBQ3JDLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWpGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDL0QsR0FBRyxvQ0FBb0M7SUFDdkMsR0FBRyxxQ0FBcUM7Q0FDaEMsQ0FBQyxDQUFDO0FBY1o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUcsS0FBSyxFQUN4RCxVQUE0QixFQUM1QixXQUEyQyxFQUNBLEVBQUU7SUFDN0MsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0MsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssZUFBZSxFQUFFLENBQUM7UUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFDRCxNQUFNLFdBQVcsR0FBRyxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDOUUsSUFBSSx1Q0FBdUMsQ0FBQyxPQUFPLENBQUMsdUJB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
|