@serve.zone/interfaces 25.1.0 → 25.2.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 +19 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/secret.js +11 -4
- package/dist_ts/platform/index.d.ts +3 -1
- package/dist_ts/platform/index.js +4 -2
- package/dist_ts/platform/objectstorageretention.d.ts +63 -0
- package/dist_ts/platform/objectstorageretention.js +255 -0
- package/dist_ts/platform/types.d.ts +3 -0
- package/dist_ts/plugins.runtime.d.ts +2 -0
- package/dist_ts/plugins.runtime.js +4 -0
- package/dist_ts/requests/config.d.ts +3 -0
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.d.ts +394 -0
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.golden.d.ts +35 -0
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.golden.js +315 -0
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.js +1378 -0
- package/dist_ts/runtime.corestore.d.ts +204 -0
- package/dist_ts/runtime.corestore.js +620 -0
- package/dist_ts/runtime.d.ts +2 -0
- package/dist_ts/runtime.js +3 -1
- package/package.json +2 -2
- package/readme.md +37 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/secret.ts +12 -4
- package/ts/platform/index.ts +3 -0
- package/ts/platform/objectstorageretention.ts +372 -0
- package/ts/platform/types.ts +3 -0
- package/ts/plugins.runtime.ts +4 -0
- package/ts/requests/config.ts +3 -0
- package/ts/runtime.cloudlylegacydeploymentsettlement.golden.ts +421 -0
- package/ts/runtime.cloudlylegacydeploymentsettlement.ts +2884 -0
- package/ts/runtime.corestore.ts +909 -0
- package/ts/runtime.ts +2 -0
|
@@ -0,0 +1,1378 @@
|
|
|
1
|
+
import * as plugins from './plugins.runtime.js';
|
|
2
|
+
import { canonicalizeStrictJson, deepFreezeValue, } from './private/canonicaljson.js';
|
|
3
|
+
export const cloudlyLegacyDeploymentSettlementLimits = Object.freeze({
|
|
4
|
+
maximumIdentifierLength: 200,
|
|
5
|
+
maximumSourceDocuments: 2000,
|
|
6
|
+
maximumOperations: 500,
|
|
7
|
+
maximumPlanBytes: 512 * 1024,
|
|
8
|
+
maximumSafeResultBytes: 16 * 1024,
|
|
9
|
+
maximumReceiptBytes: 512 * 1024,
|
|
10
|
+
maximumAuthorityBytes: 16 * 1024,
|
|
11
|
+
maximumAuthenticatedArtifactBytes: 768 * 1024,
|
|
12
|
+
maximumAuthorityLifetimeMs: 24 * 60 * 60 * 1000,
|
|
13
|
+
maximumFailureReasons: 32,
|
|
14
|
+
});
|
|
15
|
+
export const cloudlyLegacyDeploymentSettlementDomains = Object.freeze({
|
|
16
|
+
authorityAad: 'serve.zone/cloudly-legacy-deployment-settlement/authority-aad-v1\0',
|
|
17
|
+
rehearsalBindingHmac: 'serve.zone/cloudly-legacy-deployment-settlement/rehearsal-binding-hmac-v1\0',
|
|
18
|
+
planHmac: 'serve.zone/cloudly-legacy-deployment-settlement/plan-hmac-v1\0',
|
|
19
|
+
productionRequestHmac: 'serve.zone/cloudly-legacy-deployment-settlement/production-request-hmac-v1\0',
|
|
20
|
+
checkResultHmac: 'serve.zone/cloudly-legacy-deployment-settlement/check-result-hmac-v1\0',
|
|
21
|
+
applyResultHmac: 'serve.zone/cloudly-legacy-deployment-settlement/apply-result-hmac-v1\0',
|
|
22
|
+
stableOutcomeHmac: 'serve.zone/cloudly-legacy-deployment-settlement/stable-outcome-hmac-v1\0',
|
|
23
|
+
scratchReceiptHmac: 'serve.zone/cloudly-legacy-deployment-settlement/scratch-receipt-hmac-v1\0',
|
|
24
|
+
productionReceiptHmac: 'serve.zone/cloudly-legacy-deployment-settlement/production-receipt-hmac-v1\0',
|
|
25
|
+
});
|
|
26
|
+
/** Safe error surface: code and schema path are finite and never contain values. */
|
|
27
|
+
export class CloudlyLegacyDeploymentSettlementCodecError extends Error {
|
|
28
|
+
code;
|
|
29
|
+
path;
|
|
30
|
+
constructor(codeArg, pathArg) {
|
|
31
|
+
super(`${codeArg}:${pathArg}`);
|
|
32
|
+
this.name = 'CloudlyLegacyDeploymentSettlementCodecError';
|
|
33
|
+
this.code = codeArg;
|
|
34
|
+
this.path = pathArg;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const authorityCoreKeys = ['operationId', 'authorityId', 'keyId', 'keyVersion'];
|
|
38
|
+
const authorityReferenceKeys = [...authorityCoreKeys, 'authorityMetadataSha256'];
|
|
39
|
+
const authorityMetadataKeys = [
|
|
40
|
+
'schemaVersion',
|
|
41
|
+
...authorityCoreKeys,
|
|
42
|
+
'settlementId',
|
|
43
|
+
'issuedAt',
|
|
44
|
+
'expiresAt',
|
|
45
|
+
'maintenanceImageDigest',
|
|
46
|
+
'sourceImageDigest',
|
|
47
|
+
'targetImageDigest',
|
|
48
|
+
'targetVersion',
|
|
49
|
+
'targetManifestSha256',
|
|
50
|
+
'targetConfigSha256',
|
|
51
|
+
'backupId',
|
|
52
|
+
'backupSnapshotIdSha256',
|
|
53
|
+
'backupProofSha256',
|
|
54
|
+
'runId',
|
|
55
|
+
'rehearsalId',
|
|
56
|
+
'scratchServiceId',
|
|
57
|
+
'allocationId',
|
|
58
|
+
'allocationGeneration',
|
|
59
|
+
'allocationBindingSha256',
|
|
60
|
+
'allocationReceiptSha256',
|
|
61
|
+
'sourceDataSha256',
|
|
62
|
+
'restoredDataSha256',
|
|
63
|
+
'digestProofSha256',
|
|
64
|
+
];
|
|
65
|
+
const classificationKeys = [
|
|
66
|
+
'image-recorded-not-current',
|
|
67
|
+
'image-recorded-current-failed',
|
|
68
|
+
'rolling-out-current-failed',
|
|
69
|
+
'rolling-out-superseded',
|
|
70
|
+
];
|
|
71
|
+
const censusKeys = [
|
|
72
|
+
'operations',
|
|
73
|
+
'services',
|
|
74
|
+
'images',
|
|
75
|
+
'releases',
|
|
76
|
+
'rolloutOperations',
|
|
77
|
+
'routeClaims',
|
|
78
|
+
'resourceClaims',
|
|
79
|
+
];
|
|
80
|
+
const mutationCountKeys = [
|
|
81
|
+
'operationCount',
|
|
82
|
+
'routeClaimsStabilized',
|
|
83
|
+
'routeClaimsRemoved',
|
|
84
|
+
'resourceClaimsRemoved',
|
|
85
|
+
];
|
|
86
|
+
const planEntryKeys = [
|
|
87
|
+
'operationId',
|
|
88
|
+
'serviceId',
|
|
89
|
+
'sourceRevision',
|
|
90
|
+
'sourceState',
|
|
91
|
+
'classification',
|
|
92
|
+
'finalRevision',
|
|
93
|
+
'sourceDocumentHmac',
|
|
94
|
+
'finalDocumentHmac',
|
|
95
|
+
'routeClaimsStabilized',
|
|
96
|
+
'routeClaimsRemoved',
|
|
97
|
+
'resourceClaimsRemoved',
|
|
98
|
+
];
|
|
99
|
+
const failureReasons = new Set([
|
|
100
|
+
'AUTHORITY_INVALID',
|
|
101
|
+
'AUTHORITY_EXPIRED',
|
|
102
|
+
'REQUEST_MISMATCH',
|
|
103
|
+
'PLAN_MISMATCH',
|
|
104
|
+
'SOURCE_STATE_MISMATCH',
|
|
105
|
+
'FINAL_STATE_MISMATCH',
|
|
106
|
+
'TRANSACTIONS_UNSUPPORTED',
|
|
107
|
+
'OPERATION_DRIFT',
|
|
108
|
+
'CLAIM_DRIFT',
|
|
109
|
+
'CLASSIFICATION_MISMATCH',
|
|
110
|
+
]);
|
|
111
|
+
const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9:._@-]{0,199}$/;
|
|
112
|
+
const sha256Pattern = /^[a-f0-9]{64}$/;
|
|
113
|
+
const ociDigestPattern = /^sha256:[a-f0-9]{64}$/;
|
|
114
|
+
const stateHmacPattern = /^hmac-sha256:[a-f0-9]{64}$/;
|
|
115
|
+
const macPattern = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
|
|
116
|
+
const raw32ByteBase64UrlPattern = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
|
|
117
|
+
const fail = (codeArg, pathArg) => {
|
|
118
|
+
throw new CloudlyLegacyDeploymentSettlementCodecError(codeArg, pathArg);
|
|
119
|
+
};
|
|
120
|
+
const readRecord = (valueArg, pathArg) => {
|
|
121
|
+
if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg)) {
|
|
122
|
+
return fail('INVALID_DATA', pathArg);
|
|
123
|
+
}
|
|
124
|
+
const prototype = Object.getPrototypeOf(valueArg);
|
|
125
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
126
|
+
return fail('INVALID_DATA', pathArg);
|
|
127
|
+
}
|
|
128
|
+
const record = valueArg;
|
|
129
|
+
for (const key of Reflect.ownKeys(record)) {
|
|
130
|
+
if (typeof key !== 'string')
|
|
131
|
+
return fail('INVALID_DATA', pathArg);
|
|
132
|
+
const descriptor = Object.getOwnPropertyDescriptor(record, key);
|
|
133
|
+
if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
|
|
134
|
+
return fail('INVALID_DATA', pathArg);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return record;
|
|
138
|
+
};
|
|
139
|
+
const readArray = (valueArg, pathArg, maximumLengthArg, minimumLengthArg = 0) => {
|
|
140
|
+
if (!Array.isArray(valueArg) || Object.getPrototypeOf(valueArg) !== Array.prototype) {
|
|
141
|
+
return fail('INVALID_DATA', pathArg);
|
|
142
|
+
}
|
|
143
|
+
if (valueArg.length < minimumLengthArg || valueArg.length > maximumLengthArg) {
|
|
144
|
+
return fail('LIMIT_EXCEEDED', pathArg);
|
|
145
|
+
}
|
|
146
|
+
for (let index = 0; index < valueArg.length; index++) {
|
|
147
|
+
if (!Object.hasOwn(valueArg, index))
|
|
148
|
+
return fail('INVALID_DATA', `${pathArg}[${index}]`);
|
|
149
|
+
const descriptor = Object.getOwnPropertyDescriptor(valueArg, String(index));
|
|
150
|
+
if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
|
|
151
|
+
return fail('INVALID_DATA', `${pathArg}[${index}]`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
for (const key of Reflect.ownKeys(valueArg)) {
|
|
155
|
+
if (key === 'length')
|
|
156
|
+
continue;
|
|
157
|
+
if (typeof key !== 'string'
|
|
158
|
+
|| !/^(?:0|[1-9][0-9]*)$/.test(key)
|
|
159
|
+
|| Number(key) >= valueArg.length) {
|
|
160
|
+
return fail('INVALID_DATA', pathArg);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return valueArg;
|
|
164
|
+
};
|
|
165
|
+
const assertExactKeys = (valueArg, keysArg, pathArg) => {
|
|
166
|
+
const actual = Object.keys(valueArg).sort((leftArg, rightArg) => (leftArg < rightArg ? -1 : leftArg > rightArg ? 1 : 0));
|
|
167
|
+
const expected = [...keysArg].sort((leftArg, rightArg) => (leftArg < rightArg ? -1 : leftArg > rightArg ? 1 : 0));
|
|
168
|
+
if (actual.length !== expected.length
|
|
169
|
+
|| actual.some((keyArg, indexArg) => keyArg !== expected[indexArg])) {
|
|
170
|
+
fail('INVALID_SCHEMA', pathArg);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
const readIdentifier = (valueArg, pathArg) => {
|
|
174
|
+
if (typeof valueArg !== 'string' || !identifierPattern.test(valueArg)) {
|
|
175
|
+
return fail('INVALID_VALUE', pathArg);
|
|
176
|
+
}
|
|
177
|
+
return valueArg;
|
|
178
|
+
};
|
|
179
|
+
const readSha256 = (valueArg, pathArg) => {
|
|
180
|
+
if (typeof valueArg !== 'string' || !sha256Pattern.test(valueArg)) {
|
|
181
|
+
return fail('INVALID_VALUE', pathArg);
|
|
182
|
+
}
|
|
183
|
+
return valueArg;
|
|
184
|
+
};
|
|
185
|
+
const readOciDigest = (valueArg, pathArg) => {
|
|
186
|
+
if (typeof valueArg !== 'string' || !ociDigestPattern.test(valueArg)) {
|
|
187
|
+
return fail('INVALID_VALUE', pathArg);
|
|
188
|
+
}
|
|
189
|
+
return valueArg;
|
|
190
|
+
};
|
|
191
|
+
const readStateHmac = (valueArg, pathArg) => {
|
|
192
|
+
if (typeof valueArg !== 'string' || !stateHmacPattern.test(valueArg)) {
|
|
193
|
+
return fail('INVALID_VALUE', pathArg);
|
|
194
|
+
}
|
|
195
|
+
return valueArg;
|
|
196
|
+
};
|
|
197
|
+
const readMac = (valueArg, pathArg) => {
|
|
198
|
+
if (typeof valueArg !== 'string' || !macPattern.test(valueArg)) {
|
|
199
|
+
return fail('INVALID_VALUE', pathArg);
|
|
200
|
+
}
|
|
201
|
+
const bytes = Buffer.from(valueArg, 'base64url');
|
|
202
|
+
if (bytes.byteLength !== 32 || bytes.toString('base64url') !== valueArg) {
|
|
203
|
+
return fail('INVALID_VALUE', pathArg);
|
|
204
|
+
}
|
|
205
|
+
return valueArg;
|
|
206
|
+
};
|
|
207
|
+
const readInteger = (valueArg, pathArg, minimumArg = 0, maximumArg = Number.MAX_SAFE_INTEGER) => {
|
|
208
|
+
if (typeof valueArg !== 'number'
|
|
209
|
+
|| !Number.isSafeInteger(valueArg)
|
|
210
|
+
|| Object.is(valueArg, -0)
|
|
211
|
+
|| valueArg < minimumArg
|
|
212
|
+
|| valueArg > maximumArg) {
|
|
213
|
+
return fail('INVALID_VALUE', pathArg);
|
|
214
|
+
}
|
|
215
|
+
return valueArg;
|
|
216
|
+
};
|
|
217
|
+
const readBoolean = (valueArg, pathArg) => {
|
|
218
|
+
if (typeof valueArg !== 'boolean')
|
|
219
|
+
return fail('INVALID_VALUE', pathArg);
|
|
220
|
+
return valueArg;
|
|
221
|
+
};
|
|
222
|
+
const readLiteral = (valueArg, literalsArg, pathArg) => {
|
|
223
|
+
if (typeof valueArg !== 'string' || !literalsArg.includes(valueArg)) {
|
|
224
|
+
return fail('INVALID_VALUE', pathArg);
|
|
225
|
+
}
|
|
226
|
+
return valueArg;
|
|
227
|
+
};
|
|
228
|
+
const canonicalize = (valueArg, pathArg) => (canonicalizeStrictJson(valueArg, () => fail('INVALID_DATA', pathArg), pathArg));
|
|
229
|
+
const finalize = (valueArg, maximumBytesArg, pathArg) => {
|
|
230
|
+
const json = canonicalize(valueArg, pathArg);
|
|
231
|
+
if (Buffer.byteLength(json, 'utf8') > maximumBytesArg) {
|
|
232
|
+
return fail('LIMIT_EXCEEDED', pathArg);
|
|
233
|
+
}
|
|
234
|
+
return deepFreezeValue(valueArg);
|
|
235
|
+
};
|
|
236
|
+
const encodeNormalized = (valueArg, pathArg) => (new Uint8Array(Buffer.from(canonicalize(valueArg, pathArg), 'utf8')));
|
|
237
|
+
const frame = (domainArg, payloadArg) => {
|
|
238
|
+
const domain = Buffer.from(domainArg, 'utf8');
|
|
239
|
+
const output = new Uint8Array(domain.byteLength + payloadArg.byteLength);
|
|
240
|
+
output.set(domain, 0);
|
|
241
|
+
output.set(new Uint8Array(payloadArg), domain.byteLength);
|
|
242
|
+
return output;
|
|
243
|
+
};
|
|
244
|
+
const digestBytes = (valueArg) => (plugins.crypto.createHash('sha256').update(new Uint8Array(valueArg)).digest('hex'));
|
|
245
|
+
const normalizeAuthorityReferenceInternal = (valueArg, pathArg) => {
|
|
246
|
+
const value = readRecord(valueArg, pathArg);
|
|
247
|
+
assertExactKeys(value, authorityReferenceKeys, pathArg);
|
|
248
|
+
if (value.keyVersion !== 1)
|
|
249
|
+
fail('INVALID_VALUE', `${pathArg}.keyVersion`);
|
|
250
|
+
return {
|
|
251
|
+
operationId: readIdentifier(value.operationId, `${pathArg}.operationId`),
|
|
252
|
+
authorityId: readIdentifier(value.authorityId, `${pathArg}.authorityId`),
|
|
253
|
+
keyId: readIdentifier(value.keyId, `${pathArg}.keyId`),
|
|
254
|
+
keyVersion: 1,
|
|
255
|
+
authorityMetadataSha256: readSha256(value.authorityMetadataSha256, `${pathArg}.authorityMetadataSha256`),
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthorityReference = (valueArg) => finalize(normalizeAuthorityReferenceInternal(valueArg, 'authorityReference'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityReference');
|
|
259
|
+
const normalizeAuthorityMetadataInternal = (valueArg, pathArg) => {
|
|
260
|
+
const value = readRecord(valueArg, pathArg);
|
|
261
|
+
assertExactKeys(value, authorityMetadataKeys, pathArg);
|
|
262
|
+
if (value.schemaVersion !== 1 || value.keyVersion !== 1) {
|
|
263
|
+
fail('INVALID_VALUE', `${pathArg}.schemaVersion`);
|
|
264
|
+
}
|
|
265
|
+
const issuedAt = readInteger(value.issuedAt, `${pathArg}.issuedAt`, 1);
|
|
266
|
+
const expiresAt = readInteger(value.expiresAt, `${pathArg}.expiresAt`, 1);
|
|
267
|
+
if (expiresAt <= issuedAt
|
|
268
|
+
|| expiresAt - issuedAt
|
|
269
|
+
> cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityLifetimeMs) {
|
|
270
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.expiresAt`);
|
|
271
|
+
}
|
|
272
|
+
const sourceDataSha256 = readSha256(value.sourceDataSha256, `${pathArg}.sourceDataSha256`);
|
|
273
|
+
const restoredDataSha256 = readSha256(value.restoredDataSha256, `${pathArg}.restoredDataSha256`);
|
|
274
|
+
if (sourceDataSha256 !== restoredDataSha256) {
|
|
275
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.restoredDataSha256`);
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
schemaVersion: 1,
|
|
279
|
+
operationId: readIdentifier(value.operationId, `${pathArg}.operationId`),
|
|
280
|
+
authorityId: readIdentifier(value.authorityId, `${pathArg}.authorityId`),
|
|
281
|
+
keyId: readIdentifier(value.keyId, `${pathArg}.keyId`),
|
|
282
|
+
keyVersion: 1,
|
|
283
|
+
settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
|
|
284
|
+
issuedAt,
|
|
285
|
+
expiresAt,
|
|
286
|
+
maintenanceImageDigest: readOciDigest(value.maintenanceImageDigest, `${pathArg}.maintenanceImageDigest`),
|
|
287
|
+
sourceImageDigest: readOciDigest(value.sourceImageDigest, `${pathArg}.sourceImageDigest`),
|
|
288
|
+
targetImageDigest: readOciDigest(value.targetImageDigest, `${pathArg}.targetImageDigest`),
|
|
289
|
+
targetVersion: readIdentifier(value.targetVersion, `${pathArg}.targetVersion`),
|
|
290
|
+
targetManifestSha256: readSha256(value.targetManifestSha256, `${pathArg}.targetManifestSha256`),
|
|
291
|
+
targetConfigSha256: readSha256(value.targetConfigSha256, `${pathArg}.targetConfigSha256`),
|
|
292
|
+
backupId: readIdentifier(value.backupId, `${pathArg}.backupId`),
|
|
293
|
+
backupSnapshotIdSha256: readSha256(value.backupSnapshotIdSha256, `${pathArg}.backupSnapshotIdSha256`),
|
|
294
|
+
backupProofSha256: readSha256(value.backupProofSha256, `${pathArg}.backupProofSha256`),
|
|
295
|
+
runId: readIdentifier(value.runId, `${pathArg}.runId`),
|
|
296
|
+
rehearsalId: readIdentifier(value.rehearsalId, `${pathArg}.rehearsalId`),
|
|
297
|
+
scratchServiceId: readIdentifier(value.scratchServiceId, `${pathArg}.scratchServiceId`),
|
|
298
|
+
allocationId: readIdentifier(value.allocationId, `${pathArg}.allocationId`),
|
|
299
|
+
allocationGeneration: readInteger(value.allocationGeneration, `${pathArg}.allocationGeneration`, 1),
|
|
300
|
+
allocationBindingSha256: readSha256(value.allocationBindingSha256, `${pathArg}.allocationBindingSha256`),
|
|
301
|
+
allocationReceiptSha256: readSha256(value.allocationReceiptSha256, `${pathArg}.allocationReceiptSha256`),
|
|
302
|
+
sourceDataSha256,
|
|
303
|
+
restoredDataSha256,
|
|
304
|
+
digestProofSha256: readSha256(value.digestProofSha256, `${pathArg}.digestProofSha256`),
|
|
305
|
+
};
|
|
306
|
+
};
|
|
307
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => finalize(normalizeAuthorityMetadataInternal(valueArg, 'authorityMetadata'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityMetadata');
|
|
308
|
+
export const encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg), 'authorityMetadata');
|
|
309
|
+
export const encodeCloudlyLegacyDeploymentSettlementAuthorityMetadataAad = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.authorityAad, encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg));
|
|
310
|
+
export const digestCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg));
|
|
311
|
+
export const createCloudlyLegacyDeploymentSettlementAuthorityReference = (metadataArg) => {
|
|
312
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
313
|
+
return finalize({
|
|
314
|
+
operationId: metadata.operationId,
|
|
315
|
+
authorityId: metadata.authorityId,
|
|
316
|
+
keyId: metadata.keyId,
|
|
317
|
+
keyVersion: metadata.keyVersion,
|
|
318
|
+
authorityMetadataSha256: digestCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadata),
|
|
319
|
+
}, cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityReference');
|
|
320
|
+
};
|
|
321
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata = (referenceArg, metadataArg) => {
|
|
322
|
+
const reference = normalizeCloudlyLegacyDeploymentSettlementAuthorityReference(referenceArg);
|
|
323
|
+
const expected = createCloudlyLegacyDeploymentSettlementAuthorityReference(metadataArg);
|
|
324
|
+
if (canonicalize(reference, 'authorityReference')
|
|
325
|
+
!== canonicalize(expected, 'authorityReference.expected')) {
|
|
326
|
+
fail('CROSS_FIELD_MISMATCH', 'authorityReference');
|
|
327
|
+
}
|
|
328
|
+
return reference;
|
|
329
|
+
};
|
|
330
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext = (valueArg) => {
|
|
331
|
+
const value = readRecord(valueArg, 'authorityHandoffPlaintext');
|
|
332
|
+
assertExactKeys(value, [
|
|
333
|
+
'schemaVersion',
|
|
334
|
+
'kind',
|
|
335
|
+
'authorityMetadata',
|
|
336
|
+
'authorityReference',
|
|
337
|
+
'hmacKeyPlaintext',
|
|
338
|
+
], 'authorityHandoffPlaintext');
|
|
339
|
+
if (value.schemaVersion !== 1
|
|
340
|
+
|| value.kind
|
|
341
|
+
!== 'cloudly-legacy-deployment-settlement-authority-handoff-plaintext') {
|
|
342
|
+
fail('INVALID_VALUE', 'authorityHandoffPlaintext.kind');
|
|
343
|
+
}
|
|
344
|
+
const authorityMetadata = normalizeAuthorityMetadataInternal(value.authorityMetadata, 'authorityHandoffPlaintext.authorityMetadata');
|
|
345
|
+
const authorityReference = normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata(value.authorityReference, authorityMetadata);
|
|
346
|
+
const key = readRecord(value.hmacKeyPlaintext, 'authorityHandoffPlaintext.hmacKeyPlaintext');
|
|
347
|
+
assertExactKeys(key, ['format', 'value'], 'authorityHandoffPlaintext.hmacKeyPlaintext');
|
|
348
|
+
const keyValue = typeof key.value === 'string'
|
|
349
|
+
? key.value
|
|
350
|
+
: fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext.value');
|
|
351
|
+
if (key.format !== 'raw-32-byte-base64url'
|
|
352
|
+
|| !raw32ByteBase64UrlPattern.test(keyValue)) {
|
|
353
|
+
fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext');
|
|
354
|
+
}
|
|
355
|
+
const keyBytes = Buffer.from(keyValue, 'base64url');
|
|
356
|
+
if (keyBytes.byteLength !== 32 || keyBytes.toString('base64url') !== keyValue) {
|
|
357
|
+
fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext.value');
|
|
358
|
+
}
|
|
359
|
+
return finalize({
|
|
360
|
+
schemaVersion: 1,
|
|
361
|
+
kind: 'cloudly-legacy-deployment-settlement-authority-handoff-plaintext',
|
|
362
|
+
authorityMetadata,
|
|
363
|
+
authorityReference,
|
|
364
|
+
hmacKeyPlaintext: { format: 'raw-32-byte-base64url', value: keyValue },
|
|
365
|
+
}, cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityHandoffPlaintext');
|
|
366
|
+
};
|
|
367
|
+
export const encodeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(valueArg), 'authorityHandoffPlaintext');
|
|
368
|
+
const normalizeClassificationCounts = (valueArg, pathArg) => {
|
|
369
|
+
const value = readRecord(valueArg, pathArg);
|
|
370
|
+
assertExactKeys(value, classificationKeys, pathArg);
|
|
371
|
+
return {
|
|
372
|
+
'image-recorded-not-current': readInteger(value['image-recorded-not-current'], `${pathArg}.image-recorded-not-current`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
373
|
+
'image-recorded-current-failed': readInteger(value['image-recorded-current-failed'], `${pathArg}.image-recorded-current-failed`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
374
|
+
'rolling-out-current-failed': readInteger(value['rolling-out-current-failed'], `${pathArg}.rolling-out-current-failed`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
375
|
+
'rolling-out-superseded': readInteger(value['rolling-out-superseded'], `${pathArg}.rolling-out-superseded`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
376
|
+
};
|
|
377
|
+
};
|
|
378
|
+
const sumClassificationCounts = (valueArg) => classificationKeys.reduce((sumArg, keyArg) => sumArg + valueArg[keyArg], 0);
|
|
379
|
+
const normalizeSourceCensus = (valueArg, pathArg) => {
|
|
380
|
+
const value = readRecord(valueArg, pathArg);
|
|
381
|
+
assertExactKeys(value, censusKeys, pathArg);
|
|
382
|
+
const output = Object.fromEntries(censusKeys.map((keyArg) => [
|
|
383
|
+
keyArg,
|
|
384
|
+
readInteger(value[keyArg], `${pathArg}.${keyArg}`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumSourceDocuments),
|
|
385
|
+
]));
|
|
386
|
+
if (censusKeys.reduce((sumArg, keyArg) => sumArg + output[keyArg], 0)
|
|
387
|
+
> cloudlyLegacyDeploymentSettlementLimits.maximumSourceDocuments) {
|
|
388
|
+
fail('LIMIT_EXCEEDED', pathArg);
|
|
389
|
+
}
|
|
390
|
+
return output;
|
|
391
|
+
};
|
|
392
|
+
const normalizeMutationCounts = (valueArg, pathArg) => {
|
|
393
|
+
const value = readRecord(valueArg, pathArg);
|
|
394
|
+
assertExactKeys(value, mutationCountKeys, pathArg);
|
|
395
|
+
return {
|
|
396
|
+
operationCount: readInteger(value.operationCount, `${pathArg}.operationCount`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
|
|
397
|
+
routeClaimsStabilized: readInteger(value.routeClaimsStabilized, `${pathArg}.routeClaimsStabilized`),
|
|
398
|
+
routeClaimsRemoved: readInteger(value.routeClaimsRemoved, `${pathArg}.routeClaimsRemoved`),
|
|
399
|
+
resourceClaimsRemoved: readInteger(value.resourceClaimsRemoved, `${pathArg}.resourceClaimsRemoved`),
|
|
400
|
+
};
|
|
401
|
+
};
|
|
402
|
+
const assertCountsMatchClassifications = (countsArg, classificationsArg, pathArg) => {
|
|
403
|
+
if (countsArg.operationCount !== sumClassificationCounts(classificationsArg)) {
|
|
404
|
+
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
const normalizePlanEntry = (valueArg, pathArg) => {
|
|
408
|
+
const value = readRecord(valueArg, pathArg);
|
|
409
|
+
assertExactKeys(value, planEntryKeys, pathArg);
|
|
410
|
+
const sourceRevision = readInteger(value.sourceRevision, `${pathArg}.sourceRevision`, 0);
|
|
411
|
+
const finalRevision = readInteger(value.finalRevision, `${pathArg}.finalRevision`, 0);
|
|
412
|
+
if (finalRevision !== sourceRevision + 3 || !Number.isSafeInteger(sourceRevision + 3)) {
|
|
413
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.finalRevision`);
|
|
414
|
+
}
|
|
415
|
+
const sourceState = readLiteral(value.sourceState, ['image-recorded', 'rolling-out'], `${pathArg}.sourceState`);
|
|
416
|
+
const classification = readLiteral(value.classification, classificationKeys, `${pathArg}.classification`);
|
|
417
|
+
if ((classification.startsWith('image-recorded-') && sourceState !== 'image-recorded')
|
|
418
|
+
|| (classification.startsWith('rolling-out-') && sourceState !== 'rolling-out')) {
|
|
419
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.classification`);
|
|
420
|
+
}
|
|
421
|
+
return {
|
|
422
|
+
operationId: readIdentifier(value.operationId, `${pathArg}.operationId`),
|
|
423
|
+
serviceId: readIdentifier(value.serviceId, `${pathArg}.serviceId`),
|
|
424
|
+
sourceRevision,
|
|
425
|
+
sourceState,
|
|
426
|
+
classification,
|
|
427
|
+
finalRevision,
|
|
428
|
+
sourceDocumentHmac: readStateHmac(value.sourceDocumentHmac, `${pathArg}.sourceDocumentHmac`),
|
|
429
|
+
finalDocumentHmac: readStateHmac(value.finalDocumentHmac, `${pathArg}.finalDocumentHmac`),
|
|
430
|
+
routeClaimsStabilized: readInteger(value.routeClaimsStabilized, `${pathArg}.routeClaimsStabilized`),
|
|
431
|
+
routeClaimsRemoved: readInteger(value.routeClaimsRemoved, `${pathArg}.routeClaimsRemoved`),
|
|
432
|
+
resourceClaimsRemoved: readInteger(value.resourceClaimsRemoved, `${pathArg}.resourceClaimsRemoved`),
|
|
433
|
+
};
|
|
434
|
+
};
|
|
435
|
+
export const normalizeCloudlyLegacyDeploymentSettlementPlan = (valueArg) => {
|
|
436
|
+
const value = readRecord(valueArg, 'plan');
|
|
437
|
+
assertExactKeys(value, [
|
|
438
|
+
'schemaVersion',
|
|
439
|
+
'kind',
|
|
440
|
+
'authority',
|
|
441
|
+
'settlementId',
|
|
442
|
+
'effectiveAt',
|
|
443
|
+
'sourceStateHmac',
|
|
444
|
+
'finalStateHmac',
|
|
445
|
+
'sourceCensus',
|
|
446
|
+
'entries',
|
|
447
|
+
'classificationCounts',
|
|
448
|
+
'operationCount',
|
|
449
|
+
], 'plan');
|
|
450
|
+
if (value.schemaVersion !== 1
|
|
451
|
+
|| value.kind !== 'cloudly-legacy-deployment-settlement-plan') {
|
|
452
|
+
fail('INVALID_VALUE', 'plan.kind');
|
|
453
|
+
}
|
|
454
|
+
const entries = readArray(value.entries, 'plan.entries', cloudlyLegacyDeploymentSettlementLimits.maximumOperations).map((entryArg, indexArg) => normalizePlanEntry(entryArg, `plan.entries[${indexArg}]`));
|
|
455
|
+
for (let index = 1; index < entries.length; index++) {
|
|
456
|
+
if (entries[index - 1].operationId >= entries[index].operationId) {
|
|
457
|
+
fail('ORDERING_REQUIRED', `plan.entries[${index}].operationId`);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
const classificationCounts = normalizeClassificationCounts(value.classificationCounts, 'plan.classificationCounts');
|
|
461
|
+
const operationCount = readInteger(value.operationCount, 'plan.operationCount', 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations);
|
|
462
|
+
if (operationCount !== entries.length
|
|
463
|
+
|| operationCount !== sumClassificationCounts(classificationCounts)) {
|
|
464
|
+
fail('CROSS_FIELD_MISMATCH', 'plan.operationCount');
|
|
465
|
+
}
|
|
466
|
+
const actualCounts = Object.fromEntries(classificationKeys.map((keyArg) => [
|
|
467
|
+
keyArg,
|
|
468
|
+
entries.filter((entryArg) => entryArg.classification === keyArg).length,
|
|
469
|
+
]));
|
|
470
|
+
if (classificationKeys.some((keyArg) => actualCounts[keyArg] !== classificationCounts[keyArg])) {
|
|
471
|
+
fail('CROSS_FIELD_MISMATCH', 'plan.classificationCounts');
|
|
472
|
+
}
|
|
473
|
+
return finalize({
|
|
474
|
+
schemaVersion: 1,
|
|
475
|
+
kind: 'cloudly-legacy-deployment-settlement-plan',
|
|
476
|
+
authority: normalizeAuthorityReferenceInternal(value.authority, 'plan.authority'),
|
|
477
|
+
settlementId: readIdentifier(value.settlementId, 'plan.settlementId'),
|
|
478
|
+
effectiveAt: readInteger(value.effectiveAt, 'plan.effectiveAt', 1),
|
|
479
|
+
sourceStateHmac: readStateHmac(value.sourceStateHmac, 'plan.sourceStateHmac'),
|
|
480
|
+
finalStateHmac: readStateHmac(value.finalStateHmac, 'plan.finalStateHmac'),
|
|
481
|
+
sourceCensus: normalizeSourceCensus(value.sourceCensus, 'plan.sourceCensus'),
|
|
482
|
+
entries,
|
|
483
|
+
classificationCounts,
|
|
484
|
+
operationCount,
|
|
485
|
+
}, cloudlyLegacyDeploymentSettlementLimits.maximumPlanBytes, 'plan');
|
|
486
|
+
};
|
|
487
|
+
export const encodeCloudlyLegacyDeploymentSettlementPlan = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementPlan(valueArg), 'plan');
|
|
488
|
+
export const encodeCloudlyLegacyDeploymentSettlementPlanHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.planHmac, encodeNormalized(normalizeUnsignedAuthenticatedPlanInternal(valueArg, 'unsignedAuthenticatedPlan'), 'unsignedAuthenticatedPlan'));
|
|
489
|
+
export const digestCloudlyLegacyDeploymentSettlementPlan = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementPlan(valueArg));
|
|
490
|
+
const normalizeFailureReasons = (valueArg, pathArg) => {
|
|
491
|
+
const values = readArray(valueArg, pathArg, cloudlyLegacyDeploymentSettlementLimits.maximumFailureReasons, 1);
|
|
492
|
+
const output = values.map((entryArg, indexArg) => {
|
|
493
|
+
if (typeof entryArg !== 'string'
|
|
494
|
+
|| !failureReasons.has(entryArg)) {
|
|
495
|
+
return fail('INVALID_VALUE', `${pathArg}[${indexArg}]`);
|
|
496
|
+
}
|
|
497
|
+
return entryArg;
|
|
498
|
+
});
|
|
499
|
+
for (let index = 1; index < output.length; index++) {
|
|
500
|
+
if (output[index - 1] >= output[index]) {
|
|
501
|
+
fail('ORDERING_REQUIRED', `${pathArg}[${index}]`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return output;
|
|
505
|
+
};
|
|
506
|
+
const normalizeSafeResultBase = (valueArg, pathArg) => {
|
|
507
|
+
const counts = normalizeMutationCounts(valueArg.counts, `${pathArg}.counts`);
|
|
508
|
+
const classificationCounts = normalizeClassificationCounts(valueArg.classificationCounts, `${pathArg}.classificationCounts`);
|
|
509
|
+
assertCountsMatchClassifications(counts, classificationCounts, `${pathArg}.counts.operationCount`);
|
|
510
|
+
return {
|
|
511
|
+
requestSha256: readSha256(valueArg.requestSha256, `${pathArg}.requestSha256`),
|
|
512
|
+
planSha256: readSha256(valueArg.planSha256, `${pathArg}.planSha256`),
|
|
513
|
+
settlementId: readIdentifier(valueArg.settlementId, `${pathArg}.settlementId`),
|
|
514
|
+
sourceStateHmac: readStateHmac(valueArg.sourceStateHmac, `${pathArg}.sourceStateHmac`),
|
|
515
|
+
finalStateHmac: readStateHmac(valueArg.finalStateHmac, `${pathArg}.finalStateHmac`),
|
|
516
|
+
transactionSupported: readBoolean(valueArg.transactionSupported, `${pathArg}.transactionSupported`),
|
|
517
|
+
counts,
|
|
518
|
+
classificationCounts,
|
|
519
|
+
};
|
|
520
|
+
};
|
|
521
|
+
export const normalizeCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => {
|
|
522
|
+
const value = readRecord(valueArg, 'checkResult');
|
|
523
|
+
const status = readLiteral(value.status, ['ready', 'blocked'], 'checkResult.status');
|
|
524
|
+
assertExactKeys(value, [
|
|
525
|
+
'schemaVersion',
|
|
526
|
+
'kind',
|
|
527
|
+
'status',
|
|
528
|
+
'requestSha256',
|
|
529
|
+
'planSha256',
|
|
530
|
+
'settlementId',
|
|
531
|
+
'sourceStateHmac',
|
|
532
|
+
'finalStateHmac',
|
|
533
|
+
'transactionSupported',
|
|
534
|
+
'disposition',
|
|
535
|
+
'counts',
|
|
536
|
+
'classificationCounts',
|
|
537
|
+
...(status === 'blocked' ? ['failureReasons'] : []),
|
|
538
|
+
'checkedAt',
|
|
539
|
+
], 'checkResult');
|
|
540
|
+
if (value.schemaVersion !== 1
|
|
541
|
+
|| value.kind !== 'cloudly-legacy-deployment-settlement-check-result') {
|
|
542
|
+
fail('INVALID_VALUE', 'checkResult.kind');
|
|
543
|
+
}
|
|
544
|
+
const base = normalizeSafeResultBase(value, 'checkResult');
|
|
545
|
+
const result = status === 'ready'
|
|
546
|
+
? {
|
|
547
|
+
schemaVersion: 1,
|
|
548
|
+
kind: 'cloudly-legacy-deployment-settlement-check-result',
|
|
549
|
+
status,
|
|
550
|
+
...base,
|
|
551
|
+
disposition: readLiteral(value.disposition, ['unapplied', 'exact-replay', 'no-op'], 'checkResult.disposition'),
|
|
552
|
+
checkedAt: readInteger(value.checkedAt, 'checkResult.checkedAt', 1),
|
|
553
|
+
}
|
|
554
|
+
: {
|
|
555
|
+
schemaVersion: 1,
|
|
556
|
+
kind: 'cloudly-legacy-deployment-settlement-check-result',
|
|
557
|
+
status,
|
|
558
|
+
...base,
|
|
559
|
+
disposition: readLiteral(value.disposition, ['unapplied'], 'checkResult.disposition'),
|
|
560
|
+
failureReasons: normalizeFailureReasons(value.failureReasons, 'checkResult.failureReasons'),
|
|
561
|
+
checkedAt: readInteger(value.checkedAt, 'checkResult.checkedAt', 1),
|
|
562
|
+
};
|
|
563
|
+
const transactionFailurePresent = result.status === 'blocked'
|
|
564
|
+
&& result.failureReasons.includes('TRANSACTIONS_UNSUPPORTED');
|
|
565
|
+
if ((result.status === 'ready' && !result.transactionSupported)
|
|
566
|
+
|| (result.status === 'blocked'
|
|
567
|
+
&& transactionFailurePresent === result.transactionSupported)) {
|
|
568
|
+
fail('CROSS_FIELD_MISMATCH', 'checkResult.transactionSupported');
|
|
569
|
+
}
|
|
570
|
+
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumSafeResultBytes, 'checkResult');
|
|
571
|
+
};
|
|
572
|
+
export const encodeCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementCheckResult(valueArg), 'checkResult');
|
|
573
|
+
export const encodeCloudlyLegacyDeploymentSettlementCheckResultHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.checkResultHmac, encodeNormalized(normalizeUnsignedAuthenticatedCheckResultInternal(valueArg, 'unsignedAuthenticatedCheckResult'), 'unsignedAuthenticatedCheckResult'));
|
|
574
|
+
export const digestCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementCheckResult(valueArg));
|
|
575
|
+
export const normalizeCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => {
|
|
576
|
+
const value = readRecord(valueArg, 'applyResult');
|
|
577
|
+
const status = readLiteral(value.status, ['completed', 'rejected'], 'applyResult.status');
|
|
578
|
+
assertExactKeys(value, [
|
|
579
|
+
'schemaVersion',
|
|
580
|
+
'kind',
|
|
581
|
+
'status',
|
|
582
|
+
'requestSha256',
|
|
583
|
+
'planSha256',
|
|
584
|
+
'settlementId',
|
|
585
|
+
'sourceStateHmac',
|
|
586
|
+
'finalStateHmac',
|
|
587
|
+
'transactionSupported',
|
|
588
|
+
'disposition',
|
|
589
|
+
'counts',
|
|
590
|
+
'classificationCounts',
|
|
591
|
+
...(status === 'rejected' ? ['failureReasons', 'rejectedAt'] : ['completedAt']),
|
|
592
|
+
], 'applyResult');
|
|
593
|
+
if (value.schemaVersion !== 1
|
|
594
|
+
|| value.kind !== 'cloudly-legacy-deployment-settlement-apply-result') {
|
|
595
|
+
fail('INVALID_VALUE', 'applyResult.kind');
|
|
596
|
+
}
|
|
597
|
+
const base = normalizeSafeResultBase(value, 'applyResult');
|
|
598
|
+
const result = status === 'completed'
|
|
599
|
+
? {
|
|
600
|
+
schemaVersion: 1,
|
|
601
|
+
kind: 'cloudly-legacy-deployment-settlement-apply-result',
|
|
602
|
+
status,
|
|
603
|
+
...base,
|
|
604
|
+
disposition: readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], 'applyResult.disposition'),
|
|
605
|
+
completedAt: readInteger(value.completedAt, 'applyResult.completedAt', 1),
|
|
606
|
+
}
|
|
607
|
+
: {
|
|
608
|
+
schemaVersion: 1,
|
|
609
|
+
kind: 'cloudly-legacy-deployment-settlement-apply-result',
|
|
610
|
+
status,
|
|
611
|
+
...base,
|
|
612
|
+
disposition: readLiteral(value.disposition, ['unapplied'], 'applyResult.disposition'),
|
|
613
|
+
failureReasons: normalizeFailureReasons(value.failureReasons, 'applyResult.failureReasons'),
|
|
614
|
+
rejectedAt: readInteger(value.rejectedAt, 'applyResult.rejectedAt', 1),
|
|
615
|
+
};
|
|
616
|
+
const transactionFailurePresent = result.status === 'rejected'
|
|
617
|
+
&& result.failureReasons.includes('TRANSACTIONS_UNSUPPORTED');
|
|
618
|
+
if ((result.status === 'completed' && !result.transactionSupported)
|
|
619
|
+
|| (result.status === 'rejected'
|
|
620
|
+
&& transactionFailurePresent === result.transactionSupported)) {
|
|
621
|
+
fail('CROSS_FIELD_MISMATCH', 'applyResult.transactionSupported');
|
|
622
|
+
}
|
|
623
|
+
return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumSafeResultBytes, 'applyResult');
|
|
624
|
+
};
|
|
625
|
+
export const encodeCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementApplyResult(valueArg), 'applyResult');
|
|
626
|
+
export const encodeCloudlyLegacyDeploymentSettlementApplyResultHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.applyResultHmac, encodeNormalized(normalizeUnsignedAuthenticatedApplyResultInternal(valueArg, 'unsignedAuthenticatedApplyResult'), 'unsignedAuthenticatedApplyResult'));
|
|
627
|
+
export const digestCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementApplyResult(valueArg));
|
|
628
|
+
const rehearsalBindingKeys = [
|
|
629
|
+
'schemaVersion',
|
|
630
|
+
'kind',
|
|
631
|
+
'settlementId',
|
|
632
|
+
'runId',
|
|
633
|
+
'rehearsalId',
|
|
634
|
+
'scratchServiceId',
|
|
635
|
+
'allocationId',
|
|
636
|
+
'allocationGeneration',
|
|
637
|
+
'allocationBindingSha256',
|
|
638
|
+
'allocationReceiptSha256',
|
|
639
|
+
'backupId',
|
|
640
|
+
'backupSnapshotIdSha256',
|
|
641
|
+
'backupProofSha256',
|
|
642
|
+
'sourceDataSha256',
|
|
643
|
+
'restoredDataSha256',
|
|
644
|
+
'digestProofSha256',
|
|
645
|
+
'targetImageDigest',
|
|
646
|
+
'targetVersion',
|
|
647
|
+
'targetManifestSha256',
|
|
648
|
+
'targetConfigSha256',
|
|
649
|
+
];
|
|
650
|
+
const normalizeRehearsalBindingInternal = (valueArg, pathArg) => {
|
|
651
|
+
const value = readRecord(valueArg, pathArg);
|
|
652
|
+
assertExactKeys(value, rehearsalBindingKeys, pathArg);
|
|
653
|
+
if (value.schemaVersion !== 1
|
|
654
|
+
|| value.kind !== 'cloudly-legacy-deployment-settlement-rehearsal-binding') {
|
|
655
|
+
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
656
|
+
}
|
|
657
|
+
const sourceDataSha256 = readSha256(value.sourceDataSha256, `${pathArg}.sourceDataSha256`);
|
|
658
|
+
const restoredDataSha256 = readSha256(value.restoredDataSha256, `${pathArg}.restoredDataSha256`);
|
|
659
|
+
if (sourceDataSha256 !== restoredDataSha256) {
|
|
660
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.restoredDataSha256`);
|
|
661
|
+
}
|
|
662
|
+
return {
|
|
663
|
+
schemaVersion: 1,
|
|
664
|
+
kind: 'cloudly-legacy-deployment-settlement-rehearsal-binding',
|
|
665
|
+
settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
|
|
666
|
+
runId: readIdentifier(value.runId, `${pathArg}.runId`),
|
|
667
|
+
rehearsalId: readIdentifier(value.rehearsalId, `${pathArg}.rehearsalId`),
|
|
668
|
+
scratchServiceId: readIdentifier(value.scratchServiceId, `${pathArg}.scratchServiceId`),
|
|
669
|
+
allocationId: readIdentifier(value.allocationId, `${pathArg}.allocationId`),
|
|
670
|
+
allocationGeneration: readInteger(value.allocationGeneration, `${pathArg}.allocationGeneration`, 1),
|
|
671
|
+
allocationBindingSha256: readSha256(value.allocationBindingSha256, `${pathArg}.allocationBindingSha256`),
|
|
672
|
+
allocationReceiptSha256: readSha256(value.allocationReceiptSha256, `${pathArg}.allocationReceiptSha256`),
|
|
673
|
+
backupId: readIdentifier(value.backupId, `${pathArg}.backupId`),
|
|
674
|
+
backupSnapshotIdSha256: readSha256(value.backupSnapshotIdSha256, `${pathArg}.backupSnapshotIdSha256`),
|
|
675
|
+
backupProofSha256: readSha256(value.backupProofSha256, `${pathArg}.backupProofSha256`),
|
|
676
|
+
sourceDataSha256,
|
|
677
|
+
restoredDataSha256,
|
|
678
|
+
digestProofSha256: readSha256(value.digestProofSha256, `${pathArg}.digestProofSha256`),
|
|
679
|
+
targetImageDigest: readOciDigest(value.targetImageDigest, `${pathArg}.targetImageDigest`),
|
|
680
|
+
targetVersion: readIdentifier(value.targetVersion, `${pathArg}.targetVersion`),
|
|
681
|
+
targetManifestSha256: readSha256(value.targetManifestSha256, `${pathArg}.targetManifestSha256`),
|
|
682
|
+
targetConfigSha256: readSha256(value.targetConfigSha256, `${pathArg}.targetConfigSha256`),
|
|
683
|
+
};
|
|
684
|
+
};
|
|
685
|
+
export const normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => finalize(normalizeRehearsalBindingInternal(valueArg, 'rehearsalBinding'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'rehearsalBinding');
|
|
686
|
+
export const encodeCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg), 'rehearsalBinding');
|
|
687
|
+
export const encodeCloudlyLegacyDeploymentSettlementRehearsalBindingHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.rehearsalBindingHmac, encodeNormalized(normalizeUnsignedAuthenticatedRehearsalBindingInternal(valueArg, 'unsignedAuthenticatedRehearsalBinding'), 'unsignedAuthenticatedRehearsalBinding'));
|
|
688
|
+
export const digestCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg));
|
|
689
|
+
export const normalizeCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => {
|
|
690
|
+
const value = readRecord(valueArg, 'productionRequest');
|
|
691
|
+
assertExactKeys(value, [
|
|
692
|
+
'schemaVersion',
|
|
693
|
+
'kind',
|
|
694
|
+
'authority',
|
|
695
|
+
'plan',
|
|
696
|
+
'planSha256',
|
|
697
|
+
'rehearsalBinding',
|
|
698
|
+
'rehearsalBindingSha256',
|
|
699
|
+
'requestedAt',
|
|
700
|
+
], 'productionRequest');
|
|
701
|
+
if (value.schemaVersion !== 1
|
|
702
|
+
|| value.kind !== 'cloudly-legacy-deployment-settlement-production-request') {
|
|
703
|
+
fail('INVALID_VALUE', 'productionRequest.kind');
|
|
704
|
+
}
|
|
705
|
+
const authority = normalizeAuthorityReferenceInternal(value.authority, 'productionRequest.authority');
|
|
706
|
+
const plan = normalizeCloudlyLegacyDeploymentSettlementPlan(value.plan);
|
|
707
|
+
const planSha256 = readSha256(value.planSha256, 'productionRequest.planSha256');
|
|
708
|
+
const rehearsalBinding = normalizeRehearsalBindingInternal(value.rehearsalBinding, 'productionRequest.rehearsalBinding');
|
|
709
|
+
const rehearsalBindingSha256 = readSha256(value.rehearsalBindingSha256, 'productionRequest.rehearsalBindingSha256');
|
|
710
|
+
if (canonicalize(authority, 'productionRequest.authority')
|
|
711
|
+
!== canonicalize(plan.authority, 'productionRequest.plan.authority')) {
|
|
712
|
+
fail('CROSS_FIELD_MISMATCH', 'productionRequest.authority');
|
|
713
|
+
}
|
|
714
|
+
if (planSha256 !== digestCloudlyLegacyDeploymentSettlementPlan(plan)) {
|
|
715
|
+
fail('CROSS_FIELD_MISMATCH', 'productionRequest.planSha256');
|
|
716
|
+
}
|
|
717
|
+
if (rehearsalBindingSha256
|
|
718
|
+
!== digestCloudlyLegacyDeploymentSettlementRehearsalBinding(rehearsalBinding)) {
|
|
719
|
+
fail('CROSS_FIELD_MISMATCH', 'productionRequest.rehearsalBindingSha256');
|
|
720
|
+
}
|
|
721
|
+
if (plan.settlementId !== rehearsalBinding.settlementId) {
|
|
722
|
+
fail('CROSS_FIELD_MISMATCH', 'productionRequest.rehearsalBinding.settlementId');
|
|
723
|
+
}
|
|
724
|
+
const requestedAt = readInteger(value.requestedAt, 'productionRequest.requestedAt', 1);
|
|
725
|
+
if (requestedAt < plan.effectiveAt) {
|
|
726
|
+
fail('CROSS_FIELD_MISMATCH', 'productionRequest.requestedAt');
|
|
727
|
+
}
|
|
728
|
+
return finalize({
|
|
729
|
+
schemaVersion: 1,
|
|
730
|
+
kind: 'cloudly-legacy-deployment-settlement-production-request',
|
|
731
|
+
authority,
|
|
732
|
+
plan,
|
|
733
|
+
planSha256,
|
|
734
|
+
rehearsalBinding,
|
|
735
|
+
rehearsalBindingSha256,
|
|
736
|
+
requestedAt,
|
|
737
|
+
}, cloudlyLegacyDeploymentSettlementLimits.maximumAuthenticatedArtifactBytes, 'productionRequest');
|
|
738
|
+
};
|
|
739
|
+
export const encodeCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionRequest(valueArg), 'productionRequest');
|
|
740
|
+
export const digestCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementProductionRequest(valueArg));
|
|
741
|
+
const stableOutcomeKeys = [
|
|
742
|
+
'schemaVersion',
|
|
743
|
+
'kind',
|
|
744
|
+
'settlementId',
|
|
745
|
+
'runId',
|
|
746
|
+
'rehearsalBindingSha256',
|
|
747
|
+
'effectiveAt',
|
|
748
|
+
'planSha256',
|
|
749
|
+
'sourceStateHmac',
|
|
750
|
+
'finalStateHmac',
|
|
751
|
+
'settlements',
|
|
752
|
+
'counts',
|
|
753
|
+
'classificationCounts',
|
|
754
|
+
];
|
|
755
|
+
const normalizeStableOutcomeInternal = (valueArg, pathArg) => {
|
|
756
|
+
const value = readRecord(valueArg, pathArg);
|
|
757
|
+
assertExactKeys(value, stableOutcomeKeys, pathArg);
|
|
758
|
+
if (value.schemaVersion !== 1
|
|
759
|
+
|| value.kind !== 'cloudly-legacy-deployment-settlement-stable-outcome') {
|
|
760
|
+
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
761
|
+
}
|
|
762
|
+
const counts = normalizeMutationCounts(value.counts, `${pathArg}.counts`);
|
|
763
|
+
const classificationCounts = normalizeClassificationCounts(value.classificationCounts, `${pathArg}.classificationCounts`);
|
|
764
|
+
assertCountsMatchClassifications(counts, classificationCounts, `${pathArg}.counts.operationCount`);
|
|
765
|
+
const settlements = readArray(value.settlements, `${pathArg}.settlements`, cloudlyLegacyDeploymentSettlementLimits.maximumOperations).map((entryArg, indexArg) => {
|
|
766
|
+
const entryPath = `${pathArg}.settlements[${indexArg}]`;
|
|
767
|
+
const entry = readRecord(entryArg, entryPath);
|
|
768
|
+
assertExactKeys(entry, ['operationId', 'finalRevision', 'finalDocumentHmac'], entryPath);
|
|
769
|
+
return {
|
|
770
|
+
operationId: readIdentifier(entry.operationId, `${entryPath}.operationId`),
|
|
771
|
+
finalRevision: readInteger(entry.finalRevision, `${entryPath}.finalRevision`, 1),
|
|
772
|
+
finalDocumentHmac: readStateHmac(entry.finalDocumentHmac, `${entryPath}.finalDocumentHmac`),
|
|
773
|
+
};
|
|
774
|
+
});
|
|
775
|
+
for (let index = 1; index < settlements.length; index++) {
|
|
776
|
+
if (settlements[index - 1].operationId >= settlements[index].operationId) {
|
|
777
|
+
fail('ORDERING_REQUIRED', `${pathArg}.settlements[${index}].operationId`);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
if (settlements.length !== counts.operationCount) {
|
|
781
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.settlements`);
|
|
782
|
+
}
|
|
783
|
+
return {
|
|
784
|
+
schemaVersion: 1,
|
|
785
|
+
kind: 'cloudly-legacy-deployment-settlement-stable-outcome',
|
|
786
|
+
settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
|
|
787
|
+
runId: readIdentifier(value.runId, `${pathArg}.runId`),
|
|
788
|
+
rehearsalBindingSha256: readSha256(value.rehearsalBindingSha256, `${pathArg}.rehearsalBindingSha256`),
|
|
789
|
+
effectiveAt: readInteger(value.effectiveAt, `${pathArg}.effectiveAt`, 1),
|
|
790
|
+
planSha256: readSha256(value.planSha256, `${pathArg}.planSha256`),
|
|
791
|
+
sourceStateHmac: readStateHmac(value.sourceStateHmac, `${pathArg}.sourceStateHmac`),
|
|
792
|
+
finalStateHmac: readStateHmac(value.finalStateHmac, `${pathArg}.finalStateHmac`),
|
|
793
|
+
settlements,
|
|
794
|
+
counts,
|
|
795
|
+
classificationCounts,
|
|
796
|
+
};
|
|
797
|
+
};
|
|
798
|
+
export const normalizeCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => finalize(normalizeStableOutcomeInternal(valueArg, 'stableOutcome'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'stableOutcome');
|
|
799
|
+
export const encodeCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementStableOutcome(valueArg), 'stableOutcome');
|
|
800
|
+
export const encodeCloudlyLegacyDeploymentSettlementStableOutcomeHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.stableOutcomeHmac, encodeNormalized(normalizeUnsignedAuthenticatedStableOutcomeInternal(valueArg, 'unsignedAuthenticatedStableOutcome'), 'unsignedAuthenticatedStableOutcome'));
|
|
801
|
+
export const digestCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementStableOutcome(valueArg));
|
|
802
|
+
const authenticatedArtifactKeys = [
|
|
803
|
+
'schemaVersion',
|
|
804
|
+
'kind',
|
|
805
|
+
'authority',
|
|
806
|
+
'payload',
|
|
807
|
+
'payloadSha256',
|
|
808
|
+
'mac',
|
|
809
|
+
];
|
|
810
|
+
const unsignedAuthenticatedArtifactKeys = authenticatedArtifactKeys.filter((keyArg) => keyArg !== 'mac');
|
|
811
|
+
const normalizeUnsignedAuthenticatedArtifactInternal = (valueArg, pathArg, kindArg, normalizePayloadArg, getPayloadAuthorityArg) => {
|
|
812
|
+
const value = readRecord(valueArg, pathArg);
|
|
813
|
+
assertExactKeys(value, unsignedAuthenticatedArtifactKeys, pathArg);
|
|
814
|
+
if (value.schemaVersion !== 1 || value.kind !== kindArg) {
|
|
815
|
+
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
816
|
+
}
|
|
817
|
+
const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
|
|
818
|
+
const payload = normalizePayloadArg(value.payload);
|
|
819
|
+
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
820
|
+
if (payloadSha256 !== digestBytes(encodeNormalized(payload, `${pathArg}.payload`))) {
|
|
821
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
|
|
822
|
+
}
|
|
823
|
+
if (getPayloadAuthorityArg
|
|
824
|
+
&& canonicalize(authority, `${pathArg}.authority`)
|
|
825
|
+
!== canonicalize(getPayloadAuthorityArg(payload), `${pathArg}.payload.authority`)) {
|
|
826
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.authority`);
|
|
827
|
+
}
|
|
828
|
+
return {
|
|
829
|
+
schemaVersion: 1,
|
|
830
|
+
kind: kindArg,
|
|
831
|
+
authority,
|
|
832
|
+
payload: payload,
|
|
833
|
+
payloadSha256,
|
|
834
|
+
};
|
|
835
|
+
};
|
|
836
|
+
const normalizeAuthenticatedArtifactInternal = (valueArg, pathArg, kindArg, normalizePayloadArg, getPayloadAuthorityArg) => {
|
|
837
|
+
const value = readRecord(valueArg, pathArg);
|
|
838
|
+
assertExactKeys(value, authenticatedArtifactKeys, pathArg);
|
|
839
|
+
const unsignedInput = Object.fromEntries(unsignedAuthenticatedArtifactKeys.map((keyArg) => [
|
|
840
|
+
keyArg,
|
|
841
|
+
value[keyArg],
|
|
842
|
+
]));
|
|
843
|
+
return {
|
|
844
|
+
...normalizeUnsignedAuthenticatedArtifactInternal(unsignedInput, `${pathArg}.unsigned`, kindArg, normalizePayloadArg, getPayloadAuthorityArg),
|
|
845
|
+
mac: readMac(value.mac, `${pathArg}.mac`),
|
|
846
|
+
};
|
|
847
|
+
};
|
|
848
|
+
const normalizeUnsignedAuthenticatedRehearsalBindingInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-rehearsal-binding', normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding);
|
|
849
|
+
const normalizeUnsignedAuthenticatedPlanInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-plan', normalizeCloudlyLegacyDeploymentSettlementPlan, (payloadArg) => payloadArg.authority);
|
|
850
|
+
const normalizeUnsignedAuthenticatedProductionRequestInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-production-request', normalizeCloudlyLegacyDeploymentSettlementProductionRequest, (payloadArg) => payloadArg.authority);
|
|
851
|
+
const normalizeUnsignedAuthenticatedCheckResultInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-check-result', normalizeCloudlyLegacyDeploymentSettlementCheckResult);
|
|
852
|
+
const normalizeUnsignedAuthenticatedApplyResultInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-apply-result', normalizeCloudlyLegacyDeploymentSettlementApplyResult);
|
|
853
|
+
const normalizeUnsignedAuthenticatedStableOutcomeInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-stable-outcome', normalizeCloudlyLegacyDeploymentSettlementStableOutcome);
|
|
854
|
+
const finalizeAuthenticatedArtifact = (valueArg, pathArg) => finalize(valueArg, cloudlyLegacyDeploymentSettlementLimits.maximumAuthenticatedArtifactBytes, pathArg);
|
|
855
|
+
/** Structural only. Use the async ForAuthority variant to authenticate its MAC. */
|
|
856
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedRehearsalBinding', 'authenticated-cloudly-legacy-deployment-settlement-rehearsal-binding', normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding), 'authenticatedRehearsalBinding'));
|
|
857
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedPlan', 'authenticated-cloudly-legacy-deployment-settlement-plan', normalizeCloudlyLegacyDeploymentSettlementPlan, (payloadArg) => payloadArg.authority), 'authenticatedPlan'));
|
|
858
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedProductionRequest', 'authenticated-cloudly-legacy-deployment-settlement-production-request', normalizeCloudlyLegacyDeploymentSettlementProductionRequest, (payloadArg) => payloadArg.authority), 'authenticatedProductionRequest'));
|
|
859
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedCheckResult', 'authenticated-cloudly-legacy-deployment-settlement-check-result', normalizeCloudlyLegacyDeploymentSettlementCheckResult), 'authenticatedCheckResult'));
|
|
860
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedApplyResult', 'authenticated-cloudly-legacy-deployment-settlement-apply-result', normalizeCloudlyLegacyDeploymentSettlementApplyResult), 'authenticatedApplyResult'));
|
|
861
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedStableOutcome', 'authenticated-cloudly-legacy-deployment-settlement-stable-outcome', normalizeCloudlyLegacyDeploymentSettlementStableOutcome), 'authenticatedStableOutcome'));
|
|
862
|
+
export const encodeCloudlyLegacyDeploymentSettlementProductionRequestHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.productionRequestHmac, encodeNormalized(normalizeUnsignedAuthenticatedProductionRequestInternal(valueArg, 'unsignedAuthenticatedProductionRequest'), 'unsignedAuthenticatedProductionRequest'));
|
|
863
|
+
const encodeAuthenticatedArtifact = (valueArg, normalizeArg, pathArg) => encodeNormalized(normalizeArg(valueArg), pathArg);
|
|
864
|
+
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure, 'authenticatedRehearsalBinding');
|
|
865
|
+
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementPlan = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure, 'authenticatedPlan');
|
|
866
|
+
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure, 'authenticatedProductionRequest');
|
|
867
|
+
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure, 'authenticatedCheckResult');
|
|
868
|
+
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure, 'authenticatedApplyResult');
|
|
869
|
+
export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure, 'authenticatedStableOutcome');
|
|
870
|
+
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg));
|
|
871
|
+
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementPlan = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementPlan(valueArg));
|
|
872
|
+
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest(valueArg));
|
|
873
|
+
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult(valueArg));
|
|
874
|
+
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult(valueArg));
|
|
875
|
+
export const digestAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome(valueArg));
|
|
876
|
+
const scratchReceiptKeys = [
|
|
877
|
+
'schemaVersion',
|
|
878
|
+
'kind',
|
|
879
|
+
'authority',
|
|
880
|
+
'requestSha256',
|
|
881
|
+
'stableOutcome',
|
|
882
|
+
'stableOutcomeSha256',
|
|
883
|
+
'transactionCommitted',
|
|
884
|
+
'disposition',
|
|
885
|
+
'completedAt',
|
|
886
|
+
'payloadSha256',
|
|
887
|
+
'mac',
|
|
888
|
+
];
|
|
889
|
+
const scratchReceiptPayloadKeys = scratchReceiptKeys.filter((keyArg) => (keyArg !== 'payloadSha256' && keyArg !== 'mac'));
|
|
890
|
+
const unsignedScratchReceiptKeys = scratchReceiptKeys.filter((keyArg) => keyArg !== 'mac');
|
|
891
|
+
const scratchReceiptPayload = (valueArg) => ({
|
|
892
|
+
schemaVersion: valueArg.schemaVersion,
|
|
893
|
+
kind: valueArg.kind,
|
|
894
|
+
authority: valueArg.authority,
|
|
895
|
+
requestSha256: valueArg.requestSha256,
|
|
896
|
+
stableOutcome: valueArg.stableOutcome,
|
|
897
|
+
stableOutcomeSha256: valueArg.stableOutcomeSha256,
|
|
898
|
+
transactionCommitted: valueArg.transactionCommitted,
|
|
899
|
+
disposition: valueArg.disposition,
|
|
900
|
+
completedAt: valueArg.completedAt,
|
|
901
|
+
});
|
|
902
|
+
const normalizeScratchReceiptPayloadInternal = (valueArg, pathArg) => {
|
|
903
|
+
const value = readRecord(valueArg, pathArg);
|
|
904
|
+
assertExactKeys(value, scratchReceiptPayloadKeys, pathArg);
|
|
905
|
+
if (value.schemaVersion !== 1
|
|
906
|
+
|| value.kind !== 'cloudly-legacy-deployment-settlement-scratch-receipt'
|
|
907
|
+
|| value.transactionCommitted !== true) {
|
|
908
|
+
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
909
|
+
}
|
|
910
|
+
const output = {
|
|
911
|
+
schemaVersion: 1,
|
|
912
|
+
kind: 'cloudly-legacy-deployment-settlement-scratch-receipt',
|
|
913
|
+
authority: normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`),
|
|
914
|
+
requestSha256: readSha256(value.requestSha256, `${pathArg}.requestSha256`),
|
|
915
|
+
stableOutcome: normalizeStableOutcomeInternal(value.stableOutcome, `${pathArg}.stableOutcome`),
|
|
916
|
+
stableOutcomeSha256: readSha256(value.stableOutcomeSha256, `${pathArg}.stableOutcomeSha256`),
|
|
917
|
+
transactionCommitted: true,
|
|
918
|
+
disposition: readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], `${pathArg}.disposition`),
|
|
919
|
+
completedAt: readInteger(value.completedAt, `${pathArg}.completedAt`, 1),
|
|
920
|
+
};
|
|
921
|
+
if (output.stableOutcomeSha256
|
|
922
|
+
!== digestBytes(encodeNormalized(output.stableOutcome, `${pathArg}.stableOutcome`))) {
|
|
923
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.stableOutcomeSha256`);
|
|
924
|
+
}
|
|
925
|
+
return output;
|
|
926
|
+
};
|
|
927
|
+
const normalizeUnsignedScratchReceiptInternal = (valueArg, pathArg) => {
|
|
928
|
+
const value = readRecord(valueArg, pathArg);
|
|
929
|
+
assertExactKeys(value, unsignedScratchReceiptKeys, pathArg);
|
|
930
|
+
const payloadInput = Object.fromEntries(scratchReceiptPayloadKeys.map((keyArg) => [
|
|
931
|
+
keyArg,
|
|
932
|
+
value[keyArg],
|
|
933
|
+
]));
|
|
934
|
+
const payload = normalizeScratchReceiptPayloadInternal(payloadInput, `${pathArg}.payload`);
|
|
935
|
+
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
936
|
+
if (payloadSha256 !== digestBytes(encodeNormalized(scratchReceiptPayload(payload), `${pathArg}.payload`))) {
|
|
937
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
|
|
938
|
+
}
|
|
939
|
+
return { ...payload, payloadSha256 };
|
|
940
|
+
};
|
|
941
|
+
const normalizeScratchReceiptInternal = (valueArg, pathArg) => {
|
|
942
|
+
const value = readRecord(valueArg, pathArg);
|
|
943
|
+
assertExactKeys(value, scratchReceiptKeys, pathArg);
|
|
944
|
+
const unsignedInput = Object.fromEntries(unsignedScratchReceiptKeys.map((keyArg) => [
|
|
945
|
+
keyArg,
|
|
946
|
+
value[keyArg],
|
|
947
|
+
]));
|
|
948
|
+
const unsigned = normalizeUnsignedScratchReceiptInternal(unsignedInput, `${pathArg}.unsigned`);
|
|
949
|
+
return {
|
|
950
|
+
...unsigned,
|
|
951
|
+
mac: readMac(value.mac, `${pathArg}.mac`),
|
|
952
|
+
};
|
|
953
|
+
};
|
|
954
|
+
export const digestCloudlyLegacyDeploymentSettlementScratchReceiptPayload = (valueArg) => {
|
|
955
|
+
const payload = normalizeScratchReceiptPayloadInternal(valueArg, 'scratchReceiptPayload');
|
|
956
|
+
return digestBytes(encodeNormalized(scratchReceiptPayload(payload), 'scratchReceiptPayload'));
|
|
957
|
+
};
|
|
958
|
+
export const normalizeCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => finalize(normalizeScratchReceiptInternal(valueArg, 'scratchReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'scratchReceipt');
|
|
959
|
+
export const encodeCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(valueArg), 'scratchReceipt');
|
|
960
|
+
export const encodeCloudlyLegacyDeploymentSettlementScratchReceiptHmacInput = (valueArg) => {
|
|
961
|
+
const authenticated = finalize(normalizeUnsignedScratchReceiptInternal(valueArg, 'unsignedScratchReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'unsignedScratchReceipt');
|
|
962
|
+
return frame(cloudlyLegacyDeploymentSettlementDomains.scratchReceiptHmac, encodeNormalized(authenticated, 'scratchReceipt.authenticated'));
|
|
963
|
+
};
|
|
964
|
+
export const digestCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementScratchReceipt(valueArg));
|
|
965
|
+
const productionReceiptKeys = [
|
|
966
|
+
'schemaVersion',
|
|
967
|
+
'kind',
|
|
968
|
+
'authority',
|
|
969
|
+
'requestSha256',
|
|
970
|
+
'scratchReceipt',
|
|
971
|
+
'scratchReceiptSha256',
|
|
972
|
+
'stableOutcome',
|
|
973
|
+
'stableOutcomeSha256',
|
|
974
|
+
'transactionCommitted',
|
|
975
|
+
'disposition',
|
|
976
|
+
'completedAt',
|
|
977
|
+
'payloadSha256',
|
|
978
|
+
'mac',
|
|
979
|
+
];
|
|
980
|
+
const productionReceiptPayloadKeys = productionReceiptKeys.filter((keyArg) => (keyArg !== 'payloadSha256' && keyArg !== 'mac'));
|
|
981
|
+
const unsignedProductionReceiptKeys = productionReceiptKeys.filter((keyArg) => keyArg !== 'mac');
|
|
982
|
+
const productionReceiptPayload = (valueArg) => ({
|
|
983
|
+
schemaVersion: valueArg.schemaVersion,
|
|
984
|
+
kind: valueArg.kind,
|
|
985
|
+
authority: valueArg.authority,
|
|
986
|
+
requestSha256: valueArg.requestSha256,
|
|
987
|
+
scratchReceipt: valueArg.scratchReceipt,
|
|
988
|
+
scratchReceiptSha256: valueArg.scratchReceiptSha256,
|
|
989
|
+
stableOutcome: valueArg.stableOutcome,
|
|
990
|
+
stableOutcomeSha256: valueArg.stableOutcomeSha256,
|
|
991
|
+
transactionCommitted: valueArg.transactionCommitted,
|
|
992
|
+
disposition: valueArg.disposition,
|
|
993
|
+
completedAt: valueArg.completedAt,
|
|
994
|
+
});
|
|
995
|
+
const normalizeProductionReceiptPayloadInternal = (valueArg, pathArg) => {
|
|
996
|
+
const value = readRecord(valueArg, pathArg);
|
|
997
|
+
assertExactKeys(value, productionReceiptPayloadKeys, pathArg);
|
|
998
|
+
if (value.schemaVersion !== 1
|
|
999
|
+
|| value.kind !== 'cloudly-legacy-deployment-settlement-production-receipt'
|
|
1000
|
+
|| value.transactionCommitted !== true) {
|
|
1001
|
+
fail('INVALID_VALUE', `${pathArg}.kind`);
|
|
1002
|
+
}
|
|
1003
|
+
const scratchReceipt = normalizeScratchReceiptInternal(value.scratchReceipt, `${pathArg}.scratchReceipt`);
|
|
1004
|
+
const stableOutcome = normalizeStableOutcomeInternal(value.stableOutcome, `${pathArg}.stableOutcome`);
|
|
1005
|
+
const stableOutcomeSha256 = readSha256(value.stableOutcomeSha256, `${pathArg}.stableOutcomeSha256`);
|
|
1006
|
+
const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
|
|
1007
|
+
if (canonicalize(authority, `${pathArg}.authority`)
|
|
1008
|
+
!== canonicalize(scratchReceipt.authority, `${pathArg}.scratchReceipt.authority`)) {
|
|
1009
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.authority`);
|
|
1010
|
+
}
|
|
1011
|
+
const requestSha256 = readSha256(value.requestSha256, `${pathArg}.requestSha256`);
|
|
1012
|
+
const disposition = readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], `${pathArg}.disposition`);
|
|
1013
|
+
if (requestSha256 !== scratchReceipt.requestSha256
|
|
1014
|
+
|| disposition !== scratchReceipt.disposition) {
|
|
1015
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.scratchReceipt`);
|
|
1016
|
+
}
|
|
1017
|
+
if (canonicalize(stableOutcome, `${pathArg}.stableOutcome`)
|
|
1018
|
+
!== canonicalize(scratchReceipt.stableOutcome, `${pathArg}.scratchReceipt.stableOutcome`)
|
|
1019
|
+
|| stableOutcomeSha256 !== scratchReceipt.stableOutcomeSha256
|
|
1020
|
+
|| stableOutcomeSha256
|
|
1021
|
+
!== digestBytes(encodeNormalized(stableOutcome, `${pathArg}.stableOutcome`))) {
|
|
1022
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.stableOutcome`);
|
|
1023
|
+
}
|
|
1024
|
+
const scratchReceiptSha256 = readSha256(value.scratchReceiptSha256, `${pathArg}.scratchReceiptSha256`);
|
|
1025
|
+
if (scratchReceiptSha256
|
|
1026
|
+
!== digestBytes(encodeNormalized(scratchReceipt, `${pathArg}.scratchReceipt`))) {
|
|
1027
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.scratchReceiptSha256`);
|
|
1028
|
+
}
|
|
1029
|
+
return {
|
|
1030
|
+
schemaVersion: 1,
|
|
1031
|
+
kind: 'cloudly-legacy-deployment-settlement-production-receipt',
|
|
1032
|
+
authority,
|
|
1033
|
+
requestSha256,
|
|
1034
|
+
scratchReceipt,
|
|
1035
|
+
scratchReceiptSha256,
|
|
1036
|
+
stableOutcome,
|
|
1037
|
+
stableOutcomeSha256,
|
|
1038
|
+
transactionCommitted: true,
|
|
1039
|
+
disposition,
|
|
1040
|
+
completedAt: readInteger(value.completedAt, `${pathArg}.completedAt`, scratchReceipt.completedAt),
|
|
1041
|
+
};
|
|
1042
|
+
};
|
|
1043
|
+
const normalizeUnsignedProductionReceiptInternal = (valueArg, pathArg) => {
|
|
1044
|
+
const value = readRecord(valueArg, pathArg);
|
|
1045
|
+
assertExactKeys(value, unsignedProductionReceiptKeys, pathArg);
|
|
1046
|
+
const payloadInput = Object.fromEntries(productionReceiptPayloadKeys.map((keyArg) => [
|
|
1047
|
+
keyArg,
|
|
1048
|
+
value[keyArg],
|
|
1049
|
+
]));
|
|
1050
|
+
const payload = normalizeProductionReceiptPayloadInternal(payloadInput, `${pathArg}.payload`);
|
|
1051
|
+
const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
|
|
1052
|
+
if (payloadSha256 !== digestBytes(encodeNormalized(productionReceiptPayload(payload), `${pathArg}.payload`))) {
|
|
1053
|
+
fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
|
|
1054
|
+
}
|
|
1055
|
+
return { ...payload, payloadSha256 };
|
|
1056
|
+
};
|
|
1057
|
+
export const digestCloudlyLegacyDeploymentSettlementProductionReceiptPayload = (valueArg) => {
|
|
1058
|
+
const payload = normalizeProductionReceiptPayloadInternal(valueArg, 'productionReceiptPayload');
|
|
1059
|
+
return digestBytes(encodeNormalized(productionReceiptPayload(payload), 'productionReceiptPayload'));
|
|
1060
|
+
};
|
|
1061
|
+
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => {
|
|
1062
|
+
const value = readRecord(valueArg, 'productionReceipt');
|
|
1063
|
+
assertExactKeys(value, productionReceiptKeys, 'productionReceipt');
|
|
1064
|
+
const unsignedInput = Object.fromEntries(unsignedProductionReceiptKeys.map((keyArg) => [
|
|
1065
|
+
keyArg,
|
|
1066
|
+
value[keyArg],
|
|
1067
|
+
]));
|
|
1068
|
+
const unsigned = normalizeUnsignedProductionReceiptInternal(unsignedInput, 'productionReceipt.unsigned');
|
|
1069
|
+
return finalize({
|
|
1070
|
+
...unsigned,
|
|
1071
|
+
mac: readMac(value.mac, 'productionReceipt.mac'),
|
|
1072
|
+
}, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'productionReceipt');
|
|
1073
|
+
};
|
|
1074
|
+
export const encodeCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionReceipt(valueArg), 'productionReceipt');
|
|
1075
|
+
export const encodeCloudlyLegacyDeploymentSettlementProductionReceiptHmacInput = (valueArg) => {
|
|
1076
|
+
const authenticated = finalize(normalizeUnsignedProductionReceiptInternal(valueArg, 'unsignedProductionReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'unsignedProductionReceipt');
|
|
1077
|
+
return frame(cloudlyLegacyDeploymentSettlementDomains.productionReceiptHmac, encodeNormalized(authenticated, 'productionReceipt.authenticated'));
|
|
1078
|
+
};
|
|
1079
|
+
export const digestCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementProductionReceipt(valueArg));
|
|
1080
|
+
const withoutArtifactMac = (artifactArg) => {
|
|
1081
|
+
const { mac: _mac, ...unsigned } = artifactArg;
|
|
1082
|
+
return unsigned;
|
|
1083
|
+
};
|
|
1084
|
+
const requireConsumerVerifiedHmac = async (authorityArg, domainArg, hmacInputArg, macArg, verifierArg, pathArg) => {
|
|
1085
|
+
let verified = false;
|
|
1086
|
+
try {
|
|
1087
|
+
verified = await verifierArg({
|
|
1088
|
+
authority: authorityArg,
|
|
1089
|
+
domain: domainArg,
|
|
1090
|
+
hmacInput: new Uint8Array(hmacInputArg),
|
|
1091
|
+
mac: macArg,
|
|
1092
|
+
});
|
|
1093
|
+
}
|
|
1094
|
+
catch {
|
|
1095
|
+
verified = false;
|
|
1096
|
+
}
|
|
1097
|
+
if (!verified)
|
|
1098
|
+
fail('INVALID_VALUE', pathArg);
|
|
1099
|
+
};
|
|
1100
|
+
const assertAuthorityTimestamp = (timestampArg, metadataArg, pathArg) => {
|
|
1101
|
+
if (timestampArg < metadataArg.issuedAt || timestampArg >= metadataArg.expiresAt) {
|
|
1102
|
+
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1103
|
+
}
|
|
1104
|
+
};
|
|
1105
|
+
const assertAuthorityReferenceMatchesMetadata = (referenceArg, metadataArg, pathArg) => {
|
|
1106
|
+
try {
|
|
1107
|
+
normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata(referenceArg, metadataArg);
|
|
1108
|
+
}
|
|
1109
|
+
catch {
|
|
1110
|
+
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1111
|
+
}
|
|
1112
|
+
};
|
|
1113
|
+
const assertRehearsalBindingMatchesAuthorityMetadata = (bindingArg, metadataArg, pathArg) => {
|
|
1114
|
+
const expected = {
|
|
1115
|
+
settlementId: metadataArg.settlementId,
|
|
1116
|
+
runId: metadataArg.runId,
|
|
1117
|
+
rehearsalId: metadataArg.rehearsalId,
|
|
1118
|
+
scratchServiceId: metadataArg.scratchServiceId,
|
|
1119
|
+
allocationId: metadataArg.allocationId,
|
|
1120
|
+
allocationGeneration: metadataArg.allocationGeneration,
|
|
1121
|
+
allocationBindingSha256: metadataArg.allocationBindingSha256,
|
|
1122
|
+
allocationReceiptSha256: metadataArg.allocationReceiptSha256,
|
|
1123
|
+
backupId: metadataArg.backupId,
|
|
1124
|
+
backupSnapshotIdSha256: metadataArg.backupSnapshotIdSha256,
|
|
1125
|
+
backupProofSha256: metadataArg.backupProofSha256,
|
|
1126
|
+
sourceDataSha256: metadataArg.sourceDataSha256,
|
|
1127
|
+
restoredDataSha256: metadataArg.restoredDataSha256,
|
|
1128
|
+
digestProofSha256: metadataArg.digestProofSha256,
|
|
1129
|
+
targetImageDigest: metadataArg.targetImageDigest,
|
|
1130
|
+
targetVersion: metadataArg.targetVersion,
|
|
1131
|
+
targetManifestSha256: metadataArg.targetManifestSha256,
|
|
1132
|
+
targetConfigSha256: metadataArg.targetConfigSha256,
|
|
1133
|
+
};
|
|
1134
|
+
const actual = {
|
|
1135
|
+
settlementId: bindingArg.settlementId,
|
|
1136
|
+
runId: bindingArg.runId,
|
|
1137
|
+
rehearsalId: bindingArg.rehearsalId,
|
|
1138
|
+
scratchServiceId: bindingArg.scratchServiceId,
|
|
1139
|
+
allocationId: bindingArg.allocationId,
|
|
1140
|
+
allocationGeneration: bindingArg.allocationGeneration,
|
|
1141
|
+
allocationBindingSha256: bindingArg.allocationBindingSha256,
|
|
1142
|
+
allocationReceiptSha256: bindingArg.allocationReceiptSha256,
|
|
1143
|
+
backupId: bindingArg.backupId,
|
|
1144
|
+
backupSnapshotIdSha256: bindingArg.backupSnapshotIdSha256,
|
|
1145
|
+
backupProofSha256: bindingArg.backupProofSha256,
|
|
1146
|
+
sourceDataSha256: bindingArg.sourceDataSha256,
|
|
1147
|
+
restoredDataSha256: bindingArg.restoredDataSha256,
|
|
1148
|
+
digestProofSha256: bindingArg.digestProofSha256,
|
|
1149
|
+
targetImageDigest: bindingArg.targetImageDigest,
|
|
1150
|
+
targetVersion: bindingArg.targetVersion,
|
|
1151
|
+
targetManifestSha256: bindingArg.targetManifestSha256,
|
|
1152
|
+
targetConfigSha256: bindingArg.targetConfigSha256,
|
|
1153
|
+
};
|
|
1154
|
+
if (canonicalize(actual, pathArg) !== canonicalize(expected, `${pathArg}.expected`)) {
|
|
1155
|
+
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1156
|
+
}
|
|
1157
|
+
};
|
|
1158
|
+
export const normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority = (bindingArg, metadataArg) => {
|
|
1159
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1160
|
+
const binding = normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding(bindingArg);
|
|
1161
|
+
assertRehearsalBindingMatchesAuthorityMetadata(binding, metadata, 'rehearsalBinding.authority');
|
|
1162
|
+
return binding;
|
|
1163
|
+
};
|
|
1164
|
+
export const normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority = (planArg, metadataArg) => {
|
|
1165
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1166
|
+
const plan = normalizeCloudlyLegacyDeploymentSettlementPlan(planArg);
|
|
1167
|
+
assertAuthorityReferenceMatchesMetadata(plan.authority, metadata, 'plan.authority');
|
|
1168
|
+
if (plan.settlementId !== metadata.settlementId) {
|
|
1169
|
+
fail('CROSS_FIELD_MISMATCH', 'plan.settlementId');
|
|
1170
|
+
}
|
|
1171
|
+
assertAuthorityTimestamp(plan.effectiveAt, metadata, 'plan.effectiveAt');
|
|
1172
|
+
return plan;
|
|
1173
|
+
};
|
|
1174
|
+
export const normalizeCloudlyLegacyDeploymentSettlementProductionRequestForAuthority = (requestArg, metadataArg) => {
|
|
1175
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1176
|
+
const request = normalizeCloudlyLegacyDeploymentSettlementProductionRequest(requestArg);
|
|
1177
|
+
assertAuthorityReferenceMatchesMetadata(request.authority, metadata, 'productionRequest.authority');
|
|
1178
|
+
normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority(request.plan, metadata);
|
|
1179
|
+
normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority(request.rehearsalBinding, metadata);
|
|
1180
|
+
assertAuthorityTimestamp(request.requestedAt, metadata, 'productionRequest.requestedAt');
|
|
1181
|
+
return request;
|
|
1182
|
+
};
|
|
1183
|
+
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority = async (bindingArg, metadataArg, verifierArg) => {
|
|
1184
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1185
|
+
const binding = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure(bindingArg);
|
|
1186
|
+
assertAuthorityReferenceMatchesMetadata(binding.authority, metadata, 'rehearsalBinding.authority');
|
|
1187
|
+
normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority(binding.payload, metadata);
|
|
1188
|
+
await requireConsumerVerifiedHmac(binding.authority, cloudlyLegacyDeploymentSettlementDomains.rehearsalBindingHmac, encodeCloudlyLegacyDeploymentSettlementRehearsalBindingHmacInput(withoutArtifactMac(binding)), binding.mac, verifierArg, 'rehearsalBinding.mac');
|
|
1189
|
+
return binding;
|
|
1190
|
+
};
|
|
1191
|
+
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementPlanForAuthority = async (planArg, metadataArg, verifierArg) => {
|
|
1192
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1193
|
+
const plan = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure(planArg);
|
|
1194
|
+
assertAuthorityReferenceMatchesMetadata(plan.authority, metadata, 'plan.authority');
|
|
1195
|
+
normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority(plan.payload, metadata);
|
|
1196
|
+
await requireConsumerVerifiedHmac(plan.authority, cloudlyLegacyDeploymentSettlementDomains.planHmac, encodeCloudlyLegacyDeploymentSettlementPlanHmacInput(withoutArtifactMac(plan)), plan.mac, verifierArg, 'plan.mac');
|
|
1197
|
+
return plan;
|
|
1198
|
+
};
|
|
1199
|
+
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority = async (requestArg, metadataArg, verifierArg) => {
|
|
1200
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1201
|
+
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1202
|
+
assertAuthorityReferenceMatchesMetadata(request.authority, metadata, 'productionRequest.authority');
|
|
1203
|
+
normalizeCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(request.payload, metadata);
|
|
1204
|
+
await requireConsumerVerifiedHmac(request.authority, cloudlyLegacyDeploymentSettlementDomains.productionRequestHmac, encodeCloudlyLegacyDeploymentSettlementProductionRequestHmacInput(withoutArtifactMac(request)), request.mac, verifierArg, 'productionRequest.mac');
|
|
1205
|
+
return request;
|
|
1206
|
+
};
|
|
1207
|
+
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResultForAuthority = async (resultArg, metadataArg, requestArg, verifierArg) => {
|
|
1208
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1209
|
+
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1210
|
+
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructureForRequest(resultArg, request);
|
|
1211
|
+
assertAuthorityReferenceMatchesMetadata(result.authority, metadata, 'checkResult.authority');
|
|
1212
|
+
assertAuthorityTimestamp(result.payload.checkedAt, metadata, 'checkResult.checkedAt');
|
|
1213
|
+
await requireConsumerVerifiedHmac(result.authority, cloudlyLegacyDeploymentSettlementDomains.checkResultHmac, encodeCloudlyLegacyDeploymentSettlementCheckResultHmacInput(withoutArtifactMac(result)), result.mac, verifierArg, 'checkResult.mac');
|
|
1214
|
+
return result;
|
|
1215
|
+
};
|
|
1216
|
+
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResultForAuthority = async (resultArg, metadataArg, requestArg, verifierArg) => {
|
|
1217
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1218
|
+
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1219
|
+
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructureForRequest(resultArg, request);
|
|
1220
|
+
assertAuthorityReferenceMatchesMetadata(result.authority, metadata, 'applyResult.authority');
|
|
1221
|
+
assertAuthorityTimestamp(result.payload.status === 'completed'
|
|
1222
|
+
? result.payload.completedAt
|
|
1223
|
+
: result.payload.rejectedAt, metadata, 'applyResult.completedAt');
|
|
1224
|
+
await requireConsumerVerifiedHmac(result.authority, cloudlyLegacyDeploymentSettlementDomains.applyResultHmac, encodeCloudlyLegacyDeploymentSettlementApplyResultHmacInput(withoutArtifactMac(result)), result.mac, verifierArg, 'applyResult.mac');
|
|
1225
|
+
return result;
|
|
1226
|
+
};
|
|
1227
|
+
export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcomeForAuthority = async (outcomeArg, metadataArg, requestArg, verifierArg) => {
|
|
1228
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1229
|
+
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1230
|
+
const outcome = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructureForRequest(outcomeArg, request);
|
|
1231
|
+
assertAuthorityReferenceMatchesMetadata(outcome.authority, metadata, 'stableOutcome.authority');
|
|
1232
|
+
if (outcome.payload.settlementId !== metadata.settlementId
|
|
1233
|
+
|| outcome.payload.runId !== metadata.runId) {
|
|
1234
|
+
fail('CROSS_FIELD_MISMATCH', 'stableOutcome.authority');
|
|
1235
|
+
}
|
|
1236
|
+
assertAuthorityTimestamp(outcome.payload.effectiveAt, metadata, 'stableOutcome.effectiveAt');
|
|
1237
|
+
await requireConsumerVerifiedHmac(outcome.authority, cloudlyLegacyDeploymentSettlementDomains.stableOutcomeHmac, encodeCloudlyLegacyDeploymentSettlementStableOutcomeHmacInput(withoutArtifactMac(outcome)), outcome.mac, verifierArg, 'stableOutcome.mac');
|
|
1238
|
+
return outcome;
|
|
1239
|
+
};
|
|
1240
|
+
export const normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority = async (receiptArg, metadataArg, requestArg, verifierArg) => {
|
|
1241
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1242
|
+
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1243
|
+
const receipt = normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest(receiptArg, request);
|
|
1244
|
+
assertAuthorityReferenceMatchesMetadata(receipt.authority, metadata, 'scratchReceipt.authority');
|
|
1245
|
+
if (receipt.stableOutcome.settlementId !== metadata.settlementId
|
|
1246
|
+
|| receipt.stableOutcome.runId !== metadata.runId) {
|
|
1247
|
+
fail('CROSS_FIELD_MISMATCH', 'scratchReceipt.stableOutcome');
|
|
1248
|
+
}
|
|
1249
|
+
assertAuthorityTimestamp(receipt.stableOutcome.effectiveAt, metadata, 'scratchReceipt.effectiveAt');
|
|
1250
|
+
assertAuthorityTimestamp(receipt.completedAt, metadata, 'scratchReceipt.completedAt');
|
|
1251
|
+
await requireConsumerVerifiedHmac(receipt.authority, cloudlyLegacyDeploymentSettlementDomains.scratchReceiptHmac, encodeCloudlyLegacyDeploymentSettlementScratchReceiptHmacInput(withoutArtifactMac(receipt)), receipt.mac, verifierArg, 'scratchReceipt.mac');
|
|
1252
|
+
return receipt;
|
|
1253
|
+
};
|
|
1254
|
+
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptForAuthority = async (receiptArg, metadataArg, requestArg, verifierArg) => {
|
|
1255
|
+
const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
|
|
1256
|
+
const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
|
|
1257
|
+
const receipt = normalizeCloudlyLegacyDeploymentSettlementProductionReceiptStructureForRequest(receiptArg, request);
|
|
1258
|
+
assertAuthorityReferenceMatchesMetadata(receipt.authority, metadata, 'productionReceipt.authority');
|
|
1259
|
+
await normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority(receipt.scratchReceipt, metadata, request, verifierArg);
|
|
1260
|
+
if (receipt.stableOutcome.settlementId !== metadata.settlementId
|
|
1261
|
+
|| receipt.stableOutcome.runId !== metadata.runId) {
|
|
1262
|
+
fail('CROSS_FIELD_MISMATCH', 'productionReceipt.stableOutcome');
|
|
1263
|
+
}
|
|
1264
|
+
assertAuthorityTimestamp(receipt.completedAt, metadata, 'productionReceipt.completedAt');
|
|
1265
|
+
await requireConsumerVerifiedHmac(receipt.authority, cloudlyLegacyDeploymentSettlementDomains.productionReceiptHmac, encodeCloudlyLegacyDeploymentSettlementProductionReceiptHmacInput(withoutArtifactMac(receipt)), receipt.mac, verifierArg, 'productionReceipt.mac');
|
|
1266
|
+
return receipt;
|
|
1267
|
+
};
|
|
1268
|
+
const assertAuthenticatedAuthorityMatches = (authorityArg, expectedArg, pathArg) => {
|
|
1269
|
+
if (canonicalize(authorityArg, pathArg) !== canonicalize(expectedArg, `${pathArg}.expected`)) {
|
|
1270
|
+
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1271
|
+
}
|
|
1272
|
+
};
|
|
1273
|
+
const assertSummaryMatchesProductionRequest = (summaryArg, requestArg, pathArg) => {
|
|
1274
|
+
if (summaryArg.requestSha256
|
|
1275
|
+
!== digestCloudlyLegacyDeploymentSettlementProductionRequest(requestArg)
|
|
1276
|
+
|| summaryArg.planSha256 !== requestArg.planSha256
|
|
1277
|
+
|| summaryArg.settlementId !== requestArg.plan.settlementId
|
|
1278
|
+
|| summaryArg.sourceStateHmac !== requestArg.plan.sourceStateHmac
|
|
1279
|
+
|| summaryArg.finalStateHmac !== requestArg.plan.finalStateHmac
|
|
1280
|
+
|| canonicalize(summaryArg.counts, `${pathArg}.counts`)
|
|
1281
|
+
!== canonicalize({
|
|
1282
|
+
operationCount: requestArg.plan.operationCount,
|
|
1283
|
+
routeClaimsStabilized: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.routeClaimsStabilized, 0),
|
|
1284
|
+
routeClaimsRemoved: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.routeClaimsRemoved, 0),
|
|
1285
|
+
resourceClaimsRemoved: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.resourceClaimsRemoved, 0),
|
|
1286
|
+
}, `${pathArg}.expectedCounts`)
|
|
1287
|
+
|| canonicalize(summaryArg.classificationCounts, `${pathArg}.classificationCounts`)
|
|
1288
|
+
!== canonicalize(requestArg.plan.classificationCounts, `${pathArg}.expectedClassificationCounts`)) {
|
|
1289
|
+
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1290
|
+
}
|
|
1291
|
+
};
|
|
1292
|
+
const assertStableOutcomeMatchesProductionRequest = (stableOutcomeArg, requestArg, pathArg) => {
|
|
1293
|
+
const expectedSettlements = requestArg.plan.entries.map((entryArg) => ({
|
|
1294
|
+
operationId: entryArg.operationId,
|
|
1295
|
+
finalRevision: entryArg.finalRevision,
|
|
1296
|
+
finalDocumentHmac: entryArg.finalDocumentHmac,
|
|
1297
|
+
}));
|
|
1298
|
+
if (stableOutcomeArg.settlementId !== requestArg.plan.settlementId
|
|
1299
|
+
|| stableOutcomeArg.runId !== requestArg.rehearsalBinding.runId
|
|
1300
|
+
|| stableOutcomeArg.rehearsalBindingSha256 !== requestArg.rehearsalBindingSha256
|
|
1301
|
+
|| stableOutcomeArg.effectiveAt !== requestArg.plan.effectiveAt
|
|
1302
|
+
|| stableOutcomeArg.planSha256 !== requestArg.planSha256
|
|
1303
|
+
|| stableOutcomeArg.sourceStateHmac !== requestArg.plan.sourceStateHmac
|
|
1304
|
+
|| stableOutcomeArg.finalStateHmac !== requestArg.plan.finalStateHmac
|
|
1305
|
+
|| canonicalize(stableOutcomeArg.settlements, `${pathArg}.settlements`)
|
|
1306
|
+
!== canonicalize(expectedSettlements, `${pathArg}.expectedSettlements`)) {
|
|
1307
|
+
fail('CROSS_FIELD_MISMATCH', pathArg);
|
|
1308
|
+
}
|
|
1309
|
+
assertSummaryMatchesProductionRequest({
|
|
1310
|
+
schemaVersion: 1,
|
|
1311
|
+
requestSha256: digestCloudlyLegacyDeploymentSettlementProductionRequest(requestArg),
|
|
1312
|
+
planSha256: stableOutcomeArg.planSha256,
|
|
1313
|
+
settlementId: stableOutcomeArg.settlementId,
|
|
1314
|
+
sourceStateHmac: stableOutcomeArg.sourceStateHmac,
|
|
1315
|
+
finalStateHmac: stableOutcomeArg.finalStateHmac,
|
|
1316
|
+
transactionSupported: true,
|
|
1317
|
+
counts: stableOutcomeArg.counts,
|
|
1318
|
+
classificationCounts: stableOutcomeArg.classificationCounts,
|
|
1319
|
+
}, requestArg, pathArg);
|
|
1320
|
+
};
|
|
1321
|
+
/** Structural/request binding only; this function does not authenticate MACs. */
|
|
1322
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructureForRequest = (resultArg, requestArg) => {
|
|
1323
|
+
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1324
|
+
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure(resultArg);
|
|
1325
|
+
assertAuthenticatedAuthorityMatches(result.authority, request.authority, 'checkResult.authority');
|
|
1326
|
+
assertSummaryMatchesProductionRequest(result.payload, request.payload, 'checkResult.payload');
|
|
1327
|
+
if (result.payload.checkedAt < request.payload.requestedAt) {
|
|
1328
|
+
fail('CROSS_FIELD_MISMATCH', 'checkResult.payload.checkedAt');
|
|
1329
|
+
}
|
|
1330
|
+
return result;
|
|
1331
|
+
};
|
|
1332
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructureForRequest = (resultArg, requestArg) => {
|
|
1333
|
+
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1334
|
+
const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure(resultArg);
|
|
1335
|
+
assertAuthenticatedAuthorityMatches(result.authority, request.authority, 'applyResult.authority');
|
|
1336
|
+
assertSummaryMatchesProductionRequest(result.payload, request.payload, 'applyResult.payload');
|
|
1337
|
+
const resultAt = result.payload.status === 'completed'
|
|
1338
|
+
? result.payload.completedAt
|
|
1339
|
+
: result.payload.rejectedAt;
|
|
1340
|
+
if (resultAt < request.payload.requestedAt) {
|
|
1341
|
+
fail('CROSS_FIELD_MISMATCH', 'applyResult.payload.completedAt');
|
|
1342
|
+
}
|
|
1343
|
+
return result;
|
|
1344
|
+
};
|
|
1345
|
+
export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructureForRequest = (outcomeArg, requestArg) => {
|
|
1346
|
+
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1347
|
+
const outcome = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure(outcomeArg);
|
|
1348
|
+
assertAuthenticatedAuthorityMatches(outcome.authority, request.authority, 'stableOutcome.authority');
|
|
1349
|
+
assertStableOutcomeMatchesProductionRequest(outcome.payload, request.payload, 'stableOutcome.payload');
|
|
1350
|
+
return outcome;
|
|
1351
|
+
};
|
|
1352
|
+
/** Structural/request binding only; this function does not authenticate MACs. */
|
|
1353
|
+
export const normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest = (receiptArg, requestArg) => {
|
|
1354
|
+
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1355
|
+
const receipt = normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(receiptArg);
|
|
1356
|
+
assertAuthenticatedAuthorityMatches(receipt.authority, request.authority, 'scratchReceipt.authority');
|
|
1357
|
+
if (receipt.requestSha256
|
|
1358
|
+
!== digestCloudlyLegacyDeploymentSettlementProductionRequest(request.payload)
|
|
1359
|
+
|| receipt.completedAt < request.payload.requestedAt) {
|
|
1360
|
+
fail('CROSS_FIELD_MISMATCH', 'scratchReceipt.requestSha256');
|
|
1361
|
+
}
|
|
1362
|
+
assertStableOutcomeMatchesProductionRequest(receipt.stableOutcome, request.payload, 'scratchReceipt.stableOutcome');
|
|
1363
|
+
return receipt;
|
|
1364
|
+
};
|
|
1365
|
+
export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptStructureForRequest = (receiptArg, requestArg) => {
|
|
1366
|
+
const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
|
|
1367
|
+
const receipt = normalizeCloudlyLegacyDeploymentSettlementProductionReceipt(receiptArg);
|
|
1368
|
+
normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest(receipt.scratchReceipt, request);
|
|
1369
|
+
assertAuthenticatedAuthorityMatches(receipt.authority, request.authority, 'productionReceipt.authority');
|
|
1370
|
+
if (receipt.requestSha256
|
|
1371
|
+
!== digestCloudlyLegacyDeploymentSettlementProductionRequest(request.payload)
|
|
1372
|
+
|| receipt.completedAt < request.payload.requestedAt) {
|
|
1373
|
+
fail('CROSS_FIELD_MISMATCH', 'productionReceipt.requestSha256');
|
|
1374
|
+
}
|
|
1375
|
+
return receipt;
|
|
1376
|
+
};
|
|
1377
|
+
export { cloudlyLegacyDeploymentSettlementGoldenVectors } from './runtime.cloudlylegacydeploymentsettlement.golden.js';
|
|
1378
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5jbG91ZGx5bGVnYWN5ZGVwbG95bWVudHNldHRsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9ydW50aW1lLmNsb3VkbHlsZWdhY3lkZXBsb3ltZW50c2V0dGxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBRWhELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxHQUNoQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkUsdUJBQXVCLEVBQUUsR0FBRztJQUM1QixzQkFBc0IsRUFBRSxJQUFJO0lBQzVCLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsZ0JBQWdCLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDNUIsc0JBQXNCLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDakMsbUJBQW1CLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDL0IscUJBQXFCLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDaEMsaUNBQWlDLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDN0MsMEJBQTBCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUMvQyxxQkFBcUIsRUFBRSxFQUFFO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDcEUsWUFBWSxFQUNWLG9FQUFvRTtJQUN0RSxvQkFBb0IsRUFDbEIsNkVBQTZFO0lBQy9FLFFBQVEsRUFDTixnRUFBZ0U7SUFDbEUscUJBQXFCLEVBQ25CLDhFQUE4RTtJQUNoRixlQUFlLEVBQ2Isd0VBQXdFO0lBQzFFLGVBQWUsRUFDYix3RUFBd0U7SUFDMUUsaUJBQWlCLEVBQ2YsMEVBQTBFO0lBQzVFLGtCQUFrQixFQUNoQiwyRUFBMkU7SUFDN0UscUJB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
|