@serve.zone/interfaces 32.67.0 → 32.68.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 +12 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/deploymentoperation.d.ts +17 -3
- package/dist_ts/data/deploymentoperation.js +4 -1
- package/dist_ts/data/deploymentreleaseredeploy.d.ts +88 -0
- package/dist_ts/data/deploymentreleaseredeploy.js +120 -0
- package/dist_ts/data/immutableimage.d.ts +17 -3
- package/dist_ts/data/immutableimage.js +18 -1
- package/dist_ts/data/index.d.ts +1 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/user.d.ts +7 -1
- package/dist_ts/data/user.js +6 -1
- package/dist_ts/requests/deployment.d.ts +5 -0
- package/dist_ts/requests/service.d.ts +42 -0
- package/package.json +2 -2
- package/readme.md +9 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/deploymentoperation.ts +21 -2
- package/ts/data/deploymentreleaseredeploy.ts +182 -0
- package/ts/data/immutableimage.ts +36 -3
- package/ts/data/index.ts +1 -0
- package/ts/data/user.ts +12 -1
- package/ts/requests/deployment.ts +5 -0
- package/ts/requests/service.ts +55 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-11-05 - 32.68.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Release redeploy (AGL-394, AGL-403, Linus 2026-11-05 ruling): an existing service deploys one of its own accepted, retained and whole releases again from Cloudly's registry, without a build or a push. `requests.service.IRequest_Any_Cloudly_StartServiceReleaseDeployment` (`startServiceReleaseDeployment`: `serviceId`, `releaseId`, `idempotencyKey`, `expectedRolloutGeneration` at least 1 and the required `expectedCurrentRolloutId`, validated by `data.validateServiceReleaseDeploymentStartInput`) answers the operation Cloudly started and then runs itself; its named refusals are `data.serviceReleaseDeploymentRefusalCodes`. An operation's origin can now be `releaseRedeploy: { sourceReleaseId }` (`data.IReleaseRedeployReference`, `data.validateReleaseRedeployReference`) beside `sourceRevision` and `legacyImport`; a reservation carrying it is refused (`validateDeploymentReservationInput`). A release row's trusted evidence can be `cloudly-release-redeploy` (`data.IImageReleaseRedeployEvidence`: `sourceReleaseId`, `sourceTag`, `sourceRootDigest`), which `selectTrustedImageReleaseEvidence` selects for a redeploy operation only when the release row was accepted before and the evidence names that row, its own root and an earlier tag of it. The redeploy's release tag is its operation id, under `data.releaseRedeployContract.tagPrefix` (`redeploy-`, never a version string; `data.isReleaseRedeployTag`). The capability `deployment:redeploy-release` starts one; administrators hold it implicitly and it is granted on an existing-service grant only.
|
|
8
|
+
- Deployment history: `requests.service.IRequest_Any_Cloudly_GetServiceDeploymentOperations` (`getServiceDeploymentOperations`: `serviceId`, `limit` up to `releaseRedeployContract.historyMaximumLimit`, `before` an operation id) answers one page of a service's deployment operations, newest first, with `nextBefore` (`data.validateServiceDeploymentOperationHistoryQuery`).
|
|
9
|
+
- Readers built before this version: a release row or an operation carrying the new evidence source or origin is still read by `selectTrustedImageReleaseEvidence` of an earlier version (it fingerprints the base fields only and selects by source), and tsdeploy reads only its own operations. A grant naming `deployment:redeploy-release` is refused by an earlier `validateServiceDeploymentGrant`, so Cloudly stores one only once it runs this version.
|
|
10
|
+
|
|
11
|
+
### Deprecations
|
|
12
|
+
|
|
13
|
+
- `requests.deployment.IReq_Any_Cloudly_CreateDeployment` stores a record and deploys nothing, and `requests.service.IRequest_Any_Cloudly_RollbackServiceImageRelease` re-opens an earlier operation and is called by nothing; both are `@deprecated` and leave with the next Cloudly major. A deployment is a release redeploy or a tsdeploy deployment.
|
|
14
|
+
|
|
3
15
|
## 2026-10-31 - 32.67.0
|
|
4
16
|
|
|
5
17
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '32.
|
|
6
|
+
version: '32.68.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
|
@@ -2,6 +2,7 @@ import type { IDeploymentPreflightProposedConfiguration, IDeploymentPreflightRun
|
|
|
2
2
|
import type { IGatewayRouteDnsResult } from './gateway.js';
|
|
3
3
|
import type { IImageRolloutStatus, IImmutableImageDeploymentPlan, TSha256Digest } from './immutableimage.js';
|
|
4
4
|
import type { ILegacyImageImportReference } from './deploymentlegacyimport.js';
|
|
5
|
+
import type { IReleaseRedeployReference } from './deploymentreleaseredeploy.js';
|
|
5
6
|
import type { IRegistryTarget } from './registry.js';
|
|
6
7
|
import type { TServiceTargetPortRef } from './serviceports.js';
|
|
7
8
|
export type TDeploymentOperationMode = 'existing-service' | 'greenfield';
|
|
@@ -20,6 +21,7 @@ interface IDeploymentReservationInputBase {
|
|
|
20
21
|
interface ISourceDeploymentOrigin {
|
|
21
22
|
sourceRevision: string;
|
|
22
23
|
legacyImport?: never;
|
|
24
|
+
releaseRedeploy?: never;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
27
|
* A greenfield deployment whose image Cloudly imports from an attested legacy service instead:
|
|
@@ -28,6 +30,17 @@ interface ISourceDeploymentOrigin {
|
|
|
28
30
|
interface ILegacyImportDeploymentOrigin {
|
|
29
31
|
legacyImport: ILegacyImageImportReference;
|
|
30
32
|
sourceRevision?: never;
|
|
33
|
+
releaseRedeploy?: never;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* An existing-service deployment Cloudly started and runs itself, of one of the service's own
|
|
37
|
+
* accepted releases (`startServiceReleaseDeployment`): nothing is built or pushed, so no source
|
|
38
|
+
* revision is stated. Never reserved through `reserveServiceDeployment`.
|
|
39
|
+
*/
|
|
40
|
+
interface IReleaseRedeployDeploymentOrigin {
|
|
41
|
+
releaseRedeploy: IReleaseRedeployReference;
|
|
42
|
+
sourceRevision?: never;
|
|
43
|
+
legacyImport?: never;
|
|
31
44
|
}
|
|
32
45
|
export interface IExistingServiceDeploymentReservationInput extends IDeploymentReservationInputBase, ISourceDeploymentOrigin {
|
|
33
46
|
mode: 'existing-service';
|
|
@@ -130,10 +143,11 @@ export interface IServiceDeploymentOperation {
|
|
|
130
143
|
}
|
|
131
144
|
/**
|
|
132
145
|
* An operation's durable state. It states where its image comes from exactly as its reservation
|
|
133
|
-
* did: a `sourceRevision` for an image its deployer builds,
|
|
134
|
-
* for a legacy service's attested image Cloudly imports
|
|
146
|
+
* did: a `sourceRevision` for an image its deployer builds, a `legacyImport` (greenfield only)
|
|
147
|
+
* for a legacy service's attested image Cloudly imports, or a `releaseRedeploy` (existing-service
|
|
148
|
+
* only, never reserved) for one of the service's own releases Cloudly deploys again.
|
|
135
149
|
*/
|
|
136
|
-
export type IServiceDeploymentOperationData = IServiceDeploymentOperationStateData & (ISourceDeploymentOrigin | ILegacyImportDeploymentOrigin);
|
|
150
|
+
export type IServiceDeploymentOperationData = IServiceDeploymentOperationStateData & (ISourceDeploymentOrigin | ILegacyImportDeploymentOrigin | IReleaseRedeployDeploymentOrigin);
|
|
137
151
|
interface IServiceDeploymentOperationStateData {
|
|
138
152
|
mode: TDeploymentOperationMode;
|
|
139
153
|
organizationId: string;
|
|
@@ -145,6 +145,9 @@ export const validateDeploymentReservationInput = (inputArg) => {
|
|
|
145
145
|
errors.push(`${field} must be a bounded canonical identifier`);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
+
if (inputArg.releaseRedeploy !== undefined) {
|
|
149
|
+
errors.push('a release redeploy is started by startServiceReleaseDeployment, never reserved');
|
|
150
|
+
}
|
|
148
151
|
if (inputArg.legacyImport !== undefined) {
|
|
149
152
|
errors.push(...validateLegacyImageImportReference(inputArg.legacyImport));
|
|
150
153
|
if (inputArg.mode !== 'greenfield') {
|
|
@@ -238,4 +241,4 @@ export const validateDeploymentReservationInput = (inputArg) => {
|
|
|
238
241
|
}
|
|
239
242
|
return errors;
|
|
240
243
|
};
|
|
241
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudG9wZXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvZGVwbG95bWVudG9wZXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRixPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLDRCQUE0QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBOEYxRixNQUFNLHNCQUFzQixHQUFHLDRGQUE0RixDQUFDO0FBRTVILE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLENBQUMsV0FBb0IsRUFBc0IsRUFBRTtJQUN6RixJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN0RCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEUsQ0FBQyxDQUFDLFFBQVE7UUFDVixDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQzNDLFdBQW1CLEVBQ3NCLEVBQUU7SUFDM0MsTUFBTSxRQUFRLEdBQUcsOEJBQThCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsVUFBVSxD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
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudG9wZXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvZGVwbG95bWVudG9wZXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRixPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLDRCQUE0QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBMkcxRixNQUFNLHNCQUFzQixHQUFHLDRGQUE0RixDQUFDO0FBRTVILE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLENBQUMsV0FBb0IsRUFBc0IsRUFBRTtJQUN6RixJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN0RCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEUsQ0FBQyxDQUFDLFFBQVE7UUFDVixDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQzNDLFdBQW1CLEVBQ3NCLEVBQUU7SUFDM0MsTUFBTSxRQUFRLEdBQUcsOEJBQThCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsVUFBVSxD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
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release redeploy: an existing service deploys one of its own releases again, from Cloudly's
|
|
3
|
+
* registry, without a build or a push.
|
|
4
|
+
*
|
|
5
|
+
* An administrator (or a deployment machine user granted `deployment:redeploy-release` on the
|
|
6
|
+
* service) starts it with `startServiceReleaseDeployment`, naming the release and the service's
|
|
7
|
+
* current rollout fence. Cloudly then runs the whole deployment itself: it creates an
|
|
8
|
+
* existing-service operation whose origin is `releaseRedeploy`, tags the release's root under the
|
|
9
|
+
* operation's own tag in the service's repository (the tag is the operation id, which starts with
|
|
10
|
+
* {@link releaseRedeployContract.tagPrefix} and so can never be a version string), records
|
|
11
|
+
* `cloudly-release-redeploy` evidence naming the source release, promotes the release and drives
|
|
12
|
+
* the operation through rollout, route promotion and public verification to `succeeded` or
|
|
13
|
+
* `failed`. The operation's status is the only statement that the deploy happened.
|
|
14
|
+
*
|
|
15
|
+
* What the redeploy declares is the declaration in force now: the routes, public domains and
|
|
16
|
+
* proposed configuration of the operation that owns the service's current rollout plan, never the
|
|
17
|
+
* declaration the source release was first deployed with.
|
|
18
|
+
*
|
|
19
|
+
* Only a release that was accepted (promoted successfully before), is still retained by the
|
|
20
|
+
* registry's retention policy and is still whole (every manifest and blob present) can be
|
|
21
|
+
* redeployed. A release accepted before the current one is rolled back to (plan mode `rollback`);
|
|
22
|
+
* the current release, or one accepted after it, is promoted again (plan mode `promotion`).
|
|
23
|
+
*/
|
|
24
|
+
/** Where a release redeploy's image comes from: one release of the service itself. */
|
|
25
|
+
export interface IReleaseRedeployReference {
|
|
26
|
+
/** The release whose registry root the redeploy deploys again. */
|
|
27
|
+
sourceReleaseId: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const releaseRedeployContract: Readonly<{
|
|
30
|
+
/**
|
|
31
|
+
* Every release redeploy's operation id, and therefore its release tag, starts with this. A
|
|
32
|
+
* semantic version never does, so a redeploy tag never collides with a version tag.
|
|
33
|
+
*/
|
|
34
|
+
tagPrefix: "redeploy-";
|
|
35
|
+
/** Operations one history read answers when it names no limit. */
|
|
36
|
+
historyDefaultLimit: 20;
|
|
37
|
+
/** Operations one history read answers at most. */
|
|
38
|
+
historyMaximumLimit: 50;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* The named refusals `startServiceReleaseDeployment` answers in its error's `code`, beside the
|
|
42
|
+
* shared deployment codes it reuses (`DEPLOYMENT_CAPABILITY_FORBIDDEN`, `DEPLOYMENT_IDENTITY_INVALID`,
|
|
43
|
+
* `DEPLOY_ON_PUSH_MUST_BE_DISABLED`, `DEPLOYMENT_ROLLOUT_FENCE_CONFLICT`,
|
|
44
|
+
* `DEPLOYMENT_IDEMPOTENCY_CONFLICT`, `DEPLOYMENT_PREFLIGHT_UNAVAILABLE`).
|
|
45
|
+
*
|
|
46
|
+
* - `DEPLOYMENT_REDEPLOY_INVALID`: the request is malformed.
|
|
47
|
+
* - `DEPLOYMENT_SERVICE_NOT_FOUND`: no such service.
|
|
48
|
+
* - `DEPLOYMENT_REDEPLOY_NO_CURRENT_PLAN`: the service has no current rollout plan to redeploy over.
|
|
49
|
+
* - `DEPLOYMENT_REDEPLOY_DECLARATION_UNAVAILABLE`: the plan is not owned by a deployment operation
|
|
50
|
+
* whose declaration Cloudly can state again (an adoption, or an operation that is gone).
|
|
51
|
+
* - `DEPLOYMENT_OPERATION_IN_FLIGHT`: another deployment operation of the service is not finished.
|
|
52
|
+
* - `DEPLOYMENT_RELEASE_NOT_FOUND`: no such release of this service.
|
|
53
|
+
* - `DEPLOYMENT_RELEASE_NOT_ACCEPTED`: the release was never promoted successfully.
|
|
54
|
+
* - `DEPLOYMENT_RELEASE_NOT_RETAINED`: retention no longer keeps the release.
|
|
55
|
+
* - `DEPLOYMENT_RELEASE_INCOMPLETE`: a manifest or blob of the release is missing from the registry.
|
|
56
|
+
* - `DEPLOYMENT_TARGET_SWARM_PHASE`: the service's rollout targets a cluster still in its Swarm
|
|
57
|
+
* phase, which a Cloudly-run deployment does not drive.
|
|
58
|
+
* - `DEPLOYMENT_TARGET_UNAVAILABLE`: the service's rollout target cannot be resolved.
|
|
59
|
+
*/
|
|
60
|
+
export declare const serviceReleaseDeploymentRefusalCodes: readonly ['DEPLOYMENT_REDEPLOY_INVALID', 'DEPLOYMENT_SERVICE_NOT_FOUND', 'DEPLOYMENT_REDEPLOY_NO_CURRENT_PLAN', 'DEPLOYMENT_REDEPLOY_DECLARATION_UNAVAILABLE', 'DEPLOYMENT_OPERATION_IN_FLIGHT', 'DEPLOYMENT_RELEASE_NOT_FOUND', 'DEPLOYMENT_RELEASE_NOT_ACCEPTED', 'DEPLOYMENT_RELEASE_NOT_RETAINED', 'DEPLOYMENT_RELEASE_INCOMPLETE', 'DEPLOYMENT_TARGET_SWARM_PHASE', 'DEPLOYMENT_TARGET_UNAVAILABLE'];
|
|
61
|
+
export type TServiceReleaseDeploymentRefusalCode = typeof serviceReleaseDeploymentRefusalCodes[number];
|
|
62
|
+
/** What `startServiceReleaseDeployment` states besides the caller's identity. */
|
|
63
|
+
export interface IServiceReleaseDeploymentStartInput {
|
|
64
|
+
serviceId: string;
|
|
65
|
+
releaseId: string;
|
|
66
|
+
/** Binds one start; the same key with the same request answers the operation it started. */
|
|
67
|
+
idempotencyKey: string;
|
|
68
|
+
/** The service's current rollout generation: at least 1, since a redeploy needs a current plan. */
|
|
69
|
+
expectedRolloutGeneration: number;
|
|
70
|
+
/** The service's current rollout id. */
|
|
71
|
+
expectedCurrentRolloutId: string;
|
|
72
|
+
}
|
|
73
|
+
/** What `getServiceDeploymentOperations` states besides the caller's identity. */
|
|
74
|
+
export interface IServiceDeploymentOperationHistoryQuery {
|
|
75
|
+
serviceId: string;
|
|
76
|
+
/** 1 to `releaseRedeployContract.historyMaximumLimit`; `historyDefaultLimit` when omitted. */
|
|
77
|
+
limit?: number;
|
|
78
|
+
/** An operation id the previous page answered as `nextBefore`: the page starts after it. */
|
|
79
|
+
before?: string;
|
|
80
|
+
}
|
|
81
|
+
/** Every error of a start input; empty when it is exactly one valid input. */
|
|
82
|
+
export declare const validateServiceReleaseDeploymentStartInput: (inputArg: unknown) => string[];
|
|
83
|
+
/** Every error of a release redeploy reference; empty when it is exactly one valid reference. */
|
|
84
|
+
export declare const validateReleaseRedeployReference: (referenceArg: unknown) => string[];
|
|
85
|
+
/** Every error of a history query; empty when it is exactly one valid query. */
|
|
86
|
+
export declare const validateServiceDeploymentOperationHistoryQuery: (queryArg: unknown) => string[];
|
|
87
|
+
/** Whether a release tag is a release redeploy's own tag. */
|
|
88
|
+
export declare const isReleaseRedeployTag: (tagArg: unknown) => boolean;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { readDataProperties } from '../private/dataproperties.js';
|
|
2
|
+
export const releaseRedeployContract = Object.freeze({
|
|
3
|
+
/**
|
|
4
|
+
* Every release redeploy's operation id, and therefore its release tag, starts with this. A
|
|
5
|
+
* semantic version never does, so a redeploy tag never collides with a version tag.
|
|
6
|
+
*/
|
|
7
|
+
tagPrefix: 'redeploy-',
|
|
8
|
+
/** Operations one history read answers when it names no limit. */
|
|
9
|
+
historyDefaultLimit: 20,
|
|
10
|
+
/** Operations one history read answers at most. */
|
|
11
|
+
historyMaximumLimit: 50,
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* The named refusals `startServiceReleaseDeployment` answers in its error's `code`, beside the
|
|
15
|
+
* shared deployment codes it reuses (`DEPLOYMENT_CAPABILITY_FORBIDDEN`, `DEPLOYMENT_IDENTITY_INVALID`,
|
|
16
|
+
* `DEPLOY_ON_PUSH_MUST_BE_DISABLED`, `DEPLOYMENT_ROLLOUT_FENCE_CONFLICT`,
|
|
17
|
+
* `DEPLOYMENT_IDEMPOTENCY_CONFLICT`, `DEPLOYMENT_PREFLIGHT_UNAVAILABLE`).
|
|
18
|
+
*
|
|
19
|
+
* - `DEPLOYMENT_REDEPLOY_INVALID`: the request is malformed.
|
|
20
|
+
* - `DEPLOYMENT_SERVICE_NOT_FOUND`: no such service.
|
|
21
|
+
* - `DEPLOYMENT_REDEPLOY_NO_CURRENT_PLAN`: the service has no current rollout plan to redeploy over.
|
|
22
|
+
* - `DEPLOYMENT_REDEPLOY_DECLARATION_UNAVAILABLE`: the plan is not owned by a deployment operation
|
|
23
|
+
* whose declaration Cloudly can state again (an adoption, or an operation that is gone).
|
|
24
|
+
* - `DEPLOYMENT_OPERATION_IN_FLIGHT`: another deployment operation of the service is not finished.
|
|
25
|
+
* - `DEPLOYMENT_RELEASE_NOT_FOUND`: no such release of this service.
|
|
26
|
+
* - `DEPLOYMENT_RELEASE_NOT_ACCEPTED`: the release was never promoted successfully.
|
|
27
|
+
* - `DEPLOYMENT_RELEASE_NOT_RETAINED`: retention no longer keeps the release.
|
|
28
|
+
* - `DEPLOYMENT_RELEASE_INCOMPLETE`: a manifest or blob of the release is missing from the registry.
|
|
29
|
+
* - `DEPLOYMENT_TARGET_SWARM_PHASE`: the service's rollout targets a cluster still in its Swarm
|
|
30
|
+
* phase, which a Cloudly-run deployment does not drive.
|
|
31
|
+
* - `DEPLOYMENT_TARGET_UNAVAILABLE`: the service's rollout target cannot be resolved.
|
|
32
|
+
*/
|
|
33
|
+
export const serviceReleaseDeploymentRefusalCodes = [
|
|
34
|
+
'DEPLOYMENT_REDEPLOY_INVALID',
|
|
35
|
+
'DEPLOYMENT_SERVICE_NOT_FOUND',
|
|
36
|
+
'DEPLOYMENT_REDEPLOY_NO_CURRENT_PLAN',
|
|
37
|
+
'DEPLOYMENT_REDEPLOY_DECLARATION_UNAVAILABLE',
|
|
38
|
+
'DEPLOYMENT_OPERATION_IN_FLIGHT',
|
|
39
|
+
'DEPLOYMENT_RELEASE_NOT_FOUND',
|
|
40
|
+
'DEPLOYMENT_RELEASE_NOT_ACCEPTED',
|
|
41
|
+
'DEPLOYMENT_RELEASE_NOT_RETAINED',
|
|
42
|
+
'DEPLOYMENT_RELEASE_INCOMPLETE',
|
|
43
|
+
'DEPLOYMENT_TARGET_SWARM_PHASE',
|
|
44
|
+
'DEPLOYMENT_TARGET_UNAVAILABLE',
|
|
45
|
+
];
|
|
46
|
+
const redeployIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
47
|
+
const isRedeployIdentifier = (valueArg) => (typeof valueArg === 'string' && redeployIdentifierRegex.test(valueArg));
|
|
48
|
+
const startInputKeys = [
|
|
49
|
+
'serviceId',
|
|
50
|
+
'releaseId',
|
|
51
|
+
'idempotencyKey',
|
|
52
|
+
'expectedRolloutGeneration',
|
|
53
|
+
'expectedCurrentRolloutId',
|
|
54
|
+
];
|
|
55
|
+
/** Every error of a start input; empty when it is exactly one valid input. */
|
|
56
|
+
export const validateServiceReleaseDeploymentStartInput = (inputArg) => {
|
|
57
|
+
const input = readDataProperties(inputArg);
|
|
58
|
+
if (input === null)
|
|
59
|
+
return ['release deployment start input must be a plain object'];
|
|
60
|
+
const errors = [];
|
|
61
|
+
const keys = Object.keys(input);
|
|
62
|
+
if (keys.length !== startInputKeys.length
|
|
63
|
+
|| !startInputKeys.every((keyArg) => keys.includes(keyArg))) {
|
|
64
|
+
errors.push(`release deployment start input must carry exactly ${startInputKeys.join(', ')}`);
|
|
65
|
+
}
|
|
66
|
+
for (const field of ['serviceId', 'releaseId', 'idempotencyKey', 'expectedCurrentRolloutId']) {
|
|
67
|
+
if (!isRedeployIdentifier(input[field])) {
|
|
68
|
+
errors.push(`${field} must be a bounded canonical identifier`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!Number.isSafeInteger(input.expectedRolloutGeneration)
|
|
72
|
+
|| input.expectedRolloutGeneration < 1) {
|
|
73
|
+
errors.push('expectedRolloutGeneration must be the current generation, at least 1');
|
|
74
|
+
}
|
|
75
|
+
return errors;
|
|
76
|
+
};
|
|
77
|
+
/** Every error of a release redeploy reference; empty when it is exactly one valid reference. */
|
|
78
|
+
export const validateReleaseRedeployReference = (referenceArg) => {
|
|
79
|
+
const reference = readDataProperties(referenceArg);
|
|
80
|
+
if (reference === null)
|
|
81
|
+
return ['releaseRedeploy must be a plain object'];
|
|
82
|
+
const keys = Object.keys(reference);
|
|
83
|
+
const errors = [];
|
|
84
|
+
if (keys.length !== 1 || keys[0] !== 'sourceReleaseId') {
|
|
85
|
+
errors.push('releaseRedeploy must carry exactly sourceReleaseId');
|
|
86
|
+
}
|
|
87
|
+
if (!isRedeployIdentifier(reference.sourceReleaseId)) {
|
|
88
|
+
errors.push('releaseRedeploy.sourceReleaseId must be a bounded canonical identifier');
|
|
89
|
+
}
|
|
90
|
+
return errors;
|
|
91
|
+
};
|
|
92
|
+
/** Every error of a history query; empty when it is exactly one valid query. */
|
|
93
|
+
export const validateServiceDeploymentOperationHistoryQuery = (queryArg) => {
|
|
94
|
+
const query = readDataProperties(queryArg);
|
|
95
|
+
if (query === null)
|
|
96
|
+
return ['deployment operation history query must be a plain object'];
|
|
97
|
+
const errors = [];
|
|
98
|
+
if (Object.keys(query).some((keyArg) => !['serviceId', 'limit', 'before'].includes(keyArg))) {
|
|
99
|
+
errors.push('deployment operation history query carries only serviceId, limit and before');
|
|
100
|
+
}
|
|
101
|
+
if (!isRedeployIdentifier(query.serviceId)) {
|
|
102
|
+
errors.push('serviceId must be a bounded canonical identifier');
|
|
103
|
+
}
|
|
104
|
+
if (query.limit !== undefined
|
|
105
|
+
&& (!Number.isSafeInteger(query.limit)
|
|
106
|
+
|| query.limit < 1
|
|
107
|
+
|| query.limit > releaseRedeployContract.historyMaximumLimit)) {
|
|
108
|
+
errors.push(`limit must be an integer from 1 to ${releaseRedeployContract.historyMaximumLimit}`);
|
|
109
|
+
}
|
|
110
|
+
if (query.before !== undefined && !isRedeployIdentifier(query.before)) {
|
|
111
|
+
errors.push('before must be a bounded canonical operation id');
|
|
112
|
+
}
|
|
113
|
+
return errors;
|
|
114
|
+
};
|
|
115
|
+
/** Whether a release tag is a release redeploy's own tag. */
|
|
116
|
+
export const isReleaseRedeployTag = (tagArg) => (typeof tagArg === 'string'
|
|
117
|
+
&& tagArg.startsWith(releaseRedeployContract.tagPrefix)
|
|
118
|
+
&& tagArg.length > releaseRedeployContract.tagPrefix.length
|
|
119
|
+
&& /^[A-Za-z0-9_][A-Za-z0-9._-]{0,127}$/.test(tagArg));
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHJlbGVhc2VyZWRlcGxveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvZGVwbG95bWVudHJlbGVhc2VyZWRlcGxveS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQWdDbEUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNuRDs7O09BR0c7SUFDSCxTQUFTLEVBQUUsV0FBVztJQUN0QixrRUFBa0U7SUFDbEUsbUJBQW1CLEVBQUUsRUFBRTtJQUN2QixtREFBbUQ7SUFDbkQsbUJBQW1CLEVBQUUsRUFBRTtDQUN4QixDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHO0lBQ2xELDZCQUE2QjtJQUM3Qiw4QkFBOEI7SUFDOUIscUNBQXFDO0lBQ3JDLDZDQUE2QztJQUM3QyxnQ0FBZ0M7SUFDaEMsOEJBQThCO0lBQzlCLGlDQUFpQztJQUNqQyxpQ0FBaUM7SUFDakMsK0JBQStCO0lBQy9CLCtCQUErQjtJQUMvQiwrQkFBK0I7Q0FDdkIsQ0FBQztBQXlCWCxNQUFNLHVCQUF1QixHQUFHLHFDQUFxQyxDQUFDO0FBRXRFLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxRQUFpQixFQUFzQixFQUFFLENBQUMsQ0FDdEUsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDdkUsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLFdBQVc7SUFDWCxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLDJCQUEyQjtJQUMzQiwwQkFBMEI7Q0FDbEIsQ0FBQztBQUVYLDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBRyxDQUFDLFFBQWlCLEVBQVksRUFBRTtJQUN4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
|
|
@@ -119,7 +119,20 @@ export interface IImageReleaseLegacyImportEvidence extends IImageReleaseTrustedE
|
|
|
119
119
|
sourceTag: string;
|
|
120
120
|
sourceRootDigest: TSha256Digest;
|
|
121
121
|
}
|
|
122
|
-
|
|
122
|
+
/**
|
|
123
|
+
* Cloudly's own copy of one of the service's accepted releases under a release redeploy's tag.
|
|
124
|
+
*
|
|
125
|
+
* Nothing was built or pushed: the release's root was tagged again in the same repository, so
|
|
126
|
+
* `sourceRootDigest` equals `registryRootDigest`, and `sourceReleaseId` names the release row the
|
|
127
|
+
* root belongs to. `sourceTag` is the tag the release was accepted under before.
|
|
128
|
+
*/
|
|
129
|
+
export interface IImageReleaseRedeployEvidence extends IImageReleaseTrustedEvidenceBase {
|
|
130
|
+
source: 'cloudly-release-redeploy';
|
|
131
|
+
sourceReleaseId: string;
|
|
132
|
+
sourceTag: string;
|
|
133
|
+
sourceRootDigest: TSha256Digest;
|
|
134
|
+
}
|
|
135
|
+
export type IImageReleaseTrustedEvidence = IImageReleaseRegistryPushEvidence | IImageReleaseLegacyImportEvidence | IImageReleaseRedeployEvidence;
|
|
123
136
|
export declare const selectTrustedImageReleaseEvidence: (argsArg: {
|
|
124
137
|
release: IImageRelease;
|
|
125
138
|
operationId: string;
|
|
@@ -132,8 +145,9 @@ export declare const selectTrustedImageReleaseEvidence: (argsArg: {
|
|
|
132
145
|
digest: TSha256Digest;
|
|
133
146
|
/**
|
|
134
147
|
* The one evidence source the operation's image may have come from: a legacy-import operation
|
|
135
|
-
* accepts only Cloudly's import,
|
|
136
|
-
* it is the registry push, the only
|
|
148
|
+
* accepts only Cloudly's import, a release-redeploy operation only Cloudly's redeploy copy, every
|
|
149
|
+
* other operation only its actor's registry push. Omitted, it is the registry push, the only
|
|
150
|
+
* source an operation without a legacy import or a release redeploy has.
|
|
137
151
|
*/
|
|
138
152
|
evidenceSource?: IImageReleaseTrustedEvidence['source'];
|
|
139
153
|
}) => {
|
|
@@ -64,6 +64,13 @@ export const selectTrustedImageReleaseEvidence = (argsArg) => {
|
|
|
64
64
|
evidenceArg.sourceRootDigest,
|
|
65
65
|
]
|
|
66
66
|
: []),
|
|
67
|
+
...(evidenceArg.source === 'cloudly-release-redeploy'
|
|
68
|
+
? [
|
|
69
|
+
evidenceArg.sourceReleaseId,
|
|
70
|
+
evidenceArg.sourceTag,
|
|
71
|
+
evidenceArg.sourceRootDigest,
|
|
72
|
+
]
|
|
73
|
+
: []),
|
|
67
74
|
].join('\u0000');
|
|
68
75
|
const uniqueEvidence = new Map();
|
|
69
76
|
const errors = [];
|
|
@@ -100,6 +107,16 @@ export const selectTrustedImageReleaseEvidence = (argsArg) => {
|
|
|
100
107
|
errors.push('trusted release evidence is ambiguous');
|
|
101
108
|
}
|
|
102
109
|
const evidence = evidenceMatches.length === 1 ? evidenceMatches[0] : undefined;
|
|
110
|
+
// A redeploy copies one root of this release row under a new tag; it never makes a new root,
|
|
111
|
+
// and only a row that was accepted before (promoted successfully) can be redeployed.
|
|
112
|
+
if (evidence?.source === 'cloudly-release-redeploy'
|
|
113
|
+
&& (argsArg.release.data.acceptedAt === undefined
|
|
114
|
+
|| evidence.sourceRootDigest !== argsArg.release.data.registryRootDigest
|
|
115
|
+
|| evidence.sourceReleaseId !== argsArg.release.id
|
|
116
|
+
|| evidence.sourceTag === evidence.tag
|
|
117
|
+
|| !argsArg.release.data.observedTags.includes(evidence.sourceTag))) {
|
|
118
|
+
errors.push('release redeploy evidence must name this accepted release, its root and an earlier tag of it');
|
|
119
|
+
}
|
|
103
120
|
if (evidence && evidence.manifestMediaType !== argsArg.release.data.manifestMediaType) {
|
|
104
121
|
errors.push('trusted release and release root media types disagree');
|
|
105
122
|
}
|
|
@@ -435,4 +452,4 @@ export const validateImageRolloutStatus = (statusArg) => {
|
|
|
435
452
|
}
|
|
436
453
|
return errors;
|
|
437
454
|
};
|
|
438
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1tdXRhYmxlaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2ltbXV0YWJsZWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0UvRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3ZELHlEQUF5RDtJQUN6RCxxQkFBcUI7SUFDckIsd0VBQXdFO0lBQ3hFLDRCQUE0QjtJQUM1QixtRUFBbUU7SUFDbkUsd0JBQXdCO0lBQ3hCLHFEQUFxRDtJQUNyRCwwQkFBMEI7SUFDMUIsZ0VBQWdFO0lBQ2hFLGlCQUFpQjtJQUNqQiwwRUFBMEU7SUFDMUUsNkJBQTZCO0lBQzdCLGdGQUFnRjtJQUNoRiwyQkFBMkI7Q0FDbkIsQ0FBQyxDQUFDO0FBS1o7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUM5RCxDQUFDLHFCQUFxQixDQUEwRCxDQUNqRixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQ2xFLENBQUMsbUNBQW1DLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEtBQUssYUFBYSxDQUFDLENBQzFGLENBQUMsQ0FBQyxDQUFDO0FBRU47OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsUUFBaUIsRUFDeUIsRUFBRSxDQUFDLENBQzdDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSwyQkFBMkIsQ0FBQztPQUN4RCxtQ0FBbUMsQ0FBQyxLQUFLLENBQzFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssYUFBYSxDQUFDLENBQzNFLENBQ0YsQ0FBQztBQXVGRixNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLE9BZ0JqRCxFQUFpRSxFQUFFO0lBQ2xFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksa0JBQWtCLENBQUM7SUFDcEUsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLFdBQXlDLEVBQUUsRUFBRSxDQUFDO1FBQ3pFLFdBQVcsQ0FBQyxNQUFNO1FBQ2xCLFdBQVcsQ0FBQyxVQUFVO1FBQ3RCLFdBQVcsQ0FBQyxXQUFXO1FBQ3ZCLFdBQVcsQ0FBQyxXQUFXO1FBQ3ZCLFdBQVcsQ0FBQyxZQUFZO1FBQ3hCLFdBQVcsQ0FBQyxVQUFVO1FBQ3RCLFdBQVcsQ0FBQyxHQUFHO1FBQ2YsV0FBVyxDQUFDLGtCQUFrQjtRQUM5QixXQUFXLENBQUMsaUJBQWlCO1FBQzdCLFdBQVcsQ0FBQyxVQUFVO1FBQ3RCLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLHVCQUF1QjtZQUNoRCxDQUFDLENBQUM7Z0JBQ0EsV0FBVyxDQUFDLGVBQWU7Z0JBQzNCLFdBQVcsQ0FBQyxhQUFhO2dCQUN6QixXQUFXLENBQUMsZ0JBQWdCO2dCQUM1QixXQUFXLENBQUMsU0FBUztnQkFDckIsV0FBVyxDQUFDLGdCQUFnQjthQUM3QjtZQUNELENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQixNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBd0MsQ0FBQztJQUN2RSxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEUsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsSUFBSSxRQUFRLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLEtBQUssbUJBQW1CLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNoRixNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLENBQUM7WUFDTixjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUMzRSxXQUFXLENBQUMsTUFBTSxLQUFLLGNBQWM7V0FDbEMsV0FBVyxDQUFDLFdBQVcsS0FBSyxPQUFPLENBQUMsV0FBVztXQUMvQyxXQUFXLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxXQUFXO1dBQy9DLFdBQVcsQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLFlBQVk7V0FDakQsV0FBVyxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsVUFBVTtXQUM3QyxXQUFXLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxHQUFHO1dBQy9CLFdBQVcsQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUNyRCxDQUFDLENBQUM7SUFDSCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsU0FBUztXQUNuRCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLE9BQU87V0FDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLE9BQU8sQ0FBQyxZQUFZO1dBQzFELE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsVUFBVTtXQUN0RCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEUsTUFBTSxDQUFDLElBQUksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDckQsQ0FBQztTQUFNLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMvRSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsaUJBQWlCLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN0RixNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILHlDQUF5QztRQUN6QywyREFBMkQ7S0FDNUQsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7V0FDN0MsQ0FBQyxRQUFRLElBQUksQ0FBQztZQUNmLHlDQUF5QztZQUN6QywyREFBMkQ7U0FDNUQsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFFRixNQUFNLHdCQUF3QixHQUFHLHFDQUFxQyxDQUFDO0FBQ3ZFLE1BQU0sd0JBQXdCLEdBQUcscUNBQXFDLENBQUM7QUFDdkUsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFFBQWlCLEVBQXNCLEVBQUUsQ0FDdEUsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLE1BQWUsRUFBc0IsRUFBRTtJQUNsRixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7V0FDekIsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU07V0FDeEIsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1dBQ3RDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBOEhGLE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQUM7QUFFbEQsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBOEI7SUFDdkUsYUFBYTtJQUNiLGFBQWE7Q0FDZCxDQUFDLENBQUM7QUFFSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsT0FBZ0IsRUFBdUIsRUFBRSxDQUFDLENBQ3ZFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO09BQ25CLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztPQUNsQixPQUFPLENBQUMsTUFBTSxJQUFJLEdBQUc7T0FDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxXQUFXLEtBQUssUUFBUTtXQUM1RCxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7V0FDdEIsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1dBQzFDLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FDL0QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDZDQUE2QyxHQUFHLENBQzNELGFBQTRGLEVBQ3BGLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLGVBQWUsRUFBRSxhQUFhLENBQUMsZUFBZTtJQUM5QyxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7SUFDeEIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixzQkFBc0IsRUFBRSxRQUFRLENBQUMsc0JBQXNCO1FBQ3ZELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7UUFDN0MsYUFBYSxFQUFFLFFBQVEsQ0FBQyxhQUFhO0tBQ3RDLENBQUMsQ0FBQztDQUNKLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLHlDQUF5QyxHQUFHLEtBQUssRUFDNUQsYUFBNEYsRUFDcEUsRUFBRTtJQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUNqRSxTQUFTLEVBQ1QsS0FBSyxDQUFDLE1BQXFCLENBQzVCLENBQUMsQ0FBQztJQUNILE9BQU8sVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDO1NBQ3pCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZELElBQUksQ0FBQyxFQUFFLENBQUMsRUFBbUIsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3Q0FBd0MsR0FBRyxLQUFLLEVBQzNELGFBQTRDLEVBQzFCLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTTtRQUNyQyxNQUFNLHlDQUF5QyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLENBQ2xELGFBQXNCLEVBQ1osRUFBRTtJQUNaLElBQUksQ0FBQyxhQUFhLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN4RixPQUFPLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsYUFBd0MsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BFLE1BQU07UUFDTixRQUFRO1FBQ1IsVUFBVTtRQUNWLGlCQUFpQjtLQUNsQixDQUFDLEVBQUUsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQ3pELENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZTtRQUM1QixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7V0FDckIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxXQUFXLEtBQUssUUFBUTtlQUM3RCxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxXQUEwQyxDQUFDLENBQUM7V0FDL0UsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxNQUFNO1dBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0VBQXdFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvRSxNQUFNLGlCQUFpQixHQUFjLEVBQUUsQ0FBQztJQUN4QyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEtBQUsscUJBQXFCLENBQUMsQ0FBQztZQUN4RSxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLFFBQW1DLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQy9ELGVBQWU7WUFDZixtQkFBbUI7WUFDbkIsVUFBVTtZQUNWLHdCQUF3QjtTQUN6QixDQUFDLEVBQUUsQ0FBQztZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEtBQUssNkJBQTZCLENBQUMsQ0FBQztRQUNsRixDQUFDO1FBQ0QsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUF1QyxDQUFDLEVBQUUsQ0FBQztZQUNwRixNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxLQUFLLDJCQUEyQixDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLHNCQUFnQyxDQUFDO2VBQ3RELENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxpQkFBMkIsQ0FBQyxFQUFFLENBQUM7WUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztlQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEtBQUssNkJBQTZCLENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUNELElBQUksT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNoRixNQUFNLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsTUFBZSxFQUE2QixFQUFFO0lBQ2xGLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JELE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzdDLENBQUMsQ0FBRSxnQkFBa0M7UUFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFjLEVBQTJCLEVBQUUsQ0FDeEUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRWpDLE1BQU0saUJBQWlCLEdBQUcsdUVBQXVFLENBQUM7QUFDbEcsTUFBTSxlQUFlLEdBQUcsbUVBQW1FLENBQUM7QUFFNUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUMvRSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTdGLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLENBQzdDLFlBQW9CLEVBQ3BCLFVBQWtCLEVBQ2xCLE1BQXFCLEVBQ2IsRUFBRTtJQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDL0UsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxPQUFPLEdBQUcsWUFBWSxJQUFJLFVBQVUsSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUNuRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUMvQyxjQUFzQixFQUNLLEVBQUU7SUFDN0IsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLENBQ2xELE9BQXNDLEVBQzVCLEVBQUU7SUFDWixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEYsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvRSxNQUFNLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILHlDQUF5QztRQUN6QywyREFBMkQ7S0FDNUQsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxvQ0FBb0MsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLElBQUksaUJBQXFDLENBQUM7SUFDMUMsSUFBSSxDQUFDO1FBQ0gsaUJBQWlCLEdBQUcsK0JBQStCLENBQ2pELE9BQU8sQ0FBQyxZQUFZLEVBQ3BCLE9BQU8sQ0FBQyxVQUFVLEVBQ2xCLE9BQU8sQ0FBQyxlQUFlLENBQ3hCLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUUsS0FBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLGlCQUFpQixJQUFJLE9BQU8sQ0FBQywwQkFBMEIsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkVBQTJFLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5RSxNQUFNLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtXQUNyRSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUUsTUFBTSxDQUFDLElBQUksQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEYsTUFBTSxDQUFDLElBQUksQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDaEUsTUFBTSxDQUFDLElBQUksQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLElBQUksT0FBTyxDQUFDLGlCQUFpQixLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQywyQkFBMkI7ZUFDbkMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQztZQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7UUFDN0UsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQywyQkFBMkIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLHFGQUFxRjtBQUNyRixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxLQUFLLEVBQ3JELE9BQXNDLEVBQ3BCLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztPQUM1RSxNQUFNLHdDQUF3QyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRWpGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsU0FBOEIsRUFBWSxFQUFFO0lBQ3JGLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsU0FBUztRQUNULFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLFFBQVE7UUFDUixZQUFZO1FBQ1osY0FBYztRQUNkLGFBQWE7S0FDZCxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLENBQUMsb0JBQW9CO1FBQzlCLFNBQVMsQ0FBQyxvQkFBb0I7UUFDOUIsU0FBUyxDQUFDLG1CQUFtQjtRQUM3QixTQUFTLENBQUMsb0JBQW9CO1FBQzlCLFNBQVMsQ0FBQyxrQkFBa0I7S0FDN0IsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyRixNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNuRyxNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUNuRCxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUMvQyxDQUFDO0lBQ0YsSUFBSSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLE1BQU07V0FDL0MsSUFBSSxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEUsTUFBTSxDQUFDLElBQUksQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMzQyxNQUFNLGNBQWMsR0FBRztZQUNyQixRQUFRLENBQUMsb0JBQW9CO1lBQzdCLFFBQVEsQ0FBQyxvQkFBb0I7WUFDN0IsUUFBUSxDQUFDLG1CQUFtQjtZQUM1QixRQUFRLENBQUMsb0JBQW9CO1lBQzdCLFFBQVEsQ0FBQyxrQkFBa0I7U0FDNUIsQ0FBQztRQUNGLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLE1BQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxTQUFTO2VBQ3pDLFFBQVEsQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUNELElBQ0UsUUFBUSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0I7ZUFDMUQsUUFBUSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0I7ZUFDNUQsUUFBUSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsRUFDaEUsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUMzRSxJQUNFLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDO2VBQy9CLFNBQVMsQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLENBQUMsb0JBQW9CO2VBQ2pFLFNBQVMsQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLENBQUMsb0JBQW9CO2VBQ2hFLFNBQVMsQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLENBQUMsb0JBQW9CO2VBQ2pFLFNBQVMsQ0FBQyxrQkFBa0IsS0FBSyxDQUFDLEVBQ3JDLENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDdkcsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELElBQUksSUFBSSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakUsTUFBTSxDQUFDLElBQUksQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUM1QyxXQUFXLENBQUMsb0JBQW9CLEdBQUcsQ0FBQztlQUNqQyxXQUFXLENBQUMsb0JBQW9CLEtBQUssV0FBVyxDQUFDLG9CQUFvQjtlQUNyRSxXQUFXLENBQUMsbUJBQW1CLEtBQUssV0FBVyxDQUFDLG9CQUFvQjtlQUNwRSxXQUFXLENBQUMsb0JBQW9CLEtBQUssV0FBVyxDQUFDLG9CQUFvQjtlQUNyRSxXQUFXLENBQUMsa0JBQWtCLEtBQUssQ0FBQztlQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUN2QyxDQUFDLEVBQUUsQ0FBQztZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdFLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxvQkFBb0I7WUFDL0QsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLG9CQUFvQjtZQUMvRCxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsbUJBQW1CO1lBQzVELFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxvQkFBb0I7WUFDL0QsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLGtCQUFrQjtTQUMxRCxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQ0UsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsb0JBQW9CO2VBQ3ZELGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtlQUMxRCxjQUFjLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxtQkFBbUI7ZUFDeEQsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsb0JBQW9CO2VBQzFELGNBQWMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLGtCQUFrQixFQUN6RCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDIn0=
|
|
455
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1tdXRhYmxlaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2ltbXV0YWJsZWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0UvRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3ZELHlEQUF5RDtJQUN6RCxxQkFBcUI7SUFDckIsd0VBQXdFO0lBQ3hFLDRCQUE0QjtJQUM1QixtRUFBbUU7SUFDbkUsd0JBQXdCO0lBQ3hCLHFEQUFxRDtJQUNyRCwwQkFBMEI7SUFDMUIsZ0VBQWdFO0lBQ2hFLGlCQUFpQjtJQUNqQiwwRUFBMEU7SUFDMUUsNkJBQTZCO0lBQzdCLGdGQUFnRjtJQUNoRiwyQkFBMkI7Q0FDbkIsQ0FBQyxDQUFDO0FBS1o7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUM5RCxDQUFDLHFCQUFxQixDQUEwRCxDQUNqRixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQ2xFLENBQUMsbUNBQW1DLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEtBQUssYUFBYSxDQUFDLENBQzFGLENBQUMsQ0FBQyxDQUFDO0FBRU47OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsUUFBaUIsRUFDeUIsRUFBRSxDQUFDLENBQzdDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSwyQkFBMkIsQ0FBQztPQUN4RCxtQ0FBbUMsQ0FBQyxLQUFLLENBQzFDLENBQUMsYUFBYSxFQUFF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
|
package/dist_ts/data/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './deploymentlegacyimport.js';
|
|
|
18
18
|
export * from './deploymentmachineuser.js';
|
|
19
19
|
export * from './deploymentoperation.js';
|
|
20
20
|
export * from './deploymentpreflight.js';
|
|
21
|
+
export * from './deploymentreleaseredeploy.js';
|
|
21
22
|
export * from './migration.js';
|
|
22
23
|
export * from './dns.js';
|
|
23
24
|
export * from './docker.js';
|
package/dist_ts/data/index.js
CHANGED
|
@@ -18,6 +18,7 @@ export * from './deploymentlegacyimport.js';
|
|
|
18
18
|
export * from './deploymentmachineuser.js';
|
|
19
19
|
export * from './deploymentoperation.js';
|
|
20
20
|
export * from './deploymentpreflight.js';
|
|
21
|
+
export * from './deploymentreleaseredeploy.js';
|
|
21
22
|
export * from './migration.js';
|
|
22
23
|
export * from './dns.js';
|
|
23
24
|
export * from './docker.js';
|
|
@@ -88,4 +89,4 @@ export * from './user.js';
|
|
|
88
89
|
export * from './version.js';
|
|
89
90
|
export * from './webpush.js';
|
|
90
91
|
export * from './workloadreplicaidentity.js';
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx3QkFBd0IsQ0FBQztBQUl2QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5RCxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVwRixPQUFPLEVBQUUsMENBQTBDLEVBQUUsMENBQTBDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxSSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsOEJBQThCLENBQUMifQ==
|
package/dist_ts/data/user.d.ts
CHANGED
|
@@ -8,7 +8,13 @@ export type TServiceDeploymentCapability = 'deployment:preflight' | 'deployment:
|
|
|
8
8
|
* Reserve a greenfield successor whose image Cloudly imports from an attested legacy service,
|
|
9
9
|
* and have Cloudly import it. Granted on an organization-service-slot grant only.
|
|
10
10
|
*/
|
|
11
|
-
| 'deployment:import-legacy' | 'deployment:promote-route' | 'deployment:rollback-image' | 'deployment:rollback-route' | 'deployment:retry' | 'deployment:cleanup'
|
|
11
|
+
| 'deployment:import-legacy' | 'deployment:promote-route' | 'deployment:rollback-image' | 'deployment:rollback-route' | 'deployment:retry' | 'deployment:cleanup'
|
|
12
|
+
/**
|
|
13
|
+
* Start a release redeploy of the service (`startServiceReleaseDeployment`): Cloudly deploys one
|
|
14
|
+
* of the service's own accepted, retained releases again and runs the operation itself. Granted
|
|
15
|
+
* on an existing-service grant only; administrators hold it implicitly.
|
|
16
|
+
*/
|
|
17
|
+
| 'deployment:redeploy-release';
|
|
12
18
|
/**
|
|
13
19
|
* Server-persisted authority for one logical service. These grants are never
|
|
14
20
|
* accepted from the identity payload supplied by a caller; Cloudly reloads
|
package/dist_ts/data/user.js
CHANGED
|
@@ -13,6 +13,7 @@ const serviceDeploymentCapabilities = new Set([
|
|
|
13
13
|
'deployment:rollback-route',
|
|
14
14
|
'deployment:retry',
|
|
15
15
|
'deployment:cleanup',
|
|
16
|
+
'deployment:redeploy-release',
|
|
16
17
|
]);
|
|
17
18
|
const deploymentBoundaryIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
18
19
|
export const validateServiceDeploymentGrant = (grantArg) => {
|
|
@@ -55,10 +56,14 @@ export const validateServiceDeploymentGrant = (grantArg) => {
|
|
|
55
56
|
&& capabilities.includes('deployment:adopt-existing')) {
|
|
56
57
|
errors.push('deployment:adopt-existing requires an existing-service grant');
|
|
57
58
|
}
|
|
59
|
+
if (capabilities && grant.scope !== 'service'
|
|
60
|
+
&& capabilities.includes('deployment:redeploy-release')) {
|
|
61
|
+
errors.push('deployment:redeploy-release requires an existing-service grant');
|
|
62
|
+
}
|
|
58
63
|
if (capabilities && grant.scope !== 'organization-service-slot'
|
|
59
64
|
&& capabilities.includes('deployment:import-legacy')) {
|
|
60
65
|
errors.push('deployment:import-legacy requires an organization-service-slot grant');
|
|
61
66
|
}
|
|
62
67
|
return errors;
|
|
63
68
|
};
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvdXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF5REEsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBK0I7SUFDMUUsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsbUJBQW1CO0lBQ25CLDhCQUE4QjtJQUM5QiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDJCQUEyQjtJQUMzQiwyQkFBMkI7SUFDM0Isa0JBQWtCO0lBQ2xCLG9CQUFvQjtJQUNwQiw2QkFBNkI7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxpQ0FBaUMsR0FBRyxxQ0FBcUMsQ0FBQztBQUVoRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxDQUM1QyxRQUFpQixFQUNQLEVBQUU7SUFDWixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxRQUFtQyxDQUFDO0lBQ2xELElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSywyQkFBMkIsRUFBRSxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxJQUFJLENBQUMseUVBQXlFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxjQUFjLEtBQUssUUFBUTtXQUN2QyxDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVE7V0FDbEMsQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDOUQsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDcEQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZO1FBQ3BCLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDZCxJQUFJLENBQUMsWUFBWTtXQUNaLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQztXQUN2QixZQUFZLENBQUMsTUFBTSxHQUFHLDZCQUE2QixDQUFDLElBQUk7V0FDeEQsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxNQUFNO1dBQ2xELFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQ3RDLE9BQU8sYUFBYSxLQUFLLFFBQVE7ZUFDOUIsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsYUFBNkMsQ0FBQyxDQUNyRixDQUFDLEVBQUUsQ0FBQztRQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0ZBQWtGLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsSUFBSSxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO1dBQ3hDLFlBQVksQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBQ0QsSUFBSSxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSywyQkFBMkI7V0FDMUQsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQztRQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUNELElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztXQUN4QyxZQUFZLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztXQUN4QyxZQUFZLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztRQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssMkJBQTJCO1dBQzFELFlBQVksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMsc0VBQXNFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDIn0=
|
|
@@ -50,6 +50,11 @@ export interface IReq_Any_Cloudly_GetDeploymentsByNode extends plugins.typedrequ
|
|
|
50
50
|
deployments: IDeployment[];
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* @deprecated Stores a deployment record and deploys nothing; no runtime writes these records.
|
|
55
|
+
* A deployment is a release redeploy (`startServiceReleaseDeployment`) or a tsdeploy deployment.
|
|
56
|
+
* It is removed in the next Cloudly major.
|
|
57
|
+
*/
|
|
53
58
|
export interface IReq_Any_Cloudly_CreateDeployment extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_CreateDeployment> {
|
|
54
59
|
method: 'createDeployment';
|
|
55
60
|
request: {
|
|
@@ -9,6 +9,7 @@ import type { IImageRelease } from '../data/immutableimage.js';
|
|
|
9
9
|
import type { IDeploymentPreflightReport, IDeploymentPreflightRequestData } from '../data/deploymentpreflight.js';
|
|
10
10
|
import type { IDeploymentReservationInput, IServiceDeploymentOperation, IServiceDeploymentStatus } from '../data/deploymentoperation.js';
|
|
11
11
|
import type { TSha256Digest } from '../data/immutableimage.js';
|
|
12
|
+
import type { IServiceDeploymentOperationHistoryQuery, IServiceReleaseDeploymentStartInput } from '../data/deploymentreleaseredeploy.js';
|
|
12
13
|
import type { ILegacyServiceHostObservation, ILegacyServiceRuntimeAttestation } from '../data/deploymentlegacyimport.js';
|
|
13
14
|
import type { IProtocolOffer } from '../protocol.js';
|
|
14
15
|
import type { IRuntimeAssignmentLogAttemptPage, IRuntimeAssignmentLogPage } from '../data/runtimeassignmentlogs.js';
|
|
@@ -135,6 +136,11 @@ export interface IRequest_Any_Cloudly_PromoteServiceImageRelease extends plugins
|
|
|
135
136
|
operation: IServiceDeploymentOperation;
|
|
136
137
|
};
|
|
137
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* @deprecated Rolls back by re-opening an earlier operation; nothing calls it and it is not
|
|
141
|
+
* maintained. A rollback is a release redeploy (`startServiceReleaseDeployment`) of the earlier
|
|
142
|
+
* release. It is removed in the next Cloudly major.
|
|
143
|
+
*/
|
|
138
144
|
export interface IRequest_Any_Cloudly_RollbackServiceImageRelease extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_RollbackServiceImageRelease> {
|
|
139
145
|
method: 'rollbackServiceImageRelease';
|
|
140
146
|
request: {
|
|
@@ -173,6 +179,42 @@ export interface IRequest_Any_Cloudly_ReserveServiceDeployment extends plugins.t
|
|
|
173
179
|
registryTarget: IRegistryTarget;
|
|
174
180
|
};
|
|
175
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Starts a release redeploy: Cloudly deploys one of the service's own accepted, retained and whole
|
|
184
|
+
* releases again (`data.deploymentreleaseredeploy`) and runs the operation itself to `succeeded` or
|
|
185
|
+
* `failed`. The answer is the operation as it stands once it was started; its state, failure and
|
|
186
|
+
* evidence are read with `readServiceDeploymentStatus`, never assumed from the answer.
|
|
187
|
+
*
|
|
188
|
+
* An administrator or a deployment machine user holding `deployment:redeploy-release` on the
|
|
189
|
+
* service may start one; the operation's actor is the caller. A refusal carries one of
|
|
190
|
+
* `data.serviceReleaseDeploymentRefusalCodes` or a shared deployment code in its `code`. The same
|
|
191
|
+
* `idempotencyKey` with the same request answers the operation it started.
|
|
192
|
+
*/
|
|
193
|
+
export interface IRequest_Any_Cloudly_StartServiceReleaseDeployment extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_StartServiceReleaseDeployment> {
|
|
194
|
+
method: 'startServiceReleaseDeployment';
|
|
195
|
+
request: {
|
|
196
|
+
identity: IIdentityCredential;
|
|
197
|
+
} & IServiceReleaseDeploymentStartInput;
|
|
198
|
+
response: {
|
|
199
|
+
operation: IServiceDeploymentOperation;
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* One page of a service's deployment operations, newest first: every operation of every origin
|
|
204
|
+
* (tsdeploy's and Cloudly's own). `nextBefore` names the operation the next page starts after and
|
|
205
|
+
* is absent on the last page. Administrators, or a deployment machine user holding
|
|
206
|
+
* `deployment:status` on the service.
|
|
207
|
+
*/
|
|
208
|
+
export interface IRequest_Any_Cloudly_GetServiceDeploymentOperations extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_GetServiceDeploymentOperations> {
|
|
209
|
+
method: 'getServiceDeploymentOperations';
|
|
210
|
+
request: {
|
|
211
|
+
identity: IIdentityCredential;
|
|
212
|
+
} & IServiceDeploymentOperationHistoryQuery;
|
|
213
|
+
response: {
|
|
214
|
+
operations: IServiceDeploymentOperation[];
|
|
215
|
+
nextBefore?: string;
|
|
216
|
+
};
|
|
217
|
+
}
|
|
176
218
|
/**
|
|
177
219
|
* Answers one deployment operation's status and advances it: a rolling-out operation whose runtime
|
|
178
220
|
* evidence proves success or failure is transitioned before the answer. A deployment that polls
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serve.zone/interfaces",
|
|
3
|
-
"version": "32.
|
|
3
|
+
"version": "32.68.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
|
|
6
6
|
"exports": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@git.zone/tsrepo": "^1.1.1",
|
|
31
|
-
"@types/node": "26.6.
|
|
31
|
+
"@types/node": "26.6.6",
|
|
32
32
|
"typescript": "^6.0.3"
|
|
33
33
|
},
|
|
34
34
|
"files": [
|
package/readme.md
CHANGED
|
@@ -4005,6 +4005,15 @@ A legacy `deployOnPush` service without deployable source moves to a greenfield
|
|
|
4005
4005
|
- Instead of the registry push, the deployer calls `importServiceDeploymentLegacyImage`: Cloudly imports the attested image from its own registry into the reserved tag — an index root as it is, a single platform manifest under a one-descriptor index of the manifest's own family — and records release evidence of source `cloudly-legacy-import` naming the legacy source. Steps 3 to 5 follow unchanged; `selectTrustedImageReleaseEvidence` accepts that evidence only with `evidenceSource: 'cloudly-legacy-import'`.
|
|
4006
4006
|
- The reservation and the import need the capability `deployment:import-legacy`, which only an organization-service-slot grant can carry.
|
|
4007
4007
|
|
|
4008
|
+
An existing service deploys one of its own releases again with a release redeploy, which needs no build, push or reservation:
|
|
4009
|
+
|
|
4010
|
+
- `startServiceReleaseDeployment` (`requests.service.IRequest_Any_Cloudly_StartServiceReleaseDeployment`) names the service, the release, an idempotency key and the service's current rollout fence (`expectedRolloutGeneration` at least 1 and `expectedCurrentRolloutId`, both required: a redeploy needs a current plan). `data.validateServiceReleaseDeploymentStartInput` states its shape.
|
|
4011
|
+
- An administrator, or a deployment machine user holding `deployment:redeploy-release` on an existing-service grant, may start one; the operation's actor is the caller. Only a release that was accepted, is still retained and is still whole is deployed; the refusals are `data.serviceReleaseDeploymentRefusalCodes`.
|
|
4012
|
+
- Cloudly creates an existing-service operation whose origin is `releaseRedeploy` (`data.IReleaseRedeployReference`) and whose release tag is the operation id (`redeploy-…`, `data.releaseRedeployContract.tagPrefix`, never a version string), tags the release's root under it in the same repository, records `cloudly-release-redeploy` evidence (`data.IImageReleaseRedeployEvidence`) naming the source release, its earlier tag and its root (`selectTrustedImageReleaseEvidence` accepts it only on a release row that was accepted before), promotes it and runs the operation through rollout, route promotion and public verification itself. It declares what is in force now: the routes and proposed configuration of the operation that owns the service's current plan.
|
|
4013
|
+
- The answer is the operation as started; whether the deploy happened is read with `readServiceDeploymentStatus`. `getServiceDeploymentOperations` lists a service's operations, newest first, a page at a time (`nextBefore`).
|
|
4014
|
+
|
|
4015
|
+
`rollbackServiceImageRelease` and `createDeployment` are deprecated: the first re-opens an earlier operation and nothing calls it, the second stores a deployment record and deploys nothing.
|
|
4016
|
+
|
|
4008
4017
|
`data.IDeploymentRouteRequest.proxied` carries provider-specific DNS proxy intent as an optional boolean. New route declarations should set it explicitly; omission remains valid for persisted historical operations and legacy callers.
|
|
4009
4018
|
|
|
4010
4019
|
`data.IServiceDeploymentOperation` is the durable revisioned compare-and-set fence for this workflow. Image promotion requires Cloudly-created trusted evidence that binds the operation, actor, repository, exact tag, root digest, and OCI index media type. The service request group also exposes deployment preflight, exact-digest rollback, retry, and cleanup contracts.
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { IImageRolloutStatus, IImmutableImageDeploymentPlan, TSha256Digest
|
|
|
4
4
|
import { normalizeImmutableReleaseTag, normalizeSha256Digest } from './immutableimage.js';
|
|
5
5
|
import type { ILegacyImageImportReference } from './deploymentlegacyimport.js';
|
|
6
6
|
import { validateLegacyImageImportReference } from './deploymentlegacyimport.js';
|
|
7
|
+
import type { IReleaseRedeployReference } from './deploymentreleaseredeploy.js';
|
|
7
8
|
import type { IRegistryTarget } from './registry.js';
|
|
8
9
|
import { hasExactKeys } from '../private/dataproperties.js';
|
|
9
10
|
import { normalizeServiceAbsolutePath, validateServiceContainerArgs } from './service.js';
|
|
@@ -27,6 +28,7 @@ interface IDeploymentReservationInputBase {
|
|
|
27
28
|
interface ISourceDeploymentOrigin {
|
|
28
29
|
sourceRevision: string;
|
|
29
30
|
legacyImport?: never;
|
|
31
|
+
releaseRedeploy?: never;
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
/**
|
|
@@ -36,6 +38,18 @@ interface ISourceDeploymentOrigin {
|
|
|
36
38
|
interface ILegacyImportDeploymentOrigin {
|
|
37
39
|
legacyImport: ILegacyImageImportReference;
|
|
38
40
|
sourceRevision?: never;
|
|
41
|
+
releaseRedeploy?: never;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* An existing-service deployment Cloudly started and runs itself, of one of the service's own
|
|
46
|
+
* accepted releases (`startServiceReleaseDeployment`): nothing is built or pushed, so no source
|
|
47
|
+
* revision is stated. Never reserved through `reserveServiceDeployment`.
|
|
48
|
+
*/
|
|
49
|
+
interface IReleaseRedeployDeploymentOrigin {
|
|
50
|
+
releaseRedeploy: IReleaseRedeployReference;
|
|
51
|
+
sourceRevision?: never;
|
|
52
|
+
legacyImport?: never;
|
|
39
53
|
}
|
|
40
54
|
|
|
41
55
|
export interface IExistingServiceDeploymentReservationInput
|
|
@@ -265,6 +279,9 @@ export const validateDeploymentReservationInput = (inputArg: unknown): string[]
|
|
|
265
279
|
errors.push(`${field} must be a bounded canonical identifier`);
|
|
266
280
|
}
|
|
267
281
|
}
|
|
282
|
+
if (inputArg.releaseRedeploy !== undefined) {
|
|
283
|
+
errors.push('a release redeploy is started by startServiceReleaseDeployment, never reserved');
|
|
284
|
+
}
|
|
268
285
|
if (inputArg.legacyImport !== undefined) {
|
|
269
286
|
errors.push(...validateLegacyImageImportReference(inputArg.legacyImport));
|
|
270
287
|
if (inputArg.mode !== 'greenfield') {
|
|
@@ -432,12 +449,14 @@ export interface IServiceDeploymentOperation {
|
|
|
432
449
|
|
|
433
450
|
/**
|
|
434
451
|
* An operation's durable state. It states where its image comes from exactly as its reservation
|
|
435
|
-
* did: a `sourceRevision` for an image its deployer builds,
|
|
436
|
-
* for a legacy service's attested image Cloudly imports
|
|
452
|
+
* did: a `sourceRevision` for an image its deployer builds, a `legacyImport` (greenfield only)
|
|
453
|
+
* for a legacy service's attested image Cloudly imports, or a `releaseRedeploy` (existing-service
|
|
454
|
+
* only, never reserved) for one of the service's own releases Cloudly deploys again.
|
|
437
455
|
*/
|
|
438
456
|
export type IServiceDeploymentOperationData = IServiceDeploymentOperationStateData & (
|
|
439
457
|
| ISourceDeploymentOrigin
|
|
440
458
|
| ILegacyImportDeploymentOrigin
|
|
459
|
+
| IReleaseRedeployDeploymentOrigin
|
|
441
460
|
);
|
|
442
461
|
|
|
443
462
|
interface IServiceDeploymentOperationStateData {
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { readDataProperties } from '../private/dataproperties.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Release redeploy: an existing service deploys one of its own releases again, from Cloudly's
|
|
5
|
+
* registry, without a build or a push.
|
|
6
|
+
*
|
|
7
|
+
* An administrator (or a deployment machine user granted `deployment:redeploy-release` on the
|
|
8
|
+
* service) starts it with `startServiceReleaseDeployment`, naming the release and the service's
|
|
9
|
+
* current rollout fence. Cloudly then runs the whole deployment itself: it creates an
|
|
10
|
+
* existing-service operation whose origin is `releaseRedeploy`, tags the release's root under the
|
|
11
|
+
* operation's own tag in the service's repository (the tag is the operation id, which starts with
|
|
12
|
+
* {@link releaseRedeployContract.tagPrefix} and so can never be a version string), records
|
|
13
|
+
* `cloudly-release-redeploy` evidence naming the source release, promotes the release and drives
|
|
14
|
+
* the operation through rollout, route promotion and public verification to `succeeded` or
|
|
15
|
+
* `failed`. The operation's status is the only statement that the deploy happened.
|
|
16
|
+
*
|
|
17
|
+
* What the redeploy declares is the declaration in force now: the routes, public domains and
|
|
18
|
+
* proposed configuration of the operation that owns the service's current rollout plan, never the
|
|
19
|
+
* declaration the source release was first deployed with.
|
|
20
|
+
*
|
|
21
|
+
* Only a release that was accepted (promoted successfully before), is still retained by the
|
|
22
|
+
* registry's retention policy and is still whole (every manifest and blob present) can be
|
|
23
|
+
* redeployed. A release accepted before the current one is rolled back to (plan mode `rollback`);
|
|
24
|
+
* the current release, or one accepted after it, is promoted again (plan mode `promotion`).
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/** Where a release redeploy's image comes from: one release of the service itself. */
|
|
28
|
+
export interface IReleaseRedeployReference {
|
|
29
|
+
/** The release whose registry root the redeploy deploys again. */
|
|
30
|
+
sourceReleaseId: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const releaseRedeployContract = Object.freeze({
|
|
34
|
+
/**
|
|
35
|
+
* Every release redeploy's operation id, and therefore its release tag, starts with this. A
|
|
36
|
+
* semantic version never does, so a redeploy tag never collides with a version tag.
|
|
37
|
+
*/
|
|
38
|
+
tagPrefix: 'redeploy-',
|
|
39
|
+
/** Operations one history read answers when it names no limit. */
|
|
40
|
+
historyDefaultLimit: 20,
|
|
41
|
+
/** Operations one history read answers at most. */
|
|
42
|
+
historyMaximumLimit: 50,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The named refusals `startServiceReleaseDeployment` answers in its error's `code`, beside the
|
|
47
|
+
* shared deployment codes it reuses (`DEPLOYMENT_CAPABILITY_FORBIDDEN`, `DEPLOYMENT_IDENTITY_INVALID`,
|
|
48
|
+
* `DEPLOY_ON_PUSH_MUST_BE_DISABLED`, `DEPLOYMENT_ROLLOUT_FENCE_CONFLICT`,
|
|
49
|
+
* `DEPLOYMENT_IDEMPOTENCY_CONFLICT`, `DEPLOYMENT_PREFLIGHT_UNAVAILABLE`).
|
|
50
|
+
*
|
|
51
|
+
* - `DEPLOYMENT_REDEPLOY_INVALID`: the request is malformed.
|
|
52
|
+
* - `DEPLOYMENT_SERVICE_NOT_FOUND`: no such service.
|
|
53
|
+
* - `DEPLOYMENT_REDEPLOY_NO_CURRENT_PLAN`: the service has no current rollout plan to redeploy over.
|
|
54
|
+
* - `DEPLOYMENT_REDEPLOY_DECLARATION_UNAVAILABLE`: the plan is not owned by a deployment operation
|
|
55
|
+
* whose declaration Cloudly can state again (an adoption, or an operation that is gone).
|
|
56
|
+
* - `DEPLOYMENT_OPERATION_IN_FLIGHT`: another deployment operation of the service is not finished.
|
|
57
|
+
* - `DEPLOYMENT_RELEASE_NOT_FOUND`: no such release of this service.
|
|
58
|
+
* - `DEPLOYMENT_RELEASE_NOT_ACCEPTED`: the release was never promoted successfully.
|
|
59
|
+
* - `DEPLOYMENT_RELEASE_NOT_RETAINED`: retention no longer keeps the release.
|
|
60
|
+
* - `DEPLOYMENT_RELEASE_INCOMPLETE`: a manifest or blob of the release is missing from the registry.
|
|
61
|
+
* - `DEPLOYMENT_TARGET_SWARM_PHASE`: the service's rollout targets a cluster still in its Swarm
|
|
62
|
+
* phase, which a Cloudly-run deployment does not drive.
|
|
63
|
+
* - `DEPLOYMENT_TARGET_UNAVAILABLE`: the service's rollout target cannot be resolved.
|
|
64
|
+
*/
|
|
65
|
+
export const serviceReleaseDeploymentRefusalCodes = [
|
|
66
|
+
'DEPLOYMENT_REDEPLOY_INVALID',
|
|
67
|
+
'DEPLOYMENT_SERVICE_NOT_FOUND',
|
|
68
|
+
'DEPLOYMENT_REDEPLOY_NO_CURRENT_PLAN',
|
|
69
|
+
'DEPLOYMENT_REDEPLOY_DECLARATION_UNAVAILABLE',
|
|
70
|
+
'DEPLOYMENT_OPERATION_IN_FLIGHT',
|
|
71
|
+
'DEPLOYMENT_RELEASE_NOT_FOUND',
|
|
72
|
+
'DEPLOYMENT_RELEASE_NOT_ACCEPTED',
|
|
73
|
+
'DEPLOYMENT_RELEASE_NOT_RETAINED',
|
|
74
|
+
'DEPLOYMENT_RELEASE_INCOMPLETE',
|
|
75
|
+
'DEPLOYMENT_TARGET_SWARM_PHASE',
|
|
76
|
+
'DEPLOYMENT_TARGET_UNAVAILABLE',
|
|
77
|
+
] as const;
|
|
78
|
+
|
|
79
|
+
export type TServiceReleaseDeploymentRefusalCode = typeof serviceReleaseDeploymentRefusalCodes[number];
|
|
80
|
+
|
|
81
|
+
/** What `startServiceReleaseDeployment` states besides the caller's identity. */
|
|
82
|
+
export interface IServiceReleaseDeploymentStartInput {
|
|
83
|
+
serviceId: string;
|
|
84
|
+
releaseId: string;
|
|
85
|
+
/** Binds one start; the same key with the same request answers the operation it started. */
|
|
86
|
+
idempotencyKey: string;
|
|
87
|
+
/** The service's current rollout generation: at least 1, since a redeploy needs a current plan. */
|
|
88
|
+
expectedRolloutGeneration: number;
|
|
89
|
+
/** The service's current rollout id. */
|
|
90
|
+
expectedCurrentRolloutId: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** What `getServiceDeploymentOperations` states besides the caller's identity. */
|
|
94
|
+
export interface IServiceDeploymentOperationHistoryQuery {
|
|
95
|
+
serviceId: string;
|
|
96
|
+
/** 1 to `releaseRedeployContract.historyMaximumLimit`; `historyDefaultLimit` when omitted. */
|
|
97
|
+
limit?: number;
|
|
98
|
+
/** An operation id the previous page answered as `nextBefore`: the page starts after it. */
|
|
99
|
+
before?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const redeployIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
103
|
+
|
|
104
|
+
const isRedeployIdentifier = (valueArg: unknown): valueArg is string => (
|
|
105
|
+
typeof valueArg === 'string' && redeployIdentifierRegex.test(valueArg)
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const startInputKeys = [
|
|
109
|
+
'serviceId',
|
|
110
|
+
'releaseId',
|
|
111
|
+
'idempotencyKey',
|
|
112
|
+
'expectedRolloutGeneration',
|
|
113
|
+
'expectedCurrentRolloutId',
|
|
114
|
+
] as const;
|
|
115
|
+
|
|
116
|
+
/** Every error of a start input; empty when it is exactly one valid input. */
|
|
117
|
+
export const validateServiceReleaseDeploymentStartInput = (inputArg: unknown): string[] => {
|
|
118
|
+
const input = readDataProperties(inputArg);
|
|
119
|
+
if (input === null) return ['release deployment start input must be a plain object'];
|
|
120
|
+
const errors: string[] = [];
|
|
121
|
+
const keys = Object.keys(input);
|
|
122
|
+
if (keys.length !== startInputKeys.length
|
|
123
|
+
|| !startInputKeys.every((keyArg) => keys.includes(keyArg))) {
|
|
124
|
+
errors.push(`release deployment start input must carry exactly ${startInputKeys.join(', ')}`);
|
|
125
|
+
}
|
|
126
|
+
for (const field of ['serviceId', 'releaseId', 'idempotencyKey', 'expectedCurrentRolloutId'] as const) {
|
|
127
|
+
if (!isRedeployIdentifier(input[field])) {
|
|
128
|
+
errors.push(`${field} must be a bounded canonical identifier`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (!Number.isSafeInteger(input.expectedRolloutGeneration)
|
|
132
|
+
|| (input.expectedRolloutGeneration as number) < 1) {
|
|
133
|
+
errors.push('expectedRolloutGeneration must be the current generation, at least 1');
|
|
134
|
+
}
|
|
135
|
+
return errors;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/** Every error of a release redeploy reference; empty when it is exactly one valid reference. */
|
|
139
|
+
export const validateReleaseRedeployReference = (referenceArg: unknown): string[] => {
|
|
140
|
+
const reference = readDataProperties(referenceArg);
|
|
141
|
+
if (reference === null) return ['releaseRedeploy must be a plain object'];
|
|
142
|
+
const keys = Object.keys(reference);
|
|
143
|
+
const errors: string[] = [];
|
|
144
|
+
if (keys.length !== 1 || keys[0] !== 'sourceReleaseId') {
|
|
145
|
+
errors.push('releaseRedeploy must carry exactly sourceReleaseId');
|
|
146
|
+
}
|
|
147
|
+
if (!isRedeployIdentifier(reference.sourceReleaseId)) {
|
|
148
|
+
errors.push('releaseRedeploy.sourceReleaseId must be a bounded canonical identifier');
|
|
149
|
+
}
|
|
150
|
+
return errors;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/** Every error of a history query; empty when it is exactly one valid query. */
|
|
154
|
+
export const validateServiceDeploymentOperationHistoryQuery = (queryArg: unknown): string[] => {
|
|
155
|
+
const query = readDataProperties(queryArg);
|
|
156
|
+
if (query === null) return ['deployment operation history query must be a plain object'];
|
|
157
|
+
const errors: string[] = [];
|
|
158
|
+
if (Object.keys(query).some((keyArg) => !['serviceId', 'limit', 'before'].includes(keyArg))) {
|
|
159
|
+
errors.push('deployment operation history query carries only serviceId, limit and before');
|
|
160
|
+
}
|
|
161
|
+
if (!isRedeployIdentifier(query.serviceId)) {
|
|
162
|
+
errors.push('serviceId must be a bounded canonical identifier');
|
|
163
|
+
}
|
|
164
|
+
if (query.limit !== undefined
|
|
165
|
+
&& (!Number.isSafeInteger(query.limit)
|
|
166
|
+
|| (query.limit as number) < 1
|
|
167
|
+
|| (query.limit as number) > releaseRedeployContract.historyMaximumLimit)) {
|
|
168
|
+
errors.push(`limit must be an integer from 1 to ${releaseRedeployContract.historyMaximumLimit}`);
|
|
169
|
+
}
|
|
170
|
+
if (query.before !== undefined && !isRedeployIdentifier(query.before)) {
|
|
171
|
+
errors.push('before must be a bounded canonical operation id');
|
|
172
|
+
}
|
|
173
|
+
return errors;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/** Whether a release tag is a release redeploy's own tag. */
|
|
177
|
+
export const isReleaseRedeployTag = (tagArg: unknown): boolean => (
|
|
178
|
+
typeof tagArg === 'string'
|
|
179
|
+
&& tagArg.startsWith(releaseRedeployContract.tagPrefix)
|
|
180
|
+
&& tagArg.length > releaseRedeployContract.tagPrefix.length
|
|
181
|
+
&& /^[A-Za-z0-9_][A-Za-z0-9._-]{0,127}$/.test(tagArg)
|
|
182
|
+
);
|
|
@@ -206,9 +206,24 @@ export interface IImageReleaseLegacyImportEvidence extends IImageReleaseTrustedE
|
|
|
206
206
|
sourceRootDigest: TSha256Digest;
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
+
/**
|
|
210
|
+
* Cloudly's own copy of one of the service's accepted releases under a release redeploy's tag.
|
|
211
|
+
*
|
|
212
|
+
* Nothing was built or pushed: the release's root was tagged again in the same repository, so
|
|
213
|
+
* `sourceRootDigest` equals `registryRootDigest`, and `sourceReleaseId` names the release row the
|
|
214
|
+
* root belongs to. `sourceTag` is the tag the release was accepted under before.
|
|
215
|
+
*/
|
|
216
|
+
export interface IImageReleaseRedeployEvidence extends IImageReleaseTrustedEvidenceBase {
|
|
217
|
+
source: 'cloudly-release-redeploy';
|
|
218
|
+
sourceReleaseId: string;
|
|
219
|
+
sourceTag: string;
|
|
220
|
+
sourceRootDigest: TSha256Digest;
|
|
221
|
+
}
|
|
222
|
+
|
|
209
223
|
export type IImageReleaseTrustedEvidence =
|
|
210
224
|
| IImageReleaseRegistryPushEvidence
|
|
211
|
-
| IImageReleaseLegacyImportEvidence
|
|
225
|
+
| IImageReleaseLegacyImportEvidence
|
|
226
|
+
| IImageReleaseRedeployEvidence;
|
|
212
227
|
|
|
213
228
|
export const selectTrustedImageReleaseEvidence = (argsArg: {
|
|
214
229
|
release: IImageRelease;
|
|
@@ -222,8 +237,9 @@ export const selectTrustedImageReleaseEvidence = (argsArg: {
|
|
|
222
237
|
digest: TSha256Digest;
|
|
223
238
|
/**
|
|
224
239
|
* The one evidence source the operation's image may have come from: a legacy-import operation
|
|
225
|
-
* accepts only Cloudly's import,
|
|
226
|
-
* it is the registry push, the only
|
|
240
|
+
* accepts only Cloudly's import, a release-redeploy operation only Cloudly's redeploy copy, every
|
|
241
|
+
* other operation only its actor's registry push. Omitted, it is the registry push, the only
|
|
242
|
+
* source an operation without a legacy import or a release redeploy has.
|
|
227
243
|
*/
|
|
228
244
|
evidenceSource?: IImageReleaseTrustedEvidence['source'];
|
|
229
245
|
}): { evidence?: IImageReleaseTrustedEvidence; errors: string[] } => {
|
|
@@ -248,6 +264,13 @@ export const selectTrustedImageReleaseEvidence = (argsArg: {
|
|
|
248
264
|
evidenceArg.sourceRootDigest,
|
|
249
265
|
]
|
|
250
266
|
: []),
|
|
267
|
+
...(evidenceArg.source === 'cloudly-release-redeploy'
|
|
268
|
+
? [
|
|
269
|
+
evidenceArg.sourceReleaseId,
|
|
270
|
+
evidenceArg.sourceTag,
|
|
271
|
+
evidenceArg.sourceRootDigest,
|
|
272
|
+
]
|
|
273
|
+
: []),
|
|
251
274
|
].join('\u0000');
|
|
252
275
|
const uniqueEvidence = new Map<string, IImageReleaseTrustedEvidence>();
|
|
253
276
|
const errors: string[] = [];
|
|
@@ -284,6 +307,16 @@ export const selectTrustedImageReleaseEvidence = (argsArg: {
|
|
|
284
307
|
errors.push('trusted release evidence is ambiguous');
|
|
285
308
|
}
|
|
286
309
|
const evidence = evidenceMatches.length === 1 ? evidenceMatches[0] : undefined;
|
|
310
|
+
// A redeploy copies one root of this release row under a new tag; it never makes a new root,
|
|
311
|
+
// and only a row that was accepted before (promoted successfully) can be redeployed.
|
|
312
|
+
if (evidence?.source === 'cloudly-release-redeploy'
|
|
313
|
+
&& (argsArg.release.data.acceptedAt === undefined
|
|
314
|
+
|| evidence.sourceRootDigest !== argsArg.release.data.registryRootDigest
|
|
315
|
+
|| evidence.sourceReleaseId !== argsArg.release.id
|
|
316
|
+
|| evidence.sourceTag === evidence.tag
|
|
317
|
+
|| !argsArg.release.data.observedTags.includes(evidence.sourceTag))) {
|
|
318
|
+
errors.push('release redeploy evidence must name this accepted release, its root and an earlier tag of it');
|
|
319
|
+
}
|
|
287
320
|
if (evidence && evidence.manifestMediaType !== argsArg.release.data.manifestMediaType) {
|
|
288
321
|
errors.push('trusted release and release root media types disagree');
|
|
289
322
|
}
|
package/ts/data/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './deploymentlegacyimport.js';
|
|
|
18
18
|
export * from './deploymentmachineuser.js';
|
|
19
19
|
export * from './deploymentoperation.js';
|
|
20
20
|
export * from './deploymentpreflight.js';
|
|
21
|
+
export * from './deploymentreleaseredeploy.js';
|
|
21
22
|
export * from './migration.js';
|
|
22
23
|
export * from './dns.js';
|
|
23
24
|
export * from './docker.js';
|
package/ts/data/user.ts
CHANGED
|
@@ -22,7 +22,13 @@ export type TServiceDeploymentCapability =
|
|
|
22
22
|
| 'deployment:rollback-image'
|
|
23
23
|
| 'deployment:rollback-route'
|
|
24
24
|
| 'deployment:retry'
|
|
25
|
-
| 'deployment:cleanup'
|
|
25
|
+
| 'deployment:cleanup'
|
|
26
|
+
/**
|
|
27
|
+
* Start a release redeploy of the service (`startServiceReleaseDeployment`): Cloudly deploys one
|
|
28
|
+
* of the service's own accepted, retained releases again and runs the operation itself. Granted
|
|
29
|
+
* on an existing-service grant only; administrators hold it implicitly.
|
|
30
|
+
*/
|
|
31
|
+
| 'deployment:redeploy-release';
|
|
26
32
|
|
|
27
33
|
/**
|
|
28
34
|
* Server-persisted authority for one logical service. These grants are never
|
|
@@ -64,6 +70,7 @@ const serviceDeploymentCapabilities = new Set<TServiceDeploymentCapability>([
|
|
|
64
70
|
'deployment:rollback-route',
|
|
65
71
|
'deployment:retry',
|
|
66
72
|
'deployment:cleanup',
|
|
73
|
+
'deployment:redeploy-release',
|
|
67
74
|
]);
|
|
68
75
|
|
|
69
76
|
const deploymentBoundaryIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
@@ -112,6 +119,10 @@ export const validateServiceDeploymentGrant = (
|
|
|
112
119
|
&& capabilities.includes('deployment:adopt-existing')) {
|
|
113
120
|
errors.push('deployment:adopt-existing requires an existing-service grant');
|
|
114
121
|
}
|
|
122
|
+
if (capabilities && grant.scope !== 'service'
|
|
123
|
+
&& capabilities.includes('deployment:redeploy-release')) {
|
|
124
|
+
errors.push('deployment:redeploy-release requires an existing-service grant');
|
|
125
|
+
}
|
|
115
126
|
if (capabilities && grant.scope !== 'organization-service-slot'
|
|
116
127
|
&& capabilities.includes('deployment:import-legacy')) {
|
|
117
128
|
errors.push('deployment:import-legacy requires an organization-service-slot grant');
|
|
@@ -75,6 +75,11 @@ extends plugins.typedrequestInterfaces.implementsTR<
|
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
/**
|
|
79
|
+
* @deprecated Stores a deployment record and deploys nothing; no runtime writes these records.
|
|
80
|
+
* A deployment is a release redeploy (`startServiceReleaseDeployment`) or a tsdeploy deployment.
|
|
81
|
+
* It is removed in the next Cloudly major.
|
|
82
|
+
*/
|
|
78
83
|
export interface IReq_Any_Cloudly_CreateDeployment
|
|
79
84
|
extends plugins.typedrequestInterfaces.implementsTR<
|
|
80
85
|
plugins.typedrequestInterfaces.ITypedRequest,
|
package/ts/requests/service.ts
CHANGED
|
@@ -17,6 +17,10 @@ import type {
|
|
|
17
17
|
IServiceDeploymentStatus,
|
|
18
18
|
} from '../data/deploymentoperation.js';
|
|
19
19
|
import type { TSha256Digest } from '../data/immutableimage.js';
|
|
20
|
+
import type {
|
|
21
|
+
IServiceDeploymentOperationHistoryQuery,
|
|
22
|
+
IServiceReleaseDeploymentStartInput,
|
|
23
|
+
} from '../data/deploymentreleaseredeploy.js';
|
|
20
24
|
import type {
|
|
21
25
|
ILegacyServiceHostObservation,
|
|
22
26
|
ILegacyServiceRuntimeAttestation,
|
|
@@ -214,6 +218,11 @@ extends plugins.typedrequestInterfaces.implementsTR<
|
|
|
214
218
|
};
|
|
215
219
|
}
|
|
216
220
|
|
|
221
|
+
/**
|
|
222
|
+
* @deprecated Rolls back by re-opening an earlier operation; nothing calls it and it is not
|
|
223
|
+
* maintained. A rollback is a release redeploy (`startServiceReleaseDeployment`) of the earlier
|
|
224
|
+
* release. It is removed in the next Cloudly major.
|
|
225
|
+
*/
|
|
217
226
|
export interface IRequest_Any_Cloudly_RollbackServiceImageRelease
|
|
218
227
|
extends plugins.typedrequestInterfaces.implementsTR<
|
|
219
228
|
plugins.typedrequestInterfaces.ITypedRequest,
|
|
@@ -262,6 +271,52 @@ extends plugins.typedrequestInterfaces.implementsTR<
|
|
|
262
271
|
};
|
|
263
272
|
}
|
|
264
273
|
|
|
274
|
+
/**
|
|
275
|
+
* Starts a release redeploy: Cloudly deploys one of the service's own accepted, retained and whole
|
|
276
|
+
* releases again (`data.deploymentreleaseredeploy`) and runs the operation itself to `succeeded` or
|
|
277
|
+
* `failed`. The answer is the operation as it stands once it was started; its state, failure and
|
|
278
|
+
* evidence are read with `readServiceDeploymentStatus`, never assumed from the answer.
|
|
279
|
+
*
|
|
280
|
+
* An administrator or a deployment machine user holding `deployment:redeploy-release` on the
|
|
281
|
+
* service may start one; the operation's actor is the caller. A refusal carries one of
|
|
282
|
+
* `data.serviceReleaseDeploymentRefusalCodes` or a shared deployment code in its `code`. The same
|
|
283
|
+
* `idempotencyKey` with the same request answers the operation it started.
|
|
284
|
+
*/
|
|
285
|
+
export interface IRequest_Any_Cloudly_StartServiceReleaseDeployment
|
|
286
|
+
extends plugins.typedrequestInterfaces.implementsTR<
|
|
287
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
288
|
+
IRequest_Any_Cloudly_StartServiceReleaseDeployment
|
|
289
|
+
> {
|
|
290
|
+
method: 'startServiceReleaseDeployment';
|
|
291
|
+
request: {
|
|
292
|
+
identity: IIdentityCredential;
|
|
293
|
+
} & IServiceReleaseDeploymentStartInput;
|
|
294
|
+
response: {
|
|
295
|
+
operation: IServiceDeploymentOperation;
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* One page of a service's deployment operations, newest first: every operation of every origin
|
|
301
|
+
* (tsdeploy's and Cloudly's own). `nextBefore` names the operation the next page starts after and
|
|
302
|
+
* is absent on the last page. Administrators, or a deployment machine user holding
|
|
303
|
+
* `deployment:status` on the service.
|
|
304
|
+
*/
|
|
305
|
+
export interface IRequest_Any_Cloudly_GetServiceDeploymentOperations
|
|
306
|
+
extends plugins.typedrequestInterfaces.implementsTR<
|
|
307
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
308
|
+
IRequest_Any_Cloudly_GetServiceDeploymentOperations
|
|
309
|
+
> {
|
|
310
|
+
method: 'getServiceDeploymentOperations';
|
|
311
|
+
request: {
|
|
312
|
+
identity: IIdentityCredential;
|
|
313
|
+
} & IServiceDeploymentOperationHistoryQuery;
|
|
314
|
+
response: {
|
|
315
|
+
operations: IServiceDeploymentOperation[];
|
|
316
|
+
nextBefore?: string;
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
265
320
|
/**
|
|
266
321
|
* Answers one deployment operation's status and advances it: a rolling-out operation whose runtime
|
|
267
322
|
* evidence proves success or failure is transitioned before the answer. A deployment that polls
|