@intentius/chant-lexicon-aws 0.80.0 → 0.82.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/dist/components/__tests__/mock-cloud-executor.d.ts.map +1 -1
- package/dist/components/apply.d.ts +18 -6
- package/dist/components/apply.d.ts.map +1 -1
- package/dist/components/cloud-executor.d.ts +3 -1
- package/dist/components/cloud-executor.d.ts.map +1 -1
- package/dist/components/safety.d.ts +5 -6
- package/dist/components/safety.d.ts.map +1 -1
- package/dist/integrity.json +2 -2
- package/dist/manifest.json +1 -1
- package/dist/spec/fetch.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/components/__tests__/mock-cloud-executor.ts +7 -3
- package/src/components/apply.test.ts +23 -4
- package/src/components/apply.ts +37 -10
- package/src/components/cloud-executor.ts +19 -4
- package/src/components/ecs-rollback-real-executor.test.ts +135 -0
- package/src/components/pilots-e2e.test.ts +11 -11
- package/src/components/safety.test.ts +13 -6
- package/src/components/safety.ts +11 -6
- package/src/spec/fetch.ts +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-cloud-executor.d.ts","sourceRoot":"","sources":["../../../src/components/__tests__/mock-cloud-executor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mock-cloud-executor.d.ts","sourceRoot":"","sources":["../../../src/components/__tests__/mock-cloud-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,SAAS,EAIT,aAAa,EAKb,eAAe,EAWhB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAMV,kBAAkB,EAEnB,MAAM,kDAAkD,CAAC;AAE1D,2LAA2L;AAC3L,KAAK,YAAY,GAAG,aAAa,GAAG;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,kIAAkI;IAClI,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kIAAkI;IAClI,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;yBAGqB;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,oFAAoF;IACpF,cAAc,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;CACrD;AAED,MAAM,WAAW,iBAAiB;IAChC,gHAAgH;IAChH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,wGAAwG;IACxG,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,aAAa,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;CACtD;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC7C,yGAAyG;IACzG,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9C,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4GAA4G;IAC5G,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,iKAAiK;IACjK,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,2GAA2G;IAC3G,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,qHAAqH;IACrH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kIAAkI;IAClI,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E,mFAAmF;IACnF,YAAY,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClF;AAED,+HAA+H;AAC/H,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,sHAAsH;IACtH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACtD,gEAAgE;IAChE,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC9D,4GAA4G;IAC5G,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D,2HAA2H;IAC3H,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1D;AAED,sHAAsH;AACtH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,wBAA6B,GAAG,iBAAiB,CAwSjG"}
|
|
@@ -117,15 +117,27 @@ export interface EcsUpdateServiceInput {
|
|
|
117
117
|
export interface EcsUpdateServiceOutput {
|
|
118
118
|
/** ARN of the new/updated service deployment. */
|
|
119
119
|
deploymentId: string;
|
|
120
|
+
/**
|
|
121
|
+
* The task definition the service ran before this step updated it, read with
|
|
122
|
+
* `describe-services` ahead of `update-service`. The rollback sends it back.
|
|
123
|
+
* Absent when the service could not be described or reported none (#2609).
|
|
124
|
+
*/
|
|
125
|
+
previousTaskDefinition?: string;
|
|
126
|
+
/** The service's desired count before this step, recorded only when the step sets `desiredCount`. */
|
|
127
|
+
previousDesiredCount?: number;
|
|
120
128
|
}
|
|
121
129
|
/**
|
|
122
130
|
* Roll a new task definition/image out to an ECS service via `UpdateService`.
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* the
|
|
128
|
-
*
|
|
131
|
+
* Before the update, `run` reads the service with `describe-services` and
|
|
132
|
+
* records the task definition it was running in its output. The rollback sends
|
|
133
|
+
* that previous task definition back (and the previous desired count, when the
|
|
134
|
+
* step changed it). The step's own `imageRef` is never the rollback target:
|
|
135
|
+
* it is the revision the step just rolled out, so re-sending it restores
|
|
136
|
+
* nothing (#2609). When the previous task definition could not be read, the
|
|
137
|
+
* rollback fails with a message naming the service rather than report a
|
|
138
|
+
* restore that changed nothing (#2605). A component that needs a specific
|
|
139
|
+
* task definition restored can still give itself an explicit rollback phase,
|
|
140
|
+
* such as `rollback-previous` with that `taskDefinition`.
|
|
129
141
|
*/
|
|
130
142
|
export declare function createEcsUpdateServiceCapability(executor?: CloudExecutor): Capability<EcsUpdateServiceInput, EcsUpdateServiceOutput>;
|
|
131
143
|
/** Default `ecs-update-service` capability, backed by the real `CloudExecutor`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/components/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAwB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQ/G;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAKhE;AAID;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,wLAAwL;IACxL,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mDAAmD;IACnD,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,iHAAiH;IACjH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,kGAAkG;IAClG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;aAEjC,KAAK,EAAE,MAAM;aACb,YAAY,EAAE,SAAS,EAAE;gBADzB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,SAAS,EAAE;CAS5C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,GAAE,aAAsC,GAC/C,UAAU,CAAC,cAAc,EAAE,eAAe,CAAC,CAyF7C;AAYD,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,EAAE,UAAU,CAAC,cAAc,EAAE,eAAe,CAA+B,CAAC;AAI5G,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uFAAuF;IACvF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/components/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -86,6 +86,8 @@ export interface EcsServiceState {
|
|
|
86
86
|
desiredCount: number;
|
|
87
87
|
/** True once `runningCount === desiredCount` and no deployments are in flight. */
|
|
88
88
|
stable: boolean;
|
|
89
|
+
/** The task definition the service is set to run, when the describe call reports one. */
|
|
90
|
+
taskDefinition?: string;
|
|
89
91
|
}
|
|
90
92
|
export interface EcsRunTaskArgs {
|
|
91
93
|
cluster: string;
|
|
@@ -119,7 +121,7 @@ export interface EcsClient {
|
|
|
119
121
|
}>;
|
|
120
122
|
/** Current running/desired counts for a service, used by `wait-steady-state`. */
|
|
121
123
|
describeService(cluster: string, service: string): Promise<EcsServiceState>;
|
|
122
|
-
/** Roll a service back to
|
|
124
|
+
/** Roll a service back to the given task definition (and count, if set) (saga compensation). Throws without a `taskDefinition`: the executor records no previous one. */
|
|
123
125
|
rollbackService(args: EcsUpdateServiceArgs): Promise<void>;
|
|
124
126
|
/** Run a one-off task (e.g. a DB migration) and return its arn for `waitForTask`. */
|
|
125
127
|
runTask(args: EcsRunTaskArgs): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-executor.d.ts","sourceRoot":"","sources":["../../src/components/cloud-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,kDAAkD,CAAC;AAIjG,YAAY,EAAE,YAAY,EAAE,CAAC;AAM7B,MAAM,WAAW,SAAS;IACxB,6GAA6G;IAC7G,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAID,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,WAAW,EAAE,OAAO,CAAC;IACrB,yGAAyG;IACzG,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf;;;kCAG8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,yGAAyG;IACzG,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,8CAA8C;IAC9C,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,4FAA4F;IAC5F,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,mHAAmH;IACnH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7G,uDAAuD;IACvD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1D,yGAAyG;IACzG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAID,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-executor.d.ts","sourceRoot":"","sources":["../../src/components/cloud-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,15 +34,14 @@ export interface RollbackPreviousSnapshotInput {
|
|
|
34
34
|
/** Resource identifier being restored. */
|
|
35
35
|
resource: string;
|
|
36
36
|
}
|
|
37
|
-
/** Roll an ECS service back to
|
|
38
|
-
* shape the `ecs-fargate` preset and the ALB/ECS pilot compose for an
|
|
39
|
-
* ALB-fronted frontend service. */
|
|
37
|
+
/** Roll an ECS service back to a named task definition. */
|
|
40
38
|
export interface RollbackPreviousEcsInput {
|
|
41
39
|
/** ECS service name. */
|
|
42
40
|
service: string;
|
|
43
41
|
/** ECS cluster (name or ARN). */
|
|
44
42
|
cluster: string;
|
|
45
|
-
/**
|
|
43
|
+
/** Task definition to roll back to (family:revision or ARN). Required: nothing
|
|
44
|
+
* records a service's previous task definition, so the step fails without it. */
|
|
46
45
|
taskDefinition?: string;
|
|
47
46
|
desiredCount?: number;
|
|
48
47
|
}
|
|
@@ -56,8 +55,8 @@ export interface RollbackPreviousOutput {
|
|
|
56
55
|
/**
|
|
57
56
|
* Roll a resource back to its prior state — an explicit, caller-composed
|
|
58
57
|
* compensation (not the auto-triggered per-capability `rollback`). Dispatches by
|
|
59
|
-
* the input shape: an ECS service (`{service, cluster}`) rolls to
|
|
60
|
-
* task definition; a snapshot (`{snapshotId, resource}`) restores that capture.
|
|
58
|
+
* the input shape: an ECS service (`{service, cluster, taskDefinition}`) rolls to
|
|
59
|
+
* that task definition, and fails without one (#2605); a snapshot (`{snapshotId, resource}`) restores that capture.
|
|
61
60
|
* An unrecognized shape fails with a clear message rather than a cryptic
|
|
62
61
|
* `undefined` access (chant #990 — an ECS-shaped input used to reach the
|
|
63
62
|
* snapshot path and throw "reading 'includes'" on the absent snapshotId).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/components/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAI5E,MAAM,WAAW,mBAAmB;IAClC,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,YAAY,EAAE,gBAAgB,GAAG,cAAc,GAAG,mBAAmB,GAAG,YAAY,CAAC;CACtF;AAED,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,GAAE,aAAsC,GAAG,UAAU,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAOtJ;AAED,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,EAAE,UAAU,CAAC,mBAAmB,EAAE,oBAAoB,CACzD,CAAC;AAInC,oFAAoF;AACpF,MAAM,WAAW,6BAA6B;IAC5C,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/components/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAI5E,MAAM,WAAW,mBAAmB;IAClC,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,YAAY,EAAE,gBAAgB,GAAG,cAAc,GAAG,mBAAmB,GAAG,YAAY,CAAC;CACtF;AAED,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,GAAE,aAAsC,GAAG,UAAU,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAOtJ;AAED,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,EAAE,UAAU,CAAC,mBAAmB,EAAE,oBAAoB,CACzD,CAAC;AAInC,oFAAoF;AACpF,MAAM,WAAW,6BAA6B;IAC5C,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,2DAA2D;AAC3D,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB;qFACiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;mEACmE;AACnE,MAAM,MAAM,qBAAqB,GAAG,6BAA6B,GAAG,wBAAwB,CAAC;AAE7F,MAAM,WAAW,sBAAsB;IACrC,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,GAAE,aAAsC,GAAG,UAAU,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CA6B5J;AAED,kFAAkF;AAClF,eAAO,MAAM,0BAA0B,EAAE,UAAU,CAAC,qBAAqB,EAAE,sBAAsB,CAC7D,CAAC"}
|
package/dist/integrity.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"algorithm": "sha256",
|
|
3
3
|
"artifacts": {
|
|
4
|
-
"manifest.json": "
|
|
4
|
+
"manifest.json": "f19fe2f05179243308b6447c40d9b506b0e626170a79db52881062656363b0cc",
|
|
5
5
|
"meta.json": "31795ba62a1da7503a8d55192c212ac44c56a56cdb2d4fde47966a1abc8b021b",
|
|
6
6
|
"types/index.d.ts": "1038589dccfc1e690e3373014bff4d319e4ed3b421db2448ed4e70d51eb9d1f2",
|
|
7
7
|
"rules/hardcoded-region.ts": "5a0eaf7ab391231fe6cd51426ece29539cb4b36f31c8dd060956638fed55722a",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"skills/chant-aws-eks.md": "8789255709ff004ad0a875fd5999edcdc66fc6e33d710db058d9f42703bcfdfe",
|
|
74
74
|
"skills/chant-aws-carve-terraform.md": "8780b94ce60aded935938d5ef20ea667738354051da1bf9ca6d70d9886f65d21"
|
|
75
75
|
},
|
|
76
|
-
"composite": "
|
|
76
|
+
"composite": "b6350be3017607b7a9df9f5e14614f34af3c0f817ffd9402cffe062f5524b36c"
|
|
77
77
|
}
|
package/dist/manifest.json
CHANGED
package/dist/spec/fetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/spec/fetch.ts"],"names":[],"mappings":"AAOA,OAAO,EAA+C,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/spec/fetch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intentius/chant-lexicon-aws",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.82.0",
|
|
4
4
|
"description": "AWS CloudFormation lexicon for chant — declarative IaC in TypeScript",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://intentius.io/chant",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"typescript": "^5.9.3"
|
|
81
81
|
},
|
|
82
82
|
"peerDependencies": {
|
|
83
|
-
"@intentius/chant": "^0.
|
|
83
|
+
"@intentius/chant": "^0.82.0",
|
|
84
84
|
"typescript": "^5.9.3"
|
|
85
85
|
}
|
|
86
86
|
}
|
|
@@ -252,8 +252,10 @@ export function createMockCloudExecutor(options: MockCloudExecutorOptions = {}):
|
|
|
252
252
|
async updateService(args: EcsUpdateServiceArgs) {
|
|
253
253
|
record("ecs", "updateService", args);
|
|
254
254
|
const key = `${args.cluster}/${args.service}`;
|
|
255
|
-
const
|
|
256
|
-
|
|
255
|
+
const current = ecsServices.get(key);
|
|
256
|
+
const desired = args.desiredCount ?? current?.desiredCount ?? 1;
|
|
257
|
+
const taskDefinition = args.taskDefinition ?? current?.taskDefinition;
|
|
258
|
+
ecsServices.set(key, { runningCount: desired, desiredCount: desired, stable: true, ...(taskDefinition ? { taskDefinition } : {}) });
|
|
257
259
|
return { deploymentId: `mock-deployment-${key}` };
|
|
258
260
|
},
|
|
259
261
|
async describeService(cluster: string, service: string) {
|
|
@@ -264,7 +266,9 @@ export function createMockCloudExecutor(options: MockCloudExecutorOptions = {}):
|
|
|
264
266
|
record("ecs", "rollbackService", args);
|
|
265
267
|
const key = `${args.cluster}/${args.service}`;
|
|
266
268
|
const current = ecsServices.get(key);
|
|
267
|
-
|
|
269
|
+
const desired = args.desiredCount ?? current?.desiredCount ?? 1;
|
|
270
|
+
const taskDefinition = args.taskDefinition ?? current?.taskDefinition;
|
|
271
|
+
ecsServices.set(key, { runningCount: desired, desiredCount: desired, stable: true, ...(taskDefinition ? { taskDefinition } : {}) });
|
|
268
272
|
},
|
|
269
273
|
async runTask(args: EcsRunTaskArgs) {
|
|
270
274
|
record("ecs", "runTask", args);
|
|
@@ -246,12 +246,31 @@ describe("ecs-update-service (#557)", () => {
|
|
|
246
246
|
expect(updateCall.args).toMatchObject({ cluster: "prod", service: "search", taskDefinition: "sha256:abc" });
|
|
247
247
|
});
|
|
248
248
|
|
|
249
|
-
it("
|
|
249
|
+
it("run records the task definition the service ran before the update, and rollback sends it (#2609)", async () => {
|
|
250
|
+
const mock = createMockCloudExecutor({
|
|
251
|
+
ecsServices: { "prod/search": { runningCount: 2, desiredCount: 2, stable: true, taskDefinition: "search:6" } },
|
|
252
|
+
});
|
|
253
|
+
const capability = createEcsUpdateServiceCapability(mock.executor);
|
|
254
|
+
const input = { cluster: "prod", service: "search", imageRef: "search:7", desiredCount: 4 };
|
|
255
|
+
const output = await capability.run(svcCtx, input);
|
|
256
|
+
expect(output).toMatchObject({ previousTaskDefinition: "search:6", previousDesiredCount: 2 });
|
|
257
|
+
expect(mock.calls.map((c) => c.method)).toEqual(["describeService", "updateService"]);
|
|
258
|
+
|
|
259
|
+
await capability.rollback!(svcCtx, input, output);
|
|
260
|
+
const rollbackCall = mock.calls.find((c) => c.method === "rollbackService")!;
|
|
261
|
+
expect(rollbackCall.args).toMatchObject({ taskDefinition: "search:6", desiredCount: 2 });
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it("rollback without a recorded previous task definition fails instead of re-sending the imageRef (#2605, #2609)", async () => {
|
|
250
265
|
const mock = createMockCloudExecutor();
|
|
251
266
|
const capability = createEcsUpdateServiceCapability(mock.executor);
|
|
252
|
-
expect(
|
|
253
|
-
|
|
254
|
-
|
|
267
|
+
await expect(capability.rollback!(svcCtx, { cluster: "prod", service: "search", imageRef: "search:7" })).rejects.toThrow(
|
|
268
|
+
/service "search" ran before the step was not recorded/,
|
|
269
|
+
);
|
|
270
|
+
await expect(capability.rollback!(svcCtx, { cluster: "prod", service: "search", desiredCount: 2 }, { deploymentId: "d" })).rejects.toThrow(
|
|
271
|
+
/service "search" ran before the step was not recorded/,
|
|
272
|
+
);
|
|
273
|
+
expect(mock.calls).toEqual([]);
|
|
255
274
|
});
|
|
256
275
|
});
|
|
257
276
|
|
package/src/components/apply.ts
CHANGED
|
@@ -251,16 +251,28 @@ export interface EcsUpdateServiceInput {
|
|
|
251
251
|
export interface EcsUpdateServiceOutput {
|
|
252
252
|
/** ARN of the new/updated service deployment. */
|
|
253
253
|
deploymentId: string;
|
|
254
|
+
/**
|
|
255
|
+
* The task definition the service ran before this step updated it, read with
|
|
256
|
+
* `describe-services` ahead of `update-service`. The rollback sends it back.
|
|
257
|
+
* Absent when the service could not be described or reported none (#2609).
|
|
258
|
+
*/
|
|
259
|
+
previousTaskDefinition?: string;
|
|
260
|
+
/** The service's desired count before this step, recorded only when the step sets `desiredCount`. */
|
|
261
|
+
previousDesiredCount?: number;
|
|
254
262
|
}
|
|
255
263
|
|
|
256
264
|
/**
|
|
257
265
|
* Roll a new task definition/image out to an ECS service via `UpdateService`.
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
* the
|
|
263
|
-
*
|
|
266
|
+
* Before the update, `run` reads the service with `describe-services` and
|
|
267
|
+
* records the task definition it was running in its output. The rollback sends
|
|
268
|
+
* that previous task definition back (and the previous desired count, when the
|
|
269
|
+
* step changed it). The step's own `imageRef` is never the rollback target:
|
|
270
|
+
* it is the revision the step just rolled out, so re-sending it restores
|
|
271
|
+
* nothing (#2609). When the previous task definition could not be read, the
|
|
272
|
+
* rollback fails with a message naming the service rather than report a
|
|
273
|
+
* restore that changed nothing (#2605). A component that needs a specific
|
|
274
|
+
* task definition restored can still give itself an explicit rollback phase,
|
|
275
|
+
* such as `rollback-previous` with that `taskDefinition`.
|
|
264
276
|
*/
|
|
265
277
|
export function createEcsUpdateServiceCapability(
|
|
266
278
|
executor: CloudExecutor = defaultCloudExecutor(),
|
|
@@ -268,6 +280,9 @@ export function createEcsUpdateServiceCapability(
|
|
|
268
280
|
return {
|
|
269
281
|
kind: "ecs-update-service",
|
|
270
282
|
async run(_ctx, input) {
|
|
283
|
+
// A failed read only costs the rollback its target; the forward update
|
|
284
|
+
// still runs, and the rollback then fails saying it has nothing to restore.
|
|
285
|
+
const before = await executor.ecs.describeService(input.cluster, input.service).catch(() => undefined);
|
|
271
286
|
const { deploymentId } = await executor.ecs.updateService({
|
|
272
287
|
cluster: input.cluster,
|
|
273
288
|
service: input.service,
|
|
@@ -275,14 +290,26 @@ export function createEcsUpdateServiceCapability(
|
|
|
275
290
|
desiredCount: input.desiredCount,
|
|
276
291
|
forceNewDeployment: input.forceNewDeployment,
|
|
277
292
|
});
|
|
278
|
-
return {
|
|
293
|
+
return {
|
|
294
|
+
deploymentId,
|
|
295
|
+
...(before?.taskDefinition ? { previousTaskDefinition: before.taskDefinition } : {}),
|
|
296
|
+
...(before && input.desiredCount !== undefined ? { previousDesiredCount: before.desiredCount } : {}),
|
|
297
|
+
};
|
|
279
298
|
},
|
|
280
|
-
async rollback(_ctx, input) {
|
|
299
|
+
async rollback(_ctx, input, output) {
|
|
300
|
+
const previous = output?.previousTaskDefinition;
|
|
301
|
+
if (!previous) {
|
|
302
|
+
throw new Error(
|
|
303
|
+
`ecs-update-service rollback: the task definition service "${input.service}" ran before the step ` +
|
|
304
|
+
`was not recorded, so there is nothing to roll back to; ` +
|
|
305
|
+
`give the component a rollback phase that names the taskDefinition`,
|
|
306
|
+
);
|
|
307
|
+
}
|
|
281
308
|
await executor.ecs.rollbackService({
|
|
282
309
|
cluster: input.cluster,
|
|
283
310
|
service: input.service,
|
|
284
|
-
taskDefinition:
|
|
285
|
-
desiredCount:
|
|
311
|
+
taskDefinition: previous,
|
|
312
|
+
desiredCount: output?.previousDesiredCount,
|
|
286
313
|
});
|
|
287
314
|
},
|
|
288
315
|
};
|
|
@@ -109,6 +109,8 @@ export interface EcsServiceState {
|
|
|
109
109
|
desiredCount: number;
|
|
110
110
|
/** True once `runningCount === desiredCount` and no deployments are in flight. */
|
|
111
111
|
stable: boolean;
|
|
112
|
+
/** The task definition the service is set to run, when the describe call reports one. */
|
|
113
|
+
taskDefinition?: string;
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
export interface EcsRunTaskArgs {
|
|
@@ -143,7 +145,7 @@ export interface EcsClient {
|
|
|
143
145
|
updateService(args: EcsUpdateServiceArgs): Promise<{ deploymentId: string }>;
|
|
144
146
|
/** Current running/desired counts for a service, used by `wait-steady-state`. */
|
|
145
147
|
describeService(cluster: string, service: string): Promise<EcsServiceState>;
|
|
146
|
-
/** Roll a service back to
|
|
148
|
+
/** Roll a service back to the given task definition (and count, if set) (saga compensation). Throws without a `taskDefinition`: the executor records no previous one. */
|
|
147
149
|
rollbackService(args: EcsUpdateServiceArgs): Promise<void>;
|
|
148
150
|
/** Run a one-off task (e.g. a DB migration) and return its arn for `waitForTask`. */
|
|
149
151
|
runTask(args: EcsRunTaskArgs): Promise<{ taskArn: string }>;
|
|
@@ -547,12 +549,25 @@ const realEcs: EcsClient = {
|
|
|
547
549
|
`aws ecs describe-services --cluster ${q(cluster)} --services ${q(service)}`,
|
|
548
550
|
);
|
|
549
551
|
const described = JSON.parse(stdout) as {
|
|
550
|
-
services
|
|
552
|
+
services?: Array<{ runningCount: number; desiredCount: number; deployments?: unknown[]; taskDefinition?: string }>;
|
|
553
|
+
};
|
|
554
|
+
const svc = described.services?.[0];
|
|
555
|
+
return {
|
|
556
|
+
runningCount: svc?.runningCount ?? 0,
|
|
557
|
+
desiredCount: svc?.desiredCount ?? 0,
|
|
558
|
+
stable: ecsServiceStable(svc),
|
|
559
|
+
...(svc?.taskDefinition ? { taskDefinition: svc.taskDefinition } : {}),
|
|
551
560
|
};
|
|
552
|
-
const svc = described.services[0];
|
|
553
|
-
return { runningCount: svc?.runningCount ?? 0, desiredCount: svc?.desiredCount ?? 0, stable: ecsServiceStable(svc) };
|
|
554
561
|
},
|
|
555
562
|
async rollbackService(args) {
|
|
563
|
+
// The executor records no previous task definition itself, so a rollback
|
|
564
|
+
// without one would leave the service as it is and still report success (#2605).
|
|
565
|
+
// Callers read it with describeService before they update (#2609).
|
|
566
|
+
if (!args.taskDefinition) {
|
|
567
|
+
throw new Error(
|
|
568
|
+
`ecs rollback of service "${args.service}" on "${args.cluster}" needs the taskDefinition to roll back to`,
|
|
569
|
+
);
|
|
570
|
+
}
|
|
556
571
|
await realEcs.updateService(args);
|
|
557
572
|
},
|
|
558
573
|
async runTask(args) {
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
// The real executor shells out through `exec`; record each command and answer
|
|
4
|
+
// `aws ecs update-service` with a minimal service, so these tests run the real
|
|
5
|
+
// executor's argument checks without an `aws` CLI (#2605).
|
|
6
|
+
const execMock = vi.fn<(cmd: string) => { stdout: string; stderr: string }>();
|
|
7
|
+
|
|
8
|
+
vi.mock("node:child_process", async () => {
|
|
9
|
+
const actual = await vi.importActual<typeof import("node:child_process")>("node:child_process");
|
|
10
|
+
return {
|
|
11
|
+
...actual,
|
|
12
|
+
exec: (
|
|
13
|
+
cmd: string,
|
|
14
|
+
optsOrCb: unknown,
|
|
15
|
+
maybeCb?: (err: Error | null, out: { stdout: string; stderr: string }) => void,
|
|
16
|
+
) => {
|
|
17
|
+
const cb = (typeof optsOrCb === "function" ? optsOrCb : maybeCb) as (
|
|
18
|
+
err: Error | null,
|
|
19
|
+
out: { stdout: string; stderr: string },
|
|
20
|
+
) => void;
|
|
21
|
+
try {
|
|
22
|
+
cb(null, execMock(cmd));
|
|
23
|
+
} catch (err) {
|
|
24
|
+
cb(err as Error, { stdout: "", stderr: "" });
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const { realCloudExecutor } = await import("./cloud-executor");
|
|
31
|
+
const { createRollbackPreviousCapability } = await import("./safety");
|
|
32
|
+
const { createEcsUpdateServiceCapability } = await import("./apply");
|
|
33
|
+
|
|
34
|
+
const ctx = { env: "dev", component: "search-service" };
|
|
35
|
+
const updateServiceReply = { stdout: JSON.stringify({ service: { deployments: [{ id: "ecs-svc/1" }] } }), stderr: "" };
|
|
36
|
+
const describeServicesReply = {
|
|
37
|
+
stdout: JSON.stringify({
|
|
38
|
+
services: [{ runningCount: 2, desiredCount: 2, deployments: [{}], taskDefinition: "arn:aws:ecs:us-east-1:1:task-definition/search:6" }],
|
|
39
|
+
}),
|
|
40
|
+
stderr: "",
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
execMock.mockReset();
|
|
45
|
+
execMock.mockImplementation((cmd) => (cmd.includes("describe-services") ? describeServicesReply : updateServiceReply));
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe("real ECS executor argument checks (#2605)", () => {
|
|
49
|
+
it("rollbackService without a taskDefinition throws and runs no aws command", async () => {
|
|
50
|
+
const executor = realCloudExecutor();
|
|
51
|
+
await expect(executor.ecs.rollbackService({ cluster: "prod", service: "search", desiredCount: 2 })).rejects.toThrow(
|
|
52
|
+
/needs the taskDefinition to roll back to/,
|
|
53
|
+
);
|
|
54
|
+
expect(execMock).not.toHaveBeenCalled();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("the forward updateService keeps accepting the preset's { cluster, service } shape", async () => {
|
|
58
|
+
// The ECS preset and the ALB/ECS pilot run ecs-update-service after a
|
|
59
|
+
// cfn-deploy that already changed the task definition; that forward step
|
|
60
|
+
// is unchanged here.
|
|
61
|
+
const out = await createEcsUpdateServiceCapability(realCloudExecutor()).run(ctx, { cluster: "prod", service: "search" });
|
|
62
|
+
expect(out.deploymentId).toBe("ecs-svc/1");
|
|
63
|
+
expect(execMock).toHaveBeenCalledTimes(2);
|
|
64
|
+
expect(execMock.mock.calls[1]![0]).toMatch(/ecs update-service /);
|
|
65
|
+
expect(execMock.mock.calls[1]![0]).not.toMatch(/--task-definition/);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe("rollback-previous on the real executor (#2605)", () => {
|
|
70
|
+
it("an ECS service without a taskDefinition fails and changes nothing", async () => {
|
|
71
|
+
const cap = createRollbackPreviousCapability(realCloudExecutor());
|
|
72
|
+
await expect(cap.run(ctx, { service: "search", cluster: "prod" })).rejects.toThrow(
|
|
73
|
+
/rollback-previous: ECS service "search" needs a taskDefinition to roll back to/,
|
|
74
|
+
);
|
|
75
|
+
expect(execMock).not.toHaveBeenCalled();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("an ECS service with a taskDefinition runs update-service with it and reports restored", async () => {
|
|
79
|
+
const cap = createRollbackPreviousCapability(realCloudExecutor());
|
|
80
|
+
const out = await cap.run(ctx, { service: "search", cluster: "prod", taskDefinition: "search:41" });
|
|
81
|
+
expect(out).toEqual({ restored: true });
|
|
82
|
+
expect(execMock).toHaveBeenCalledTimes(1);
|
|
83
|
+
expect(execMock.mock.calls[0]![0]).toMatch(/ecs update-service .*--task-definition '?search:41'?/);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
describe("ecs-update-service rollback on the real executor (#2605, #2609)", () => {
|
|
88
|
+
it("run reads the running task definition before update-service, and rollback sends that one, not the imageRef", async () => {
|
|
89
|
+
const cap = createEcsUpdateServiceCapability(realCloudExecutor());
|
|
90
|
+
const input = { cluster: "prod", service: "search", imageRef: "search:7" };
|
|
91
|
+
const out = await cap.run(ctx, input);
|
|
92
|
+
expect(execMock.mock.calls.map((c) => c[0].split(" ").slice(0, 3).join(" "))).toEqual([
|
|
93
|
+
"aws ecs describe-services",
|
|
94
|
+
"aws ecs update-service",
|
|
95
|
+
]);
|
|
96
|
+
expect(execMock.mock.calls[1]![0]).toMatch(/--task-definition '?search:7'?/);
|
|
97
|
+
expect(out.previousTaskDefinition).toBe("arn:aws:ecs:us-east-1:1:task-definition/search:6");
|
|
98
|
+
|
|
99
|
+
execMock.mockClear();
|
|
100
|
+
await cap.rollback!(ctx, input, out);
|
|
101
|
+
expect(execMock).toHaveBeenCalledTimes(1);
|
|
102
|
+
const sent = execMock.mock.calls[0]![0];
|
|
103
|
+
expect(sent).toMatch(/ecs update-service .*--task-definition '?arn:aws:ecs:us-east-1:1:task-definition\/search:6'?/);
|
|
104
|
+
expect(sent).not.toMatch(/search:7/);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("when describe-services fails, the update still runs and the rollback fails naming the service", async () => {
|
|
108
|
+
execMock.mockImplementation((cmd) => {
|
|
109
|
+
if (cmd.includes("describe-services")) throw new Error("AccessDeniedException: ecs:DescribeServices");
|
|
110
|
+
return updateServiceReply;
|
|
111
|
+
});
|
|
112
|
+
const cap = createEcsUpdateServiceCapability(realCloudExecutor());
|
|
113
|
+
const input = { cluster: "prod", service: "search", imageRef: "search:7" };
|
|
114
|
+
const out = await cap.run(ctx, input);
|
|
115
|
+
expect(out).toEqual({ deploymentId: "ecs-svc/1" });
|
|
116
|
+
|
|
117
|
+
execMock.mockClear();
|
|
118
|
+
await expect(cap.rollback!(ctx, input, out)).rejects.toThrow(
|
|
119
|
+
/ecs-update-service rollback: the task definition service "search" ran before the step was not recorded/,
|
|
120
|
+
);
|
|
121
|
+
expect(execMock).not.toHaveBeenCalled();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("when describe-services reports no task definition, the rollback fails and runs no aws command", async () => {
|
|
125
|
+
execMock.mockImplementation((cmd) =>
|
|
126
|
+
cmd.includes("describe-services") ? { stdout: JSON.stringify({ services: [] }), stderr: "" } : updateServiceReply,
|
|
127
|
+
);
|
|
128
|
+
const cap = createEcsUpdateServiceCapability(realCloudExecutor());
|
|
129
|
+
const input = { cluster: "prod", service: "search", imageRef: "search:7" };
|
|
130
|
+
const out = await cap.run(ctx, input);
|
|
131
|
+
execMock.mockClear();
|
|
132
|
+
await expect(cap.rollback!(ctx, input, out)).rejects.toThrow(/service "search" ran before the step was not recorded/);
|
|
133
|
+
expect(execMock).not.toHaveBeenCalled();
|
|
134
|
+
});
|
|
135
|
+
});
|
|
@@ -447,19 +447,19 @@ describe("Every mutating #557 capability declares a rollback, or the pilot suppl
|
|
|
447
447
|
});
|
|
448
448
|
|
|
449
449
|
it("the ALB/ECS pilot declares no rollback-previous phase (#2576): with no taskDefinition it restored nothing", async () => {
|
|
450
|
-
// The phase it used to declare passed only `service` and `cluster`.
|
|
451
|
-
// real
|
|
452
|
-
//
|
|
453
|
-
//
|
|
450
|
+
// The phase it used to declare passed only `service` and `cluster`. That
|
|
451
|
+
// input used to reach the real executor as an `aws ecs update-service` that
|
|
452
|
+
// changed nothing; it now fails (#2605). An earlier release is
|
|
453
|
+
// `chant components rollback`.
|
|
454
454
|
expect(searchService.rollback).toBeUndefined();
|
|
455
455
|
const mock = createMockCloudExecutor();
|
|
456
|
-
await
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
]);
|
|
456
|
+
await expect(
|
|
457
|
+
createRollbackPreviousCapability(mock.executor).run(
|
|
458
|
+
{ env: "dev", component: "search-service" },
|
|
459
|
+
{ service: "search", cluster: "prod" },
|
|
460
|
+
),
|
|
461
|
+
).rejects.toThrow(/needs a taskDefinition/);
|
|
462
|
+
expect(mock.calls).toEqual([]);
|
|
463
463
|
});
|
|
464
464
|
|
|
465
465
|
it("the DynamoDB pilot declares no component-level rollback — a blocked replacement is a stop, not something to compensate (documented opt-out)", () => {
|
|
@@ -41,22 +41,29 @@ describe("rollback-previous (#557)", () => {
|
|
|
41
41
|
]);
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
it("rolls an ECS service back
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
// throw "Cannot read properties of undefined (reading 'includes')" on the
|
|
48
|
-
// absent snapshotId.
|
|
44
|
+
it("rolls an ECS service back to the named taskDefinition for the {service, cluster} shape (#990)", async () => {
|
|
45
|
+
// An ECS-shaped input used to reach the snapshot path and throw "Cannot
|
|
46
|
+
// read properties of undefined (reading 'includes')" on the absent snapshotId.
|
|
49
47
|
const mock = createMockCloudExecutor();
|
|
50
48
|
const out = await createRollbackPreviousCapability(mock.executor).run(ctx, {
|
|
51
49
|
service: "loom-frontend-svc",
|
|
52
50
|
cluster: "arn:aws:ecs:us-east-1:1:cluster/loom",
|
|
51
|
+
taskDefinition: "loom-frontend:41",
|
|
53
52
|
});
|
|
54
53
|
expect(out).toEqual({ restored: true });
|
|
55
54
|
expect(mock.calls).toEqual([
|
|
56
|
-
{ client: "ecs", method: "rollbackService", args: { cluster: "arn:aws:ecs:us-east-1:1:cluster/loom", service: "loom-frontend-svc", taskDefinition:
|
|
55
|
+
{ client: "ecs", method: "rollbackService", args: { cluster: "arn:aws:ecs:us-east-1:1:cluster/loom", service: "loom-frontend-svc", taskDefinition: "loom-frontend:41", desiredCount: undefined } },
|
|
57
56
|
]);
|
|
58
57
|
});
|
|
59
58
|
|
|
59
|
+
it("fails for an ECS service without a taskDefinition instead of reporting restored (#2605)", async () => {
|
|
60
|
+
const mock = createMockCloudExecutor();
|
|
61
|
+
await expect(
|
|
62
|
+
createRollbackPreviousCapability(mock.executor).run(ctx, { service: "loom-frontend-svc", cluster: "loom" }),
|
|
63
|
+
).rejects.toThrow(/needs a taskDefinition to roll back to/);
|
|
64
|
+
expect(mock.calls).toEqual([]);
|
|
65
|
+
});
|
|
66
|
+
|
|
60
67
|
it("fails with a clear message (not a cryptic undefined access) for an unrecognized shape", async () => {
|
|
61
68
|
const cap = createRollbackPreviousCapability(createMockCloudExecutor().executor);
|
|
62
69
|
await expect(cap.run(ctx, {} as never)).rejects.toThrow(/expected \{ service, cluster \}|\{ snapshotId, resource \}/);
|
package/src/components/safety.ts
CHANGED
|
@@ -53,15 +53,14 @@ export interface RollbackPreviousSnapshotInput {
|
|
|
53
53
|
resource: string;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
/** Roll an ECS service back to
|
|
57
|
-
* shape the `ecs-fargate` preset and the ALB/ECS pilot compose for an
|
|
58
|
-
* ALB-fronted frontend service. */
|
|
56
|
+
/** Roll an ECS service back to a named task definition. */
|
|
59
57
|
export interface RollbackPreviousEcsInput {
|
|
60
58
|
/** ECS service name. */
|
|
61
59
|
service: string;
|
|
62
60
|
/** ECS cluster (name or ARN). */
|
|
63
61
|
cluster: string;
|
|
64
|
-
/**
|
|
62
|
+
/** Task definition to roll back to (family:revision or ARN). Required: nothing
|
|
63
|
+
* records a service's previous task definition, so the step fails without it. */
|
|
65
64
|
taskDefinition?: string;
|
|
66
65
|
desiredCount?: number;
|
|
67
66
|
}
|
|
@@ -78,8 +77,8 @@ export interface RollbackPreviousOutput {
|
|
|
78
77
|
/**
|
|
79
78
|
* Roll a resource back to its prior state — an explicit, caller-composed
|
|
80
79
|
* compensation (not the auto-triggered per-capability `rollback`). Dispatches by
|
|
81
|
-
* the input shape: an ECS service (`{service, cluster}`) rolls to
|
|
82
|
-
* task definition; a snapshot (`{snapshotId, resource}`) restores that capture.
|
|
80
|
+
* the input shape: an ECS service (`{service, cluster, taskDefinition}`) rolls to
|
|
81
|
+
* that task definition, and fails without one (#2605); a snapshot (`{snapshotId, resource}`) restores that capture.
|
|
83
82
|
* An unrecognized shape fails with a clear message rather than a cryptic
|
|
84
83
|
* `undefined` access (chant #990 — an ECS-shaped input used to reach the
|
|
85
84
|
* snapshot path and throw "reading 'includes'" on the absent snapshotId).
|
|
@@ -89,6 +88,12 @@ export function createRollbackPreviousCapability(executor: CloudExecutor = defau
|
|
|
89
88
|
kind: "rollback-previous",
|
|
90
89
|
async run(_ctx, input) {
|
|
91
90
|
if ("service" in input && input.service) {
|
|
91
|
+
if (!input.taskDefinition) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`rollback-previous: ECS service "${input.service}" needs a taskDefinition to roll back to; ` +
|
|
94
|
+
`nothing records the previous one. For an earlier release use \`chant components rollback\``,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
92
97
|
await executor.ecs.rollbackService({
|
|
93
98
|
cluster: input.cluster,
|
|
94
99
|
service: input.service,
|
package/src/spec/fetch.ts
CHANGED
|
@@ -7,6 +7,9 @@ import { fetchWithCache, extractFromZip, clearCacheFile } from "@intentius/chant
|
|
|
7
7
|
import { RELEASE_GATE_ENV } from "@intentius/chant/codegen/validate";
|
|
8
8
|
import { ACCEPT_ENV, AWS_SPEC_PIN, specContentDigest, type SpecPin } from "./pin";
|
|
9
9
|
|
|
10
|
+
/** Per-attempt download timeout for a multi-megabyte archive. */
|
|
11
|
+
const ARCHIVE_ATTEMPT_TIMEOUT_MS = 120_000;
|
|
12
|
+
|
|
10
13
|
/**
|
|
11
14
|
* Top-level CloudFormation Registry JSON Schema for a single resource type.
|
|
12
15
|
*/
|
|
@@ -232,7 +235,7 @@ export async function fetchSchemaZip(
|
|
|
232
235
|
console.error(`pinned spec asset unavailable (${pinAssetUrl()}); falling back to the live CloudFormation archive`);
|
|
233
236
|
}
|
|
234
237
|
const zipData = await fetchWithCache(
|
|
235
|
-
{ url: SCHEMA_ZIP_URL, cacheFile: CACHE_FILE },
|
|
238
|
+
{ url: SCHEMA_ZIP_URL, cacheFile: CACHE_FILE, attemptTimeoutMs: ARCHIVE_ATTEMPT_TIMEOUT_MS },
|
|
236
239
|
force || accepting,
|
|
237
240
|
);
|
|
238
241
|
const schemas = await extractRawSchemas(zipData);
|