@serve.zone/interfaces 16.0.1 → 16.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 +16 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/deploymentadoption.d.ts +62 -1
- package/dist_ts/data/deploymentadoption.js +212 -2
- package/dist_ts/requests/deployment.d.ts +12 -0
- package/dist_ts/requests/service.d.ts +19 -1
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/deploymentadoption.ts +300 -1
- package/ts/requests/deployment.ts +20 -0
- package/ts/requests/service.ts +32 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-20 - 16.2.0
|
|
4
|
+
|
|
5
|
+
### Security
|
|
6
|
+
|
|
7
|
+
- add least-privilege adoption image tag bootstrap (deployment)
|
|
8
|
+
- Promote only the exact healthy live service digest from its server-derived mutable registry target to a canonical bare semantic-version tag.
|
|
9
|
+
- Return complete OCI index, platform, release, and digest-pinned evidence without granting general registry manifest writes.
|
|
10
|
+
- Add an explicit rollout-adoption bootstrap for legacy services whose immutable target differs from the retained runtime, with a generation-one digest-pinned plan and pollable rollout status.
|
|
11
|
+
|
|
12
|
+
## 2026-07-20 - 16.1.0
|
|
13
|
+
|
|
14
|
+
### Security
|
|
15
|
+
|
|
16
|
+
- require acknowledged Coreflow retention before completing adoption (deployment)
|
|
17
|
+
- Add a two-phase, session-bound retention-attestation contract with exact operation, configuration, runtime, and reporter evidence.
|
|
18
|
+
|
|
3
19
|
## 2026-07-20 - 16.0.1
|
|
4
20
|
|
|
5
21
|
### Security
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '16.0
|
|
6
|
+
version: '16.2.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { IDeploymentPreflightRuntimeTask, IOciPlatformDescriptorSummary } from './deploymentpreflight.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { IDeployment } from './deployment.js';
|
|
3
|
+
import type { IImageRolloutStatus, IImmutableImageDeploymentPlan, IImmutableRolloutReportEnvelope, IImmutableImageTargetScope, TOciManifestMediaType, TSha256Digest } from './immutableimage.js';
|
|
3
4
|
import type { IRegistryTarget } from './registry.js';
|
|
4
5
|
export type TServiceDeploymentAdoptionDecision = 'GO' | 'NO-GO';
|
|
5
6
|
/**
|
|
@@ -23,6 +24,44 @@ export interface IServiceDeploymentAdoptionInput extends IServiceDeploymentAdopt
|
|
|
23
24
|
idempotencyKey: string;
|
|
24
25
|
expectedAdoptionDigest: TServiceDeploymentAdoptionDigest;
|
|
25
26
|
}
|
|
27
|
+
export interface IServiceDeploymentAdoptionImagePromotionInput extends IServiceDeploymentAdoptionPreflightInput {
|
|
28
|
+
targetReleaseTag: string;
|
|
29
|
+
expectedSourceImageDigest?: TSha256Digest;
|
|
30
|
+
idempotencyKey: string;
|
|
31
|
+
}
|
|
32
|
+
export interface IServiceDeploymentAdoptionImagePromotionResult {
|
|
33
|
+
status: 'promoted' | 'already-promoted';
|
|
34
|
+
organizationId: string;
|
|
35
|
+
serviceId: string;
|
|
36
|
+
sourceTag: string;
|
|
37
|
+
releaseTag: string;
|
|
38
|
+
registryHost: string;
|
|
39
|
+
repository: string;
|
|
40
|
+
digest: TSha256Digest;
|
|
41
|
+
mediaType: 'application/vnd.oci.image.index.v1+json' | 'application/vnd.docker.distribution.manifest.list.v2+json';
|
|
42
|
+
platforms: IOciPlatformDescriptorSummary[];
|
|
43
|
+
releaseId: string;
|
|
44
|
+
digestPinnedImageReference: string;
|
|
45
|
+
}
|
|
46
|
+
export interface IServiceDeploymentAdoptionRolloutInput extends IServiceDeploymentAdoptionPreflightInput {
|
|
47
|
+
releaseTag: string;
|
|
48
|
+
expectedTargetImageDigest: TSha256Digest;
|
|
49
|
+
idempotencyKey: string;
|
|
50
|
+
}
|
|
51
|
+
export interface IServiceDeploymentAdoptionRolloutResult {
|
|
52
|
+
status: 'rollout-started' | 'rollout-in-progress' | 'rollout-succeeded' | 'rollout-failed';
|
|
53
|
+
idempotentReplay: boolean;
|
|
54
|
+
operationId: string;
|
|
55
|
+
organizationId: string;
|
|
56
|
+
serviceId: string;
|
|
57
|
+
registryHost: string;
|
|
58
|
+
repository: string;
|
|
59
|
+
releaseTag: string;
|
|
60
|
+
digest: TSha256Digest;
|
|
61
|
+
releaseId: string;
|
|
62
|
+
plan: IImmutableImageDeploymentPlan;
|
|
63
|
+
rolloutStatus: IImageRolloutStatus;
|
|
64
|
+
}
|
|
26
65
|
interface IServiceDeploymentAdoptionReportBase {
|
|
27
66
|
schemaVersion: 1;
|
|
28
67
|
mutationPerformed: false;
|
|
@@ -91,7 +130,29 @@ export interface IServiceDeploymentAdoptionResult {
|
|
|
91
130
|
idempotentReplay: boolean;
|
|
92
131
|
plan: IImmutableImageDeploymentPlan;
|
|
93
132
|
}
|
|
133
|
+
export type TServiceDeploymentAdoptionRetentionPhase = 'prepare' | 'commit';
|
|
134
|
+
/**
|
|
135
|
+
* A session-bound Coreflow assertion that its local live runtime can be
|
|
136
|
+
* retained for the exact adoption plan without mutating the Docker service.
|
|
137
|
+
*/
|
|
138
|
+
export interface IServiceDeploymentAdoptionRetentionAttestation {
|
|
139
|
+
schemaVersion: 1;
|
|
140
|
+
phase: TServiceDeploymentAdoptionRetentionPhase;
|
|
141
|
+
retainedWithoutMutation: true;
|
|
142
|
+
serviceId: string;
|
|
143
|
+
operationId: string;
|
|
144
|
+
adoptionConfigurationDigest: TSha256Digest;
|
|
145
|
+
immutableReport: IImmutableRolloutReportEnvelope;
|
|
146
|
+
deployments: IDeployment[];
|
|
147
|
+
attestedAt: number;
|
|
148
|
+
}
|
|
149
|
+
export declare const validateServiceDeploymentAdoptionRetentionAttestation: (attestationArg: unknown) => string[];
|
|
150
|
+
export declare const normalizeServiceDeploymentAdoptionReleaseTag: (tagArg: unknown) => string | undefined;
|
|
94
151
|
export declare const validateServiceDeploymentAdoptionPreflightInput: (inputArg: unknown) => string[];
|
|
95
152
|
export declare const validateServiceDeploymentAdoptionInput: (inputArg: unknown) => string[];
|
|
153
|
+
export declare const validateServiceDeploymentAdoptionImagePromotionInput: (inputArg: unknown) => string[];
|
|
154
|
+
export declare const validateServiceDeploymentAdoptionImagePromotionResult: (resultArg: unknown) => string[];
|
|
155
|
+
export declare const validateServiceDeploymentAdoptionRolloutInput: (inputArg: unknown) => string[];
|
|
156
|
+
export declare const validateServiceDeploymentAdoptionRolloutResult: (resultArg: unknown) => string[];
|
|
96
157
|
export declare const validateServiceDeploymentAdoptionReport: (reportArg: unknown) => string[];
|
|
97
158
|
export {};
|
|
@@ -1,5 +1,40 @@
|
|
|
1
|
-
import { normalizeImmutableReleaseTag, normalizeSha256Digest } from './immutableimage.js';
|
|
1
|
+
import { normalizeImmutableReleaseTag, normalizeSha256Digest, validateImageRolloutStatus, validateImmutableImageDeploymentPlan, } from './immutableimage.js';
|
|
2
|
+
export const validateServiceDeploymentAdoptionRetentionAttestation = (attestationArg) => {
|
|
3
|
+
if (!isRecord(attestationArg))
|
|
4
|
+
return ['retention attestation must be an object'];
|
|
5
|
+
const errors = [];
|
|
6
|
+
if (attestationArg.schemaVersion !== 1)
|
|
7
|
+
errors.push('retention attestation schemaVersion must be 1');
|
|
8
|
+
if (attestationArg.phase !== 'prepare' && attestationArg.phase !== 'commit') {
|
|
9
|
+
errors.push('retention attestation phase is invalid');
|
|
10
|
+
}
|
|
11
|
+
if (attestationArg.retainedWithoutMutation !== true) {
|
|
12
|
+
errors.push('retention attestation must assert mutation-free retention');
|
|
13
|
+
}
|
|
14
|
+
if (!isBoundedIdentifier(attestationArg.serviceId)
|
|
15
|
+
|| !isBoundedIdentifier(attestationArg.operationId)) {
|
|
16
|
+
errors.push('retention attestation service and operation IDs must be bounded identifiers');
|
|
17
|
+
}
|
|
18
|
+
if (!isCanonicalDigest(attestationArg.adoptionConfigurationDigest)) {
|
|
19
|
+
errors.push('retention attestation configuration digest must be canonical');
|
|
20
|
+
}
|
|
21
|
+
if (!Number.isSafeInteger(attestationArg.attestedAt) || attestationArg.attestedAt < 1) {
|
|
22
|
+
errors.push('retention attestation timestamp must be a positive integer');
|
|
23
|
+
}
|
|
24
|
+
if (!isRecord(attestationArg.immutableReport)) {
|
|
25
|
+
errors.push('retention attestation requires an immutable report envelope');
|
|
26
|
+
}
|
|
27
|
+
if (!Array.isArray(attestationArg.deployments) || attestationArg.deployments.length < 1) {
|
|
28
|
+
errors.push('retention attestation requires at least one deployment');
|
|
29
|
+
}
|
|
30
|
+
else if (attestationArg.deployments.some((deploymentArg) => (!isRecord(deploymentArg)
|
|
31
|
+
|| deploymentArg.serviceId !== attestationArg.serviceId))) {
|
|
32
|
+
errors.push('retention attestation deployments must belong to the exact service');
|
|
33
|
+
}
|
|
34
|
+
return errors;
|
|
35
|
+
};
|
|
2
36
|
const boundaryIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
37
|
+
const immutableSemverReleaseTagRegex = /^(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*))*)?$/;
|
|
3
38
|
const indexMediaTypes = new Set([
|
|
4
39
|
'application/vnd.oci.image.index.v1+json',
|
|
5
40
|
'application/vnd.docker.distribution.manifest.list.v2+json',
|
|
@@ -26,6 +61,12 @@ const isRecord = (valueArg) => Boolean(valueArg) && typeof valueArg === 'object'
|
|
|
26
61
|
const isBoundedIdentifier = (valueArg) => typeof valueArg === 'string' && boundaryIdentifierRegex.test(valueArg);
|
|
27
62
|
const isCanonicalDigest = (valueArg) => Boolean(normalizeSha256Digest(valueArg)) && normalizeSha256Digest(valueArg) === valueArg;
|
|
28
63
|
const isNonNegativeInteger = (valueArg) => Number.isSafeInteger(valueArg) && valueArg >= 0;
|
|
64
|
+
export const normalizeServiceDeploymentAdoptionReleaseTag = (tagArg) => {
|
|
65
|
+
const normalizedTag = normalizeImmutableReleaseTag(tagArg);
|
|
66
|
+
return normalizedTag && immutableSemverReleaseTagRegex.test(normalizedTag)
|
|
67
|
+
? normalizedTag
|
|
68
|
+
: undefined;
|
|
69
|
+
};
|
|
29
70
|
export const validateServiceDeploymentAdoptionPreflightInput = (inputArg) => {
|
|
30
71
|
if (!isRecord(inputArg))
|
|
31
72
|
return ['adoption preflight input must be an object'];
|
|
@@ -52,6 +93,175 @@ export const validateServiceDeploymentAdoptionInput = (inputArg) => {
|
|
|
52
93
|
}
|
|
53
94
|
return errors;
|
|
54
95
|
};
|
|
96
|
+
export const validateServiceDeploymentAdoptionImagePromotionInput = (inputArg) => {
|
|
97
|
+
const errors = validateServiceDeploymentAdoptionPreflightInput(inputArg);
|
|
98
|
+
if (!isRecord(inputArg))
|
|
99
|
+
return errors;
|
|
100
|
+
if (!normalizeServiceDeploymentAdoptionReleaseTag(inputArg.targetReleaseTag)) {
|
|
101
|
+
errors.push('targetReleaseTag must be a canonical OCI-safe semantic version tag');
|
|
102
|
+
}
|
|
103
|
+
if (!isBoundedIdentifier(inputArg.idempotencyKey)) {
|
|
104
|
+
errors.push('idempotencyKey must be a bounded canonical identifier');
|
|
105
|
+
}
|
|
106
|
+
if (inputArg.expectedSourceImageDigest !== undefined
|
|
107
|
+
&& !isCanonicalDigest(inputArg.expectedSourceImageDigest)) {
|
|
108
|
+
errors.push('expectedSourceImageDigest must be a canonical sha256 digest when provided');
|
|
109
|
+
}
|
|
110
|
+
return errors;
|
|
111
|
+
};
|
|
112
|
+
export const validateServiceDeploymentAdoptionImagePromotionResult = (resultArg) => {
|
|
113
|
+
if (!isRecord(resultArg))
|
|
114
|
+
return ['adoption image promotion result must be an object'];
|
|
115
|
+
const errors = [];
|
|
116
|
+
if (resultArg.status !== 'promoted' && resultArg.status !== 'already-promoted') {
|
|
117
|
+
errors.push('status must identify a promoted or already-promoted result');
|
|
118
|
+
}
|
|
119
|
+
for (const key of ['organizationId', 'serviceId', 'releaseId']) {
|
|
120
|
+
if (!isBoundedIdentifier(resultArg[key])) {
|
|
121
|
+
errors.push(`${key} must be a bounded canonical identifier`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (typeof resultArg.sourceTag !== 'string'
|
|
125
|
+
|| resultArg.sourceTag.trim() !== resultArg.sourceTag
|
|
126
|
+
|| resultArg.sourceTag.length < 1
|
|
127
|
+
|| resultArg.sourceTag.length > 128) {
|
|
128
|
+
errors.push('sourceTag must be a bounded canonical registry tag');
|
|
129
|
+
}
|
|
130
|
+
if (!normalizeServiceDeploymentAdoptionReleaseTag(resultArg.releaseTag)) {
|
|
131
|
+
errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
|
|
132
|
+
}
|
|
133
|
+
if (typeof resultArg.registryHost !== 'string'
|
|
134
|
+
|| resultArg.registryHost.trim() !== resultArg.registryHost
|
|
135
|
+
|| !resultArg.registryHost) {
|
|
136
|
+
errors.push('registryHost must be a non-empty canonical string');
|
|
137
|
+
}
|
|
138
|
+
if (typeof resultArg.repository !== 'string'
|
|
139
|
+
|| resultArg.repository.trim() !== resultArg.repository
|
|
140
|
+
|| !resultArg.repository) {
|
|
141
|
+
errors.push('repository must be a non-empty canonical string');
|
|
142
|
+
}
|
|
143
|
+
if (!isCanonicalDigest(resultArg.digest)) {
|
|
144
|
+
errors.push('digest must be a canonical sha256 digest');
|
|
145
|
+
}
|
|
146
|
+
if (!indexMediaTypes.has(resultArg.mediaType)) {
|
|
147
|
+
errors.push('mediaType must identify an OCI image index');
|
|
148
|
+
}
|
|
149
|
+
if (!Array.isArray(resultArg.platforms)) {
|
|
150
|
+
errors.push('platforms must contain OCI platform evidence');
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
for (const architecture of ['amd64', 'arm64']) {
|
|
154
|
+
if (!resultArg.platforms.some((platformArg) => isRecord(platformArg)
|
|
155
|
+
&& platformArg.os === 'linux'
|
|
156
|
+
&& platformArg.architecture === architecture
|
|
157
|
+
&& platformArg.runnable === true
|
|
158
|
+
&& platformArg.manifestPresent === true
|
|
159
|
+
&& isCanonicalDigest(platformArg.digest))) {
|
|
160
|
+
errors.push(`platforms must contain runnable linux/${architecture} evidence`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (isCanonicalDigest(resultArg.digest)
|
|
165
|
+
&& typeof resultArg.registryHost === 'string'
|
|
166
|
+
&& typeof resultArg.repository === 'string'
|
|
167
|
+
&& resultArg.digestPinnedImageReference
|
|
168
|
+
!== `${resultArg.registryHost}/${resultArg.repository}@${resultArg.digest}`) {
|
|
169
|
+
errors.push('digestPinnedImageReference must bind the exact registry digest');
|
|
170
|
+
}
|
|
171
|
+
return errors;
|
|
172
|
+
};
|
|
173
|
+
export const validateServiceDeploymentAdoptionRolloutInput = (inputArg) => {
|
|
174
|
+
const errors = validateServiceDeploymentAdoptionPreflightInput(inputArg);
|
|
175
|
+
if (!isRecord(inputArg))
|
|
176
|
+
return errors;
|
|
177
|
+
if (!normalizeServiceDeploymentAdoptionReleaseTag(inputArg.releaseTag)) {
|
|
178
|
+
errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
|
|
179
|
+
}
|
|
180
|
+
if (!isCanonicalDigest(inputArg.expectedTargetImageDigest)) {
|
|
181
|
+
errors.push('expectedTargetImageDigest must be a canonical sha256 digest');
|
|
182
|
+
}
|
|
183
|
+
if (!isBoundedIdentifier(inputArg.idempotencyKey)) {
|
|
184
|
+
errors.push('idempotencyKey must be a bounded canonical identifier');
|
|
185
|
+
}
|
|
186
|
+
return errors;
|
|
187
|
+
};
|
|
188
|
+
export const validateServiceDeploymentAdoptionRolloutResult = (resultArg) => {
|
|
189
|
+
if (!isRecord(resultArg))
|
|
190
|
+
return ['adoption rollout result must be an object'];
|
|
191
|
+
const errors = [];
|
|
192
|
+
if (![
|
|
193
|
+
'rollout-started',
|
|
194
|
+
'rollout-in-progress',
|
|
195
|
+
'rollout-succeeded',
|
|
196
|
+
'rollout-failed',
|
|
197
|
+
].includes(resultArg.status)) {
|
|
198
|
+
errors.push('status must identify a supported adoption rollout state');
|
|
199
|
+
}
|
|
200
|
+
if (typeof resultArg.idempotentReplay !== 'boolean') {
|
|
201
|
+
errors.push('idempotentReplay must be boolean');
|
|
202
|
+
}
|
|
203
|
+
for (const key of ['operationId', 'organizationId', 'serviceId', 'releaseId']) {
|
|
204
|
+
if (!isBoundedIdentifier(resultArg[key]))
|
|
205
|
+
errors.push(`${key} must be a bounded identifier`);
|
|
206
|
+
}
|
|
207
|
+
if (!normalizeServiceDeploymentAdoptionReleaseTag(resultArg.releaseTag)) {
|
|
208
|
+
errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
|
|
209
|
+
}
|
|
210
|
+
if (!isCanonicalDigest(resultArg.digest)) {
|
|
211
|
+
errors.push('digest must be a canonical sha256 digest');
|
|
212
|
+
}
|
|
213
|
+
if (!isRecord(resultArg.plan)) {
|
|
214
|
+
errors.push('plan must be present');
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
errors.push(...validateImmutableImageDeploymentPlan(resultArg.plan).map((errorArg) => `plan: ${errorArg}`));
|
|
218
|
+
if (resultArg.plan.operationId !== resultArg.operationId
|
|
219
|
+
|| resultArg.plan.releaseId !== resultArg.releaseId
|
|
220
|
+
|| resultArg.plan.releaseTag !== resultArg.releaseTag
|
|
221
|
+
|| resultArg.plan.requestedDigest !== resultArg.digest
|
|
222
|
+
|| resultArg.plan.registryHost !== resultArg.registryHost
|
|
223
|
+
|| resultArg.plan.repository !== resultArg.repository
|
|
224
|
+
|| resultArg.plan.mode !== 'promotion'
|
|
225
|
+
|| resultArg.plan.rolloutGeneration !== 1) {
|
|
226
|
+
errors.push('plan must bind the exact generation-one adoption rollout result');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (!isRecord(resultArg.rolloutStatus)) {
|
|
230
|
+
errors.push('rolloutStatus must be present');
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
errors.push(...validateImageRolloutStatus(resultArg.rolloutStatus).map((errorArg) => `rolloutStatus: ${errorArg}`));
|
|
234
|
+
if (isRecord(resultArg.plan)
|
|
235
|
+
&& (resultArg.rolloutStatus.rolloutId !== resultArg.plan.rolloutId
|
|
236
|
+
|| resultArg.rolloutStatus.rolloutGeneration !== resultArg.plan.rolloutGeneration
|
|
237
|
+
|| resultArg.rolloutStatus.expectedDigest !== resultArg.digest)) {
|
|
238
|
+
errors.push('rolloutStatus must bind the exact adoption rollout plan');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (isRecord(resultArg.rolloutStatus)) {
|
|
242
|
+
const rolloutStatus = resultArg.rolloutStatus.status;
|
|
243
|
+
const successful = rolloutStatus === 'succeeded';
|
|
244
|
+
const failed = rolloutStatus === 'failed'
|
|
245
|
+
|| rolloutStatus === 'mismatched'
|
|
246
|
+
|| rolloutStatus === 'rolling-back'
|
|
247
|
+
|| rolloutStatus === 'rolled-back';
|
|
248
|
+
if ((resultArg.status === 'rollout-succeeded') !== successful) {
|
|
249
|
+
errors.push('rollout-succeeded must exactly match a succeeded rolloutStatus');
|
|
250
|
+
}
|
|
251
|
+
if ((resultArg.status === 'rollout-failed') !== failed) {
|
|
252
|
+
errors.push('rollout-failed must exactly match a failed or mismatched rolloutStatus');
|
|
253
|
+
}
|
|
254
|
+
if ((resultArg.status === 'rollout-started' || resultArg.status === 'rollout-in-progress')
|
|
255
|
+
&& (successful || failed)) {
|
|
256
|
+
errors.push('an active rollout result must not contain a terminal rolloutStatus');
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (typeof resultArg.registryHost !== 'string' || !resultArg.registryHost
|
|
260
|
+
|| typeof resultArg.repository !== 'string' || !resultArg.repository) {
|
|
261
|
+
errors.push('registryHost and repository must be non-empty strings');
|
|
262
|
+
}
|
|
263
|
+
return errors;
|
|
264
|
+
};
|
|
55
265
|
export const validateServiceDeploymentAdoptionReport = (reportArg) => {
|
|
56
266
|
if (!isRecord(reportArg))
|
|
57
267
|
return ['adoption report must be an object'];
|
|
@@ -303,4 +513,4 @@ export const validateServiceDeploymentAdoptionReport = (reportArg) => {
|
|
|
303
513
|
}
|
|
304
514
|
return errors;
|
|
305
515
|
};
|
|
306
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudGFkb3B0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9kZXBsb3ltZW50YWRvcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFpSTFGLE1BQU0sdUJBQXVCLEdBQUcscUNBQXFDLENBQUM7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQXdCO0lBQ3JELHlDQUF5QztJQUN6QywyREFBMkQ7Q0FDNUQsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBd0M7SUFDMUUsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsNEJBQTRCO0lBQzVCLDJCQUEyQjtJQUMzQix3QkFBd0I7SUFDeEIseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1Qix5QkFBeUI7SUFDekIsb0JBQW9CO0lBQ3BCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLDBCQUEwQjtJQUMxQixnQ0FBZ0M7SUFDaEMseUJBQXlCO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBaUIsRUFBdUMsRUFBRSxDQUMxRSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVoRixNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUNwRSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXpFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFpQixFQUE2QixFQUFFLENBQ3pFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMs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
|
|
516
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudGFkb3B0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9kZXBsb3ltZW50YWRvcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUEsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLG9DQUFvQyxHQUNyQyxNQUFNLHFCQUFxQixDQUFDO0FBcU03QixNQUFNLENBQUMsTUFBTSxxREFBcUQsR0FBRyxDQUNuRSxjQUF1QixFQUNiLEVBQUU7SUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUFFLE9BQU8sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLGNBQWMsQ0FBQyxhQUFhLEtBQUssQ0FBQztRQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNyRyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUUsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxJQUFJLGNBQWMsQ0FBQyx1QkFBdUIsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1dBQzdDLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDdEQsTUFBTSxDQUFDLElBQUksQ0FBQyw2RUFBNkUsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQztRQUNuRSxN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
|
|
@@ -3,6 +3,7 @@ import type { IDeployment } from '../data/deployment.js';
|
|
|
3
3
|
import type { IService } from '../data/service.js';
|
|
4
4
|
import type { IIdentity } from '../data/user.js';
|
|
5
5
|
import type { IImmutableRolloutReportEnvelope } from '../data/immutableimage.js';
|
|
6
|
+
import type { IServiceDeploymentAdoptionRetentionAttestation, TServiceDeploymentAdoptionRetentionPhase } from '../data/deploymentadoption.js';
|
|
6
7
|
export interface IDeploymentWorkspaceFileEntry {
|
|
7
8
|
type: 'file' | 'directory';
|
|
8
9
|
name: string;
|
|
@@ -199,6 +200,17 @@ export interface IReq_Cloudly_Coreflow_GetServiceDeployments extends plugins.typ
|
|
|
199
200
|
deployments: IDeployment[];
|
|
200
201
|
};
|
|
201
202
|
}
|
|
203
|
+
export interface IReq_Cloudly_Coreflow_AttestServiceDeploymentAdoption extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Cloudly_Coreflow_AttestServiceDeploymentAdoption> {
|
|
204
|
+
method: 'coreflowAttestServiceDeploymentAdoption';
|
|
205
|
+
request: {
|
|
206
|
+
phase: TServiceDeploymentAdoptionRetentionPhase;
|
|
207
|
+
service: IService;
|
|
208
|
+
};
|
|
209
|
+
response: {
|
|
210
|
+
found: boolean;
|
|
211
|
+
attestation?: IServiceDeploymentAdoptionRetentionAttestation;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
202
214
|
export interface IReq_Cloudly_Coreflow_RestartDeployment extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Cloudly_Coreflow_RestartDeployment> {
|
|
203
215
|
method: 'coreflowRestartDeployment';
|
|
204
216
|
request: {
|
|
@@ -7,7 +7,25 @@ import type { IImageRelease } from '../data/immutableimage.js';
|
|
|
7
7
|
import type { IDeploymentPreflightReport, IDeploymentPreflightRequestData } from '../data/deploymentpreflight.js';
|
|
8
8
|
import type { IDeploymentReservationInput, IServiceDeploymentOperation, IServiceDeploymentStatus } from '../data/deploymentoperation.js';
|
|
9
9
|
import type { TSha256Digest } from '../data/immutableimage.js';
|
|
10
|
-
import type { IServiceDeploymentAdoptionInput, IServiceDeploymentAdoptionPreflightInput, IServiceDeploymentAdoptionReport, IServiceDeploymentAdoptionResult } from '../data/deploymentadoption.js';
|
|
10
|
+
import type { IServiceDeploymentAdoptionInput, IServiceDeploymentAdoptionImagePromotionInput, IServiceDeploymentAdoptionImagePromotionResult, IServiceDeploymentAdoptionRolloutInput, IServiceDeploymentAdoptionRolloutResult, IServiceDeploymentAdoptionPreflightInput, IServiceDeploymentAdoptionReport, IServiceDeploymentAdoptionResult } from '../data/deploymentadoption.js';
|
|
11
|
+
export interface IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout> {
|
|
12
|
+
method: 'bootstrapServiceDeploymentAdoptionRollout';
|
|
13
|
+
request: IServiceDeploymentAdoptionRolloutInput & {
|
|
14
|
+
identity: IIdentityCredential;
|
|
15
|
+
};
|
|
16
|
+
response: {
|
|
17
|
+
result: IServiceDeploymentAdoptionRolloutResult;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface IRequest_Any_Cloudly_PromoteServiceDeploymentAdoptionImage extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_PromoteServiceDeploymentAdoptionImage> {
|
|
21
|
+
method: 'promoteServiceDeploymentAdoptionImage';
|
|
22
|
+
request: IServiceDeploymentAdoptionImagePromotionInput & {
|
|
23
|
+
identity: IIdentityCredential;
|
|
24
|
+
};
|
|
25
|
+
response: {
|
|
26
|
+
result: IServiceDeploymentAdoptionImagePromotionResult;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
11
29
|
export interface IRequest_Any_Cloudly_GetServiceDeploymentAdoptionPreflight extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_GetServiceDeploymentAdoptionPreflight> {
|
|
12
30
|
method: 'getServiceDeploymentAdoptionPreflight';
|
|
13
31
|
request: IServiceDeploymentAdoptionPreflightInput & {
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -2,13 +2,21 @@ import type {
|
|
|
2
2
|
IDeploymentPreflightRuntimeTask,
|
|
3
3
|
IOciPlatformDescriptorSummary,
|
|
4
4
|
} from './deploymentpreflight.js';
|
|
5
|
+
import type { IDeployment } from './deployment.js';
|
|
5
6
|
import type {
|
|
7
|
+
IImageRolloutStatus,
|
|
6
8
|
IImmutableImageDeploymentPlan,
|
|
9
|
+
IImmutableRolloutReportEnvelope,
|
|
7
10
|
IImmutableImageTargetScope,
|
|
8
11
|
TOciManifestMediaType,
|
|
9
12
|
TSha256Digest,
|
|
10
13
|
} from './immutableimage.js';
|
|
11
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
normalizeImmutableReleaseTag,
|
|
16
|
+
normalizeSha256Digest,
|
|
17
|
+
validateImageRolloutStatus,
|
|
18
|
+
validateImmutableImageDeploymentPlan,
|
|
19
|
+
} from './immutableimage.js';
|
|
12
20
|
import type { IRegistryTarget } from './registry.js';
|
|
13
21
|
|
|
14
22
|
export type TServiceDeploymentAdoptionDecision = 'GO' | 'NO-GO';
|
|
@@ -56,6 +64,56 @@ extends IServiceDeploymentAdoptionPreflightInput {
|
|
|
56
64
|
expectedAdoptionDigest: TServiceDeploymentAdoptionDigest;
|
|
57
65
|
}
|
|
58
66
|
|
|
67
|
+
export interface IServiceDeploymentAdoptionImagePromotionInput
|
|
68
|
+
extends IServiceDeploymentAdoptionPreflightInput {
|
|
69
|
+
targetReleaseTag: string;
|
|
70
|
+
expectedSourceImageDigest?: TSha256Digest;
|
|
71
|
+
idempotencyKey: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface IServiceDeploymentAdoptionImagePromotionResult {
|
|
75
|
+
status: 'promoted' | 'already-promoted';
|
|
76
|
+
organizationId: string;
|
|
77
|
+
serviceId: string;
|
|
78
|
+
sourceTag: string;
|
|
79
|
+
releaseTag: string;
|
|
80
|
+
registryHost: string;
|
|
81
|
+
repository: string;
|
|
82
|
+
digest: TSha256Digest;
|
|
83
|
+
mediaType:
|
|
84
|
+
| 'application/vnd.oci.image.index.v1+json'
|
|
85
|
+
| 'application/vnd.docker.distribution.manifest.list.v2+json';
|
|
86
|
+
platforms: IOciPlatformDescriptorSummary[];
|
|
87
|
+
releaseId: string;
|
|
88
|
+
digestPinnedImageReference: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface IServiceDeploymentAdoptionRolloutInput
|
|
92
|
+
extends IServiceDeploymentAdoptionPreflightInput {
|
|
93
|
+
releaseTag: string;
|
|
94
|
+
expectedTargetImageDigest: TSha256Digest;
|
|
95
|
+
idempotencyKey: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface IServiceDeploymentAdoptionRolloutResult {
|
|
99
|
+
status:
|
|
100
|
+
| 'rollout-started'
|
|
101
|
+
| 'rollout-in-progress'
|
|
102
|
+
| 'rollout-succeeded'
|
|
103
|
+
| 'rollout-failed';
|
|
104
|
+
idempotentReplay: boolean;
|
|
105
|
+
operationId: string;
|
|
106
|
+
organizationId: string;
|
|
107
|
+
serviceId: string;
|
|
108
|
+
registryHost: string;
|
|
109
|
+
repository: string;
|
|
110
|
+
releaseTag: string;
|
|
111
|
+
digest: TSha256Digest;
|
|
112
|
+
releaseId: string;
|
|
113
|
+
plan: IImmutableImageDeploymentPlan;
|
|
114
|
+
rolloutStatus: IImageRolloutStatus;
|
|
115
|
+
}
|
|
116
|
+
|
|
59
117
|
interface IServiceDeploymentAdoptionReportBase {
|
|
60
118
|
schemaVersion: 1;
|
|
61
119
|
mutationPerformed: false;
|
|
@@ -137,7 +195,62 @@ export interface IServiceDeploymentAdoptionResult {
|
|
|
137
195
|
plan: IImmutableImageDeploymentPlan;
|
|
138
196
|
}
|
|
139
197
|
|
|
198
|
+
export type TServiceDeploymentAdoptionRetentionPhase = 'prepare' | 'commit';
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* A session-bound Coreflow assertion that its local live runtime can be
|
|
202
|
+
* retained for the exact adoption plan without mutating the Docker service.
|
|
203
|
+
*/
|
|
204
|
+
export interface IServiceDeploymentAdoptionRetentionAttestation {
|
|
205
|
+
schemaVersion: 1;
|
|
206
|
+
phase: TServiceDeploymentAdoptionRetentionPhase;
|
|
207
|
+
retainedWithoutMutation: true;
|
|
208
|
+
serviceId: string;
|
|
209
|
+
operationId: string;
|
|
210
|
+
adoptionConfigurationDigest: TSha256Digest;
|
|
211
|
+
immutableReport: IImmutableRolloutReportEnvelope;
|
|
212
|
+
deployments: IDeployment[];
|
|
213
|
+
attestedAt: number;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export const validateServiceDeploymentAdoptionRetentionAttestation = (
|
|
217
|
+
attestationArg: unknown,
|
|
218
|
+
): string[] => {
|
|
219
|
+
if (!isRecord(attestationArg)) return ['retention attestation must be an object'];
|
|
220
|
+
const errors: string[] = [];
|
|
221
|
+
if (attestationArg.schemaVersion !== 1) errors.push('retention attestation schemaVersion must be 1');
|
|
222
|
+
if (attestationArg.phase !== 'prepare' && attestationArg.phase !== 'commit') {
|
|
223
|
+
errors.push('retention attestation phase is invalid');
|
|
224
|
+
}
|
|
225
|
+
if (attestationArg.retainedWithoutMutation !== true) {
|
|
226
|
+
errors.push('retention attestation must assert mutation-free retention');
|
|
227
|
+
}
|
|
228
|
+
if (!isBoundedIdentifier(attestationArg.serviceId)
|
|
229
|
+
|| !isBoundedIdentifier(attestationArg.operationId)) {
|
|
230
|
+
errors.push('retention attestation service and operation IDs must be bounded identifiers');
|
|
231
|
+
}
|
|
232
|
+
if (!isCanonicalDigest(attestationArg.adoptionConfigurationDigest)) {
|
|
233
|
+
errors.push('retention attestation configuration digest must be canonical');
|
|
234
|
+
}
|
|
235
|
+
if (!Number.isSafeInteger(attestationArg.attestedAt) || (attestationArg.attestedAt as number) < 1) {
|
|
236
|
+
errors.push('retention attestation timestamp must be a positive integer');
|
|
237
|
+
}
|
|
238
|
+
if (!isRecord(attestationArg.immutableReport)) {
|
|
239
|
+
errors.push('retention attestation requires an immutable report envelope');
|
|
240
|
+
}
|
|
241
|
+
if (!Array.isArray(attestationArg.deployments) || attestationArg.deployments.length < 1) {
|
|
242
|
+
errors.push('retention attestation requires at least one deployment');
|
|
243
|
+
} else if (attestationArg.deployments.some((deploymentArg) => (
|
|
244
|
+
!isRecord(deploymentArg)
|
|
245
|
+
|| deploymentArg.serviceId !== attestationArg.serviceId
|
|
246
|
+
))) {
|
|
247
|
+
errors.push('retention attestation deployments must belong to the exact service');
|
|
248
|
+
}
|
|
249
|
+
return errors;
|
|
250
|
+
};
|
|
251
|
+
|
|
140
252
|
const boundaryIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
253
|
+
const immutableSemverReleaseTagRegex = /^(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*))*)?$/;
|
|
141
254
|
const indexMediaTypes = new Set<TOciManifestMediaType>([
|
|
142
255
|
'application/vnd.oci.image.index.v1+json',
|
|
143
256
|
'application/vnd.docker.distribution.manifest.list.v2+json',
|
|
@@ -173,6 +286,15 @@ const isCanonicalDigest = (valueArg: unknown): valueArg is TSha256Digest =>
|
|
|
173
286
|
const isNonNegativeInteger = (valueArg: unknown): valueArg is number =>
|
|
174
287
|
Number.isSafeInteger(valueArg) && (valueArg as number) >= 0;
|
|
175
288
|
|
|
289
|
+
export const normalizeServiceDeploymentAdoptionReleaseTag = (
|
|
290
|
+
tagArg: unknown,
|
|
291
|
+
): string | undefined => {
|
|
292
|
+
const normalizedTag = normalizeImmutableReleaseTag(tagArg);
|
|
293
|
+
return normalizedTag && immutableSemverReleaseTagRegex.test(normalizedTag)
|
|
294
|
+
? normalizedTag
|
|
295
|
+
: undefined;
|
|
296
|
+
};
|
|
297
|
+
|
|
176
298
|
export const validateServiceDeploymentAdoptionPreflightInput = (
|
|
177
299
|
inputArg: unknown,
|
|
178
300
|
): string[] => {
|
|
@@ -201,6 +323,183 @@ export const validateServiceDeploymentAdoptionInput = (inputArg: unknown): strin
|
|
|
201
323
|
return errors;
|
|
202
324
|
};
|
|
203
325
|
|
|
326
|
+
export const validateServiceDeploymentAdoptionImagePromotionInput = (
|
|
327
|
+
inputArg: unknown,
|
|
328
|
+
): string[] => {
|
|
329
|
+
const errors = validateServiceDeploymentAdoptionPreflightInput(inputArg);
|
|
330
|
+
if (!isRecord(inputArg)) return errors;
|
|
331
|
+
if (!normalizeServiceDeploymentAdoptionReleaseTag(inputArg.targetReleaseTag)) {
|
|
332
|
+
errors.push('targetReleaseTag must be a canonical OCI-safe semantic version tag');
|
|
333
|
+
}
|
|
334
|
+
if (!isBoundedIdentifier(inputArg.idempotencyKey)) {
|
|
335
|
+
errors.push('idempotencyKey must be a bounded canonical identifier');
|
|
336
|
+
}
|
|
337
|
+
if (inputArg.expectedSourceImageDigest !== undefined
|
|
338
|
+
&& !isCanonicalDigest(inputArg.expectedSourceImageDigest)) {
|
|
339
|
+
errors.push('expectedSourceImageDigest must be a canonical sha256 digest when provided');
|
|
340
|
+
}
|
|
341
|
+
return errors;
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
export const validateServiceDeploymentAdoptionImagePromotionResult = (
|
|
345
|
+
resultArg: unknown,
|
|
346
|
+
): string[] => {
|
|
347
|
+
if (!isRecord(resultArg)) return ['adoption image promotion result must be an object'];
|
|
348
|
+
const errors: string[] = [];
|
|
349
|
+
if (resultArg.status !== 'promoted' && resultArg.status !== 'already-promoted') {
|
|
350
|
+
errors.push('status must identify a promoted or already-promoted result');
|
|
351
|
+
}
|
|
352
|
+
for (const key of ['organizationId', 'serviceId', 'releaseId'] as const) {
|
|
353
|
+
if (!isBoundedIdentifier(resultArg[key])) {
|
|
354
|
+
errors.push(`${key} must be a bounded canonical identifier`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (typeof resultArg.sourceTag !== 'string'
|
|
358
|
+
|| resultArg.sourceTag.trim() !== resultArg.sourceTag
|
|
359
|
+
|| resultArg.sourceTag.length < 1
|
|
360
|
+
|| resultArg.sourceTag.length > 128) {
|
|
361
|
+
errors.push('sourceTag must be a bounded canonical registry tag');
|
|
362
|
+
}
|
|
363
|
+
if (!normalizeServiceDeploymentAdoptionReleaseTag(resultArg.releaseTag)) {
|
|
364
|
+
errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
|
|
365
|
+
}
|
|
366
|
+
if (typeof resultArg.registryHost !== 'string'
|
|
367
|
+
|| resultArg.registryHost.trim() !== resultArg.registryHost
|
|
368
|
+
|| !resultArg.registryHost) {
|
|
369
|
+
errors.push('registryHost must be a non-empty canonical string');
|
|
370
|
+
}
|
|
371
|
+
if (typeof resultArg.repository !== 'string'
|
|
372
|
+
|| resultArg.repository.trim() !== resultArg.repository
|
|
373
|
+
|| !resultArg.repository) {
|
|
374
|
+
errors.push('repository must be a non-empty canonical string');
|
|
375
|
+
}
|
|
376
|
+
if (!isCanonicalDigest(resultArg.digest)) {
|
|
377
|
+
errors.push('digest must be a canonical sha256 digest');
|
|
378
|
+
}
|
|
379
|
+
if (!indexMediaTypes.has(resultArg.mediaType as TOciManifestMediaType)) {
|
|
380
|
+
errors.push('mediaType must identify an OCI image index');
|
|
381
|
+
}
|
|
382
|
+
if (!Array.isArray(resultArg.platforms)) {
|
|
383
|
+
errors.push('platforms must contain OCI platform evidence');
|
|
384
|
+
} else {
|
|
385
|
+
for (const architecture of ['amd64', 'arm64']) {
|
|
386
|
+
if (!resultArg.platforms.some((platformArg) => isRecord(platformArg)
|
|
387
|
+
&& platformArg.os === 'linux'
|
|
388
|
+
&& platformArg.architecture === architecture
|
|
389
|
+
&& platformArg.runnable === true
|
|
390
|
+
&& platformArg.manifestPresent === true
|
|
391
|
+
&& isCanonicalDigest(platformArg.digest))) {
|
|
392
|
+
errors.push(`platforms must contain runnable linux/${architecture} evidence`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
if (isCanonicalDigest(resultArg.digest)
|
|
397
|
+
&& typeof resultArg.registryHost === 'string'
|
|
398
|
+
&& typeof resultArg.repository === 'string'
|
|
399
|
+
&& resultArg.digestPinnedImageReference
|
|
400
|
+
!== `${resultArg.registryHost}/${resultArg.repository}@${resultArg.digest}`) {
|
|
401
|
+
errors.push('digestPinnedImageReference must bind the exact registry digest');
|
|
402
|
+
}
|
|
403
|
+
return errors;
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
export const validateServiceDeploymentAdoptionRolloutInput = (
|
|
407
|
+
inputArg: unknown,
|
|
408
|
+
): string[] => {
|
|
409
|
+
const errors = validateServiceDeploymentAdoptionPreflightInput(inputArg);
|
|
410
|
+
if (!isRecord(inputArg)) return errors;
|
|
411
|
+
if (!normalizeServiceDeploymentAdoptionReleaseTag(inputArg.releaseTag)) {
|
|
412
|
+
errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
|
|
413
|
+
}
|
|
414
|
+
if (!isCanonicalDigest(inputArg.expectedTargetImageDigest)) {
|
|
415
|
+
errors.push('expectedTargetImageDigest must be a canonical sha256 digest');
|
|
416
|
+
}
|
|
417
|
+
if (!isBoundedIdentifier(inputArg.idempotencyKey)) {
|
|
418
|
+
errors.push('idempotencyKey must be a bounded canonical identifier');
|
|
419
|
+
}
|
|
420
|
+
return errors;
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
export const validateServiceDeploymentAdoptionRolloutResult = (
|
|
424
|
+
resultArg: unknown,
|
|
425
|
+
): string[] => {
|
|
426
|
+
if (!isRecord(resultArg)) return ['adoption rollout result must be an object'];
|
|
427
|
+
const errors: string[] = [];
|
|
428
|
+
if (![
|
|
429
|
+
'rollout-started',
|
|
430
|
+
'rollout-in-progress',
|
|
431
|
+
'rollout-succeeded',
|
|
432
|
+
'rollout-failed',
|
|
433
|
+
].includes(resultArg.status as string)) {
|
|
434
|
+
errors.push('status must identify a supported adoption rollout state');
|
|
435
|
+
}
|
|
436
|
+
if (typeof resultArg.idempotentReplay !== 'boolean') {
|
|
437
|
+
errors.push('idempotentReplay must be boolean');
|
|
438
|
+
}
|
|
439
|
+
for (const key of ['operationId', 'organizationId', 'serviceId', 'releaseId'] as const) {
|
|
440
|
+
if (!isBoundedIdentifier(resultArg[key])) errors.push(`${key} must be a bounded identifier`);
|
|
441
|
+
}
|
|
442
|
+
if (!normalizeServiceDeploymentAdoptionReleaseTag(resultArg.releaseTag)) {
|
|
443
|
+
errors.push('releaseTag must be a canonical OCI-safe semantic version tag');
|
|
444
|
+
}
|
|
445
|
+
if (!isCanonicalDigest(resultArg.digest)) {
|
|
446
|
+
errors.push('digest must be a canonical sha256 digest');
|
|
447
|
+
}
|
|
448
|
+
if (!isRecord(resultArg.plan)) {
|
|
449
|
+
errors.push('plan must be present');
|
|
450
|
+
} else {
|
|
451
|
+
errors.push(...validateImmutableImageDeploymentPlan(
|
|
452
|
+
resultArg.plan as unknown as IImmutableImageDeploymentPlan,
|
|
453
|
+
).map((errorArg) => `plan: ${errorArg}`));
|
|
454
|
+
if (resultArg.plan.operationId !== resultArg.operationId
|
|
455
|
+
|| resultArg.plan.releaseId !== resultArg.releaseId
|
|
456
|
+
|| resultArg.plan.releaseTag !== resultArg.releaseTag
|
|
457
|
+
|| resultArg.plan.requestedDigest !== resultArg.digest
|
|
458
|
+
|| resultArg.plan.registryHost !== resultArg.registryHost
|
|
459
|
+
|| resultArg.plan.repository !== resultArg.repository
|
|
460
|
+
|| resultArg.plan.mode !== 'promotion'
|
|
461
|
+
|| resultArg.plan.rolloutGeneration !== 1) {
|
|
462
|
+
errors.push('plan must bind the exact generation-one adoption rollout result');
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
if (!isRecord(resultArg.rolloutStatus)) {
|
|
466
|
+
errors.push('rolloutStatus must be present');
|
|
467
|
+
} else {
|
|
468
|
+
errors.push(...validateImageRolloutStatus(
|
|
469
|
+
resultArg.rolloutStatus as unknown as IImageRolloutStatus,
|
|
470
|
+
).map((errorArg) => `rolloutStatus: ${errorArg}`));
|
|
471
|
+
if (isRecord(resultArg.plan)
|
|
472
|
+
&& (resultArg.rolloutStatus.rolloutId !== resultArg.plan.rolloutId
|
|
473
|
+
|| resultArg.rolloutStatus.rolloutGeneration !== resultArg.plan.rolloutGeneration
|
|
474
|
+
|| resultArg.rolloutStatus.expectedDigest !== resultArg.digest)) {
|
|
475
|
+
errors.push('rolloutStatus must bind the exact adoption rollout plan');
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
if (isRecord(resultArg.rolloutStatus)) {
|
|
479
|
+
const rolloutStatus = resultArg.rolloutStatus.status;
|
|
480
|
+
const successful = rolloutStatus === 'succeeded';
|
|
481
|
+
const failed = rolloutStatus === 'failed'
|
|
482
|
+
|| rolloutStatus === 'mismatched'
|
|
483
|
+
|| rolloutStatus === 'rolling-back'
|
|
484
|
+
|| rolloutStatus === 'rolled-back';
|
|
485
|
+
if ((resultArg.status === 'rollout-succeeded') !== successful) {
|
|
486
|
+
errors.push('rollout-succeeded must exactly match a succeeded rolloutStatus');
|
|
487
|
+
}
|
|
488
|
+
if ((resultArg.status === 'rollout-failed') !== failed) {
|
|
489
|
+
errors.push('rollout-failed must exactly match a failed or mismatched rolloutStatus');
|
|
490
|
+
}
|
|
491
|
+
if ((resultArg.status === 'rollout-started' || resultArg.status === 'rollout-in-progress')
|
|
492
|
+
&& (successful || failed)) {
|
|
493
|
+
errors.push('an active rollout result must not contain a terminal rolloutStatus');
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if (typeof resultArg.registryHost !== 'string' || !resultArg.registryHost
|
|
497
|
+
|| typeof resultArg.repository !== 'string' || !resultArg.repository) {
|
|
498
|
+
errors.push('registryHost and repository must be non-empty strings');
|
|
499
|
+
}
|
|
500
|
+
return errors;
|
|
501
|
+
};
|
|
502
|
+
|
|
204
503
|
export const validateServiceDeploymentAdoptionReport = (reportArg: unknown): string[] => {
|
|
205
504
|
if (!isRecord(reportArg)) return ['adoption report must be an object'];
|
|
206
505
|
const errors: string[] = [];
|
|
@@ -3,6 +3,10 @@ import type { IDeployment } from '../data/deployment.js';
|
|
|
3
3
|
import type { IService } from '../data/service.js';
|
|
4
4
|
import type { IIdentity } from '../data/user.js';
|
|
5
5
|
import type { IImmutableRolloutReportEnvelope } from '../data/immutableimage.js';
|
|
6
|
+
import type {
|
|
7
|
+
IServiceDeploymentAdoptionRetentionAttestation,
|
|
8
|
+
TServiceDeploymentAdoptionRetentionPhase,
|
|
9
|
+
} from '../data/deploymentadoption.js';
|
|
6
10
|
|
|
7
11
|
export interface IDeploymentWorkspaceFileEntry {
|
|
8
12
|
type: 'file' | 'directory';
|
|
@@ -291,6 +295,22 @@ extends plugins.typedrequestInterfaces.implementsTR<
|
|
|
291
295
|
};
|
|
292
296
|
}
|
|
293
297
|
|
|
298
|
+
export interface IReq_Cloudly_Coreflow_AttestServiceDeploymentAdoption
|
|
299
|
+
extends plugins.typedrequestInterfaces.implementsTR<
|
|
300
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
301
|
+
IReq_Cloudly_Coreflow_AttestServiceDeploymentAdoption
|
|
302
|
+
> {
|
|
303
|
+
method: 'coreflowAttestServiceDeploymentAdoption';
|
|
304
|
+
request: {
|
|
305
|
+
phase: TServiceDeploymentAdoptionRetentionPhase;
|
|
306
|
+
service: IService;
|
|
307
|
+
};
|
|
308
|
+
response: {
|
|
309
|
+
found: boolean;
|
|
310
|
+
attestation?: IServiceDeploymentAdoptionRetentionAttestation;
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
|
|
294
314
|
export interface IReq_Cloudly_Coreflow_RestartDeployment
|
|
295
315
|
extends plugins.typedrequestInterfaces.implementsTR<
|
|
296
316
|
plugins.typedrequestInterfaces.ITypedRequest,
|
package/ts/requests/service.ts
CHANGED
|
@@ -17,11 +17,43 @@ import type {
|
|
|
17
17
|
import type { TSha256Digest } from '../data/immutableimage.js';
|
|
18
18
|
import type {
|
|
19
19
|
IServiceDeploymentAdoptionInput,
|
|
20
|
+
IServiceDeploymentAdoptionImagePromotionInput,
|
|
21
|
+
IServiceDeploymentAdoptionImagePromotionResult,
|
|
22
|
+
IServiceDeploymentAdoptionRolloutInput,
|
|
23
|
+
IServiceDeploymentAdoptionRolloutResult,
|
|
20
24
|
IServiceDeploymentAdoptionPreflightInput,
|
|
21
25
|
IServiceDeploymentAdoptionReport,
|
|
22
26
|
IServiceDeploymentAdoptionResult,
|
|
23
27
|
} from '../data/deploymentadoption.js';
|
|
24
28
|
|
|
29
|
+
export interface IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout
|
|
30
|
+
extends plugins.typedrequestInterfaces.implementsTR<
|
|
31
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
32
|
+
IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout
|
|
33
|
+
> {
|
|
34
|
+
method: 'bootstrapServiceDeploymentAdoptionRollout';
|
|
35
|
+
request: IServiceDeploymentAdoptionRolloutInput & {
|
|
36
|
+
identity: IIdentityCredential;
|
|
37
|
+
};
|
|
38
|
+
response: {
|
|
39
|
+
result: IServiceDeploymentAdoptionRolloutResult;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface IRequest_Any_Cloudly_PromoteServiceDeploymentAdoptionImage
|
|
44
|
+
extends plugins.typedrequestInterfaces.implementsTR<
|
|
45
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
46
|
+
IRequest_Any_Cloudly_PromoteServiceDeploymentAdoptionImage
|
|
47
|
+
> {
|
|
48
|
+
method: 'promoteServiceDeploymentAdoptionImage';
|
|
49
|
+
request: IServiceDeploymentAdoptionImagePromotionInput & {
|
|
50
|
+
identity: IIdentityCredential;
|
|
51
|
+
};
|
|
52
|
+
response: {
|
|
53
|
+
result: IServiceDeploymentAdoptionImagePromotionResult;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
25
57
|
export interface IRequest_Any_Cloudly_GetServiceDeploymentAdoptionPreflight
|
|
26
58
|
extends plugins.typedrequestInterfaces.implementsTR<
|
|
27
59
|
plugins.typedrequestInterfaces.ITypedRequest,
|