@aws-cdk-testing/cli-integ 3.1.1 → 3.1.2
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/lib/aws.d.ts +8 -2
- package/lib/aws.js +22 -8
- package/lib/aws.ts +28 -10
- package/lib/cli/run-suite.js +2 -1
- package/lib/cli/run-suite.ts +1 -1
- package/lib/cli/stage-distribution.js +1 -1
- package/lib/cli/stage-distribution.ts +0 -5
- package/lib/github.js +1 -2
- package/lib/github.ts +1 -1
- package/lib/integ-test.d.ts +1 -0
- package/lib/integ-test.js +3 -2
- package/lib/integ-test.ts +4 -1
- package/lib/package-sources/release-source.js +1 -1
- package/lib/package-sources/release-source.ts +2 -1
- package/lib/package-sources/repo-source.d.ts +4 -4
- package/lib/package-sources/repo-source.js +5 -5
- package/lib/package-sources/repo-source.ts +6 -5
- package/lib/proxy.d.ts +13 -0
- package/lib/proxy.js +49 -0
- package/lib/proxy.ts +64 -0
- package/lib/with-aws.d.ts +3 -0
- package/lib/with-aws.js +54 -6
- package/lib/with-aws.ts +52 -5
- package/lib/with-cdk-app.d.ts +11 -0
- package/lib/with-cdk-app.js +63 -34
- package/lib/with-cdk-app.ts +75 -45
- package/lib/with-cli-lib.js +9 -5
- package/lib/with-cli-lib.ts +10 -4
- package/lib/with-sam.js +2 -1
- package/lib/with-sam.ts +1 -0
- package/package.json +3 -2
- package/resources/integ.jest.config.js +4 -1
- package/tests/cli-integ-tests/bootstrapping.integtest.js +1 -1
- package/tests/cli-integ-tests/bootstrapping.integtest.ts +0 -1
- package/tests/cli-integ-tests/cli.integtest.js +14 -37
- package/tests/cli-integ-tests/cli.integtest.ts +15 -49
- package/tests/cli-integ-tests/proxy.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/proxy.integtest.js +147 -0
- package/tests/cli-integ-tests/proxy.integtest.ts +167 -0
- package/tests/init-javascript/init-javascript.integtest.js +1 -1
- package/tests/init-javascript/init-javascript.integtest.ts +0 -1
- package/tests/init-typescript-app/init-typescript-app.integtest.js +2 -2
- package/tests/init-typescript-app/init-typescript-app.integtest.ts +1 -1
|
@@ -68,4 +68,4 @@ class ReleasePackageSource {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
exports.ReleasePackageSource = ReleasePackageSource;
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsZWFzZS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZWxlYXNlLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUUvQixvQ0FBaUQ7QUFDakQsb0NBQXlEO0FBRXpELE1BQWEseUJBQXlCO0lBTXBDLFlBQTZCLE9BQWUsRUFBbUIsZ0JBQXlCO1FBQTNELFlBQU8sR0FBUCxPQUFPLENBQVE7UUFBbUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFTO1FBTC9FLFNBQUksR0FBRyxTQUFTLENBQUM7UUFNeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU87O1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWhELE1BQU0sSUFBQSxhQUFLLEVBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtZQUNsRixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEdBQUcsTUFBQSxJQUFJLENBQUMsZ0JBQWdCLG1DQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUEsY0FBTSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNUJELDhEQTRCQztBQUVELE1BQWEsb0JBQW9CO0lBSS9CO1FBQ0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBUSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCO1FBQzNCLElBQUEsc0JBQWMsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLDJCQUEyQjtJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLHdCQUF3QixDQUFDLFVBQWtCO1FBQ3RELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUEsNkJBQXFCLEVBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNILENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFXLENBQUM7SUFDOUMsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVNLHlCQUF5QjtRQUM5QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWtCLENBQUM7SUFDeEMsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzFELElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdEMseUJBQXlCO1lBQ3pCLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM3RCxDQUFDO2FBQU0sQ0FBQztZQUNOLHVCQUF1QjtZQUN2QixPQUFPLEdBQUcsZ0JBQWdCLFVBQVUsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNUNELG9EQTRDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBJUGFja2FnZVNvdXJjZVNldHVwLCBJUGFja2FnZVNvdXJjZSB9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB7IGNvcHlEaXJlY3RvcnlDb250ZW50cyB9IGZyb20gJy4uL2ZpbGVzJztcbmltcG9ydCB7IHNoZWxsLCByaW1yYWYsIGFkZFRvU2hlbGxQYXRoIH0gZnJvbSAnLi4vc2hlbGwnO1xuXG5leHBvcnQgY2xhc3MgUmVsZWFzZVBhY2thZ2VTb3VyY2VTZXR1cCBpbXBsZW1lbnRzIElQYWNrYWdlU291cmNlU2V0dXAge1xuICByZWFkb25seSBuYW1lID0gJ3JlbGVhc2UnO1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIHByaXZhdGUgdGVtcERpcj86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBmcmFtZXdvcmtWZXJzaW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGByZWxlYXNlIEAgJHt0aGlzLnZlcnNpb259YDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwcmVwYXJlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudGVtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3RtcGNkaycpKTtcbiAgICBmcy5ta2RpclN5bmModGhpcy50ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGF3YWl0IHNoZWxsKFsnbm9kZScsIHJlcXVpcmUucmVzb2x2ZSgnbnBtJyksICdpbnN0YWxsJywgYGF3cy1jZGtAJHt0aGlzLnZlcnNpb259YF0sIHtcbiAgICAgIGN3ZDogdGhpcy50ZW1wRGlyLFxuICAgIH0pO1xuXG4gICAgcHJvY2Vzcy5lbnYuQ0RLX0NMSV9QQVRIID0gdGhpcy50ZW1wRGlyO1xuICAgIHByb2Nlc3MuZW52LlZFUlNJT04gPSB0aGlzLnZlcnNpb247XG4gICAgcHJvY2Vzcy5lbnYuRlJBTUVXT1JLX1ZFUlNJT04gPSB0aGlzLmZyYW1ld29ya1ZlcnNpb24gPz8gdGhpcy52ZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFudXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudGVtcERpcikge1xuICAgICAgcmltcmFmKHRoaXMudGVtcERpcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxlYXNlUGFja2FnZVNvdXJjZSBpbXBsZW1lbnRzIElQYWNrYWdlU291cmNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGlQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2xpUGF0aCA9IHByb2Nlc3MuZW52LkNES19DTElfUEFUSCE7XG4gICAgdGhpcy52ZXJzaW9uID0gcHJvY2Vzcy5lbnYuVkVSU0lPTiE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbWFrZUNsaUF2YWlsYWJsZSgpIHtcbiAgICBhZGRUb1NoZWxsUGF0aChwYXRoLmpvaW4odGhpcy5jbGlQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKSk7XG4gIH1cblxuICBwdWJsaWMgYXNzZXJ0SnNpaVBhY2thZ2VzQXZhaWxhYmxlKCkge1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemVEb3RuZXRQYWNrYWdlcyhjdXJyZW50RGlyOiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ1dEX0ZJTEVTX0RJUikge1xuICAgICAgYXdhaXQgY29weURpcmVjdG9yeUNvbnRlbnRzKHByb2Nlc3MuZW52LkNXRF9GSUxFU19ESVIsIGN1cnJlbnREaXIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtYWpvclZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvbi5zcGxpdCgnLicpWzBdIGFzIHN0cmluZztcbiAgfVxuXG4gIHB1YmxpYyByZXF1ZXN0ZWRDbGlWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgcmVxdWVzdGVkRnJhbWV3b3JrVmVyc2lvbigpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuRlJBTUVXT1JLX1ZFUlNJT04hO1xuICB9XG5cbiAgcHVibGljIHJlcXVlc3RlZEFscGhhVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZyYW1ld29ya1ZlcnNpb24gPSB0aGlzLnJlcXVlc3RlZEZyYW1ld29ya1ZlcnNpb24oKTtcbiAgICBpZiAoZnJhbWV3b3JrVmVyc2lvbi5pbmNsdWRlcygnLXJjLicpKSB7XG4gICAgICAvLyBGb3IgYSBwaXBlbGluZSByZWxlYXNlXG4gICAgICByZXR1cm4gZnJhbWV3b3JrVmVyc2lvbi5yZXBsYWNlKC8tcmNcXC5cXGQrJC8sICctYWxwaGEuOTk5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhIHN0YWJsZSByZWxlYXNlXG4gICAgICByZXR1cm4gYCR7ZnJhbWV3b3JrVmVyc2lvbn0tYWxwaGEuMGA7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -7,11 +7,12 @@ import { shell, rimraf, addToShellPath } from '../shell';
|
|
|
7
7
|
|
|
8
8
|
export class ReleasePackageSourceSetup implements IPackageSourceSetup {
|
|
9
9
|
readonly name = 'release';
|
|
10
|
-
readonly description
|
|
10
|
+
readonly description: string;
|
|
11
11
|
|
|
12
12
|
private tempDir?: string;
|
|
13
13
|
|
|
14
14
|
constructor(private readonly version: string, private readonly frameworkVersion?: string) {
|
|
15
|
+
this.description = `release @ ${this.version}`;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
public async prepare(): Promise<void> {
|
|
@@ -19,10 +19,10 @@ export declare class RepoPackageSource implements IPackageSource {
|
|
|
19
19
|
requestedAlphaVersion(): string;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
* Return a { name -> directory } packages found in a Yarn monorepo
|
|
23
|
+
*
|
|
24
|
+
* Cached in YARN_MONOREPO_CACHE.
|
|
25
|
+
*/
|
|
26
26
|
export declare function findYarnPackages(root: string): Promise<Record<string, string>>;
|
|
27
27
|
/**
|
|
28
28
|
* Find the root directory of the repo from the current directory
|
|
@@ -64,10 +64,10 @@ async function writePackageMap(repoRoot) {
|
|
|
64
64
|
*/
|
|
65
65
|
const YARN_MONOREPO_CACHE = {};
|
|
66
66
|
/**
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
* Return a { name -> directory } packages found in a Yarn monorepo
|
|
68
|
+
*
|
|
69
|
+
* Cached in YARN_MONOREPO_CACHE.
|
|
70
|
+
*/
|
|
71
71
|
async function findYarnPackages(root) {
|
|
72
72
|
if (!(root in YARN_MONOREPO_CACHE)) {
|
|
73
73
|
const outputDataString = JSON.parse(await (0, shell_1.shell)(['yarn', 'workspaces', '--json', 'info'], {
|
|
@@ -94,4 +94,4 @@ async function autoFindRoot() {
|
|
|
94
94
|
}
|
|
95
95
|
return path.dirname(found);
|
|
96
96
|
}
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwby1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZXBvLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrRkEsNENBZ0JDO0FBS0Qsb0NBTUM7QUE3R0QseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFFL0Isb0NBQWtDO0FBQ2xDLG9DQUFpRDtBQUVqRCxNQUFhLHNCQUFzQjtJQUlqQyxZQUE2QixRQUFnQjtRQUFoQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBSHBDLFNBQUksR0FBRyxNQUFNLENBQUM7UUFJckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQztJQUM5QyxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU87UUFDbEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xJLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSwwQ0FBMEMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLElBQUEsc0JBQWMsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTztJQUNwQixDQUFDO0NBQ0Y7QUFwQkQs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QUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IElQYWNrYWdlU291cmNlU2V0dXAsIElQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9zb3VyY2UnO1xuaW1wb3J0IHsgZmluZFVwIH0gZnJvbSAnLi4vZmlsZXMnO1xuaW1wb3J0IHsgc2hlbGwsIGFkZFRvU2hlbGxQYXRoIH0gZnJvbSAnLi4vc2hlbGwnO1xuXG5leHBvcnQgY2xhc3MgUmVwb1BhY2thZ2VTb3VyY2VTZXR1cCBpbXBsZW1lbnRzIElQYWNrYWdlU291cmNlU2V0dXAge1xuICByZWFkb25seSBuYW1lID0gJ3JlcG8nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVwb1Jvb3Q6IHN0cmluZykge1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgcmVwbygke3RoaXMucmVwb1Jvb3R9KWA7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMocGF0aC5qb2luKHRoaXMucmVwb1Jvb3QsICdwYWNrYWdlLmpzb24nKSkgfHwgIWF3YWl0IGZzLnBhdGhFeGlzdHMocGF0aC5qb2luKHRoaXMucmVwb1Jvb3QsICd5YXJuLmxvY2snKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLnJlcG9Sb290fTogZG9lcyBub3QgbG9vayBsaWtlIHRoZSByZXBvc2l0b3J5IHJvb3RgKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVudi5SRVBPX1JPT1QgPSB0aGlzLnJlcG9Sb290O1xuICAgIHByb2Nlc3MuZW52LlJFUE9fUEFDS0FHRV9NQVAgPSBhd2FpdCB3cml0ZVBhY2thZ2VNYXAodGhpcy5yZXBvUm9vdCk7XG4gICAgYWRkVG9TaGVsbFBhdGgocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3JlcG8tdG9vbHMnKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVwb1BhY2thZ2VTb3VyY2UgaW1wbGVtZW50cyBJUGFja2FnZVNvdXJjZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb1Jvb3Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlcG9Sb290ID0gcHJvY2Vzcy5lbnYuUkVQT19ST09UIGFzIHN0cmluZztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBtYWtlQ2xpQXZhaWxhYmxlKCkge1xuICAgIGFkZFRvU2hlbGxQYXRoKHBhdGguam9pbih0aGlzLnJlcG9Sb290LCAncGFja2FnZXMnLCAnYXdzLWNkaycsICdiaW4nKSk7XG4gIH1cblxuICBwdWJsaWMgYXNzZXJ0SnNpaVBhY2thZ2VzQXZhaWxhYmxlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignanNpaSBjbGllbnQgcGFja2FnZXMgYXJlIG5vdCBhdmFpbGFibGUgd2hlbiB1c2luZyBSRVBPIHNvdXJjZScpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemVEb3RuZXRQYWNrYWdlcygpIHtcbiAgfVxuXG4gIHB1YmxpYyBtYWpvclZlcnNpb24oKSB7XG4gICAgY29uc3QgcmVsZWFzZUpzb24gPSBmcy5yZWFkSnNvblN5bmMocGF0aC5yZXNvbHZlKHRoaXMucmVwb1Jvb3QsICdyZWxlYXNlLmpzb24nKSk7XG4gICAgcmV0dXJuIHJlbGVhc2VKc29uLm1ham9yVmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXF1ZXN0ZWRDbGlWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcqJztcbiAgfVxuXG4gIHB1YmxpYyByZXF1ZXN0ZWRGcmFtZXdvcmtWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcqJztcbiAgfVxuXG4gIHB1YmxpYyByZXF1ZXN0ZWRBbHBoYVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyonO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUGFja2FnZU1hcChyZXBvUm9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGFja2FnZXMgPSBhd2FpdCBmaW5kWWFyblBhY2thZ2VzKHJlcG9Sb290KTtcbiAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksICdwYWNrYWdlLW1hcC5qc29uJyk7XG4gIGF3YWl0IGZzLndyaXRlSnNvbihmaWxlTmFtZSwgcGFja2FnZXMpO1xuICByZXR1cm4gZmlsZU5hbWU7XG59XG5cbi8qKlxuICogQ2FjaGUgbW9ub3JlcG8gZGlzY292ZXJ5IHJlc3VsdHMsIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uY2UgcGVyIHJ1blxuICovXG5jb25zdCBZQVJOX01PTk9SRVBPX0NBQ0hFOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbi8qKlxuICogUmV0dXJuIGEgeyBuYW1lIC0+IGRpcmVjdG9yeSB9IHBhY2thZ2VzIGZvdW5kIGluIGEgWWFybiBtb25vcmVwb1xuICpcbiAqIENhY2hlZCBpbiBZQVJOX01PTk9SRVBPX0NBQ0hFLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZFlhcm5QYWNrYWdlcyhyb290OiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgaWYgKCEocm9vdCBpbiBZQVJOX01PTk9SRVBPX0NBQ0hFKSkge1xuICAgIGNvbnN0IG91dHB1dERhdGFTdHJpbmc6IHN0cmluZyA9IEpTT04ucGFyc2UoYXdhaXQgc2hlbGwoWyd5YXJuJywgJ3dvcmtzcGFjZXMnLCAnLS1qc29uJywgJ2luZm8nXSwge1xuICAgICAgY2FwdHVyZVN0ZGVycjogZmFsc2UsXG4gICAgICBjd2Q6IHJvb3QsXG4gICAgICBzaG93OiAnZXJyb3InLFxuICAgIH0pKS5kYXRhO1xuICAgIGNvbnN0IG91dHB1dDogWWFybldvcmtzcGFjZXNPdXRwdXQgPSBKU09OLnBhcnNlKG91dHB1dERhdGFTdHJpbmcpO1xuXG4gICAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0KSkge1xuICAgICAgcmV0W2tdID0gcGF0aC5qb2luKHJvb3QsIHYubG9jYXRpb24pO1xuICAgIH1cbiAgICBZQVJOX01PTk9SRVBPX0NBQ0hFW3Jvb3RdID0gcmV0O1xuICB9XG4gIHJldHVybiBZQVJOX01PTk9SRVBPX0NBQ0hFW3Jvb3RdO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSByZXBvIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRvRmluZFJvb3QoKSB7XG4gIGNvbnN0IGZvdW5kID0gZmluZFVwKCdyZWxlYXNlLmpzb24nKTtcbiAgaWYgKCFmb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSByZXBvc2l0b3J5IHJvb3Q6ICdyZWxlYXNlLmpzb24nIG5vdCBmb3VuZCBmcm9tICR7cHJvY2Vzcy5jd2QoKX1gKTtcbiAgfVxuICByZXR1cm4gcGF0aC5kaXJuYW1lKGZvdW5kKTtcbn1cblxudHlwZSBZYXJuV29ya3NwYWNlc091dHB1dCA9IFJlY29yZDxzdHJpbmcsIHsgbG9jYXRpb246IHN0cmluZyB9PjtcbiJdfQ==
|
|
@@ -7,9 +7,10 @@ import { shell, addToShellPath } from '../shell';
|
|
|
7
7
|
|
|
8
8
|
export class RepoPackageSourceSetup implements IPackageSourceSetup {
|
|
9
9
|
readonly name = 'repo';
|
|
10
|
-
readonly description
|
|
10
|
+
readonly description: string;
|
|
11
11
|
|
|
12
12
|
constructor(private readonly repoRoot: string) {
|
|
13
|
+
this.description = `repo(${this.repoRoot})`;
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
public async prepare(): Promise<void> {
|
|
@@ -75,10 +76,10 @@ async function writePackageMap(repoRoot: string): Promise<string> {
|
|
|
75
76
|
const YARN_MONOREPO_CACHE: Record<string, any> = {};
|
|
76
77
|
|
|
77
78
|
/**
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
* Return a { name -> directory } packages found in a Yarn monorepo
|
|
80
|
+
*
|
|
81
|
+
* Cached in YARN_MONOREPO_CACHE.
|
|
82
|
+
*/
|
|
82
83
|
export async function findYarnPackages(root: string): Promise<Record<string, string>> {
|
|
83
84
|
if (!(root in YARN_MONOREPO_CACHE)) {
|
|
84
85
|
const outputDataString: string = JSON.parse(await shell(['yarn', 'workspaces', '--json', 'info'], {
|
package/lib/proxy.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as mockttp from 'mockttp';
|
|
2
|
+
import { CompletedRequest } from 'mockttp';
|
|
3
|
+
export declare function startProxyServer(certDirRoot?: string): Promise<ProxyServer>;
|
|
4
|
+
export interface ProxyServer {
|
|
5
|
+
readonly certPath: string;
|
|
6
|
+
readonly keyPath: string;
|
|
7
|
+
readonly server: mockttp.Mockttp;
|
|
8
|
+
readonly url: string;
|
|
9
|
+
readonly port: number;
|
|
10
|
+
getSeenRequests(): Promise<CompletedRequest[]>;
|
|
11
|
+
stop(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare function awsActionsFromRequests(requests: CompletedRequest[]): string[];
|
package/lib/proxy.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startProxyServer = startProxyServer;
|
|
4
|
+
exports.awsActionsFromRequests = awsActionsFromRequests;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const querystring = require("node:querystring");
|
|
7
|
+
const os = require("os");
|
|
8
|
+
const path = require("path");
|
|
9
|
+
const mockttp = require("mockttp");
|
|
10
|
+
async function startProxyServer(certDirRoot) {
|
|
11
|
+
const certDir = await fs_1.promises.mkdtemp(path.join(certDirRoot !== null && certDirRoot !== void 0 ? certDirRoot : os.tmpdir(), 'cdk-'));
|
|
12
|
+
const certPath = path.join(certDir, 'cert.pem');
|
|
13
|
+
const keyPath = path.join(certDir, 'key.pem');
|
|
14
|
+
// Set up key and certificate
|
|
15
|
+
const { key, cert } = await mockttp.generateCACertificate();
|
|
16
|
+
await fs_1.promises.writeFile(keyPath, key);
|
|
17
|
+
await fs_1.promises.writeFile(certPath, cert);
|
|
18
|
+
const server = mockttp.getLocal({
|
|
19
|
+
https: { keyPath: keyPath, certPath: certPath },
|
|
20
|
+
});
|
|
21
|
+
// We don't need to modify any request, so the proxy
|
|
22
|
+
// passes through all requests to the target host.
|
|
23
|
+
const endpoint = await server
|
|
24
|
+
.forAnyRequest()
|
|
25
|
+
.thenPassThrough();
|
|
26
|
+
const port = 9000 + Math.floor(Math.random() * 10000);
|
|
27
|
+
// server.enableDebug();
|
|
28
|
+
await server.start(port);
|
|
29
|
+
return {
|
|
30
|
+
certPath,
|
|
31
|
+
keyPath,
|
|
32
|
+
server,
|
|
33
|
+
url: server.url,
|
|
34
|
+
port: server.port,
|
|
35
|
+
getSeenRequests: () => endpoint.getSeenRequests(),
|
|
36
|
+
async stop() {
|
|
37
|
+
await server.stop();
|
|
38
|
+
await fs_1.promises.rm(certDir, { recursive: true, force: true });
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function awsActionsFromRequests(requests) {
|
|
43
|
+
return [...new Set(requests
|
|
44
|
+
.map(req => req.body.buffer.toString('utf-8'))
|
|
45
|
+
.map(body => querystring.decode(body))
|
|
46
|
+
.map(x => x.Action)
|
|
47
|
+
.filter(action => action != null))];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLDRDQXFDQztBQWFELHdEQU1DO0FBL0RELDJCQUFvQztBQUNwQyxnREFBZ0Q7QUFDaEQseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QixtQ0FBbUM7QUFHNUIsS0FBSyxVQUFVLGdCQUFnQixDQUFDLFdBQW9CO0lBQ3pELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsYUFBWCxXQUFXLGNBQVgsV0FBVyxHQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLDZCQUE2QjtJQUM3QixNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDNUQsTUFBTSxhQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqQyxNQUFNLGFBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRW5DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDOUIsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0tBQ2hELENBQUMsQ0FBQztJQUVILG9EQUFvRDtJQUNwRCxrREFBa0Q7SUFDbEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNO1NBQzFCLGFBQWEsRUFBRTtTQUNmLGVBQWUsRUFBRSxDQUFDO0lBRXJCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUV0RCx3QkFBd0I7SUFDeEIsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXpCLE9BQU87UUFDTCxRQUFRO1FBQ1IsT0FBTztRQUNQLE1BQU07UUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7UUFDZixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7UUFDakQsS0FBSyxDQUFDLElBQUk7WUFDUixNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixNQUFNLGFBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFhRCxTQUFnQixzQkFBc0IsQ0FBQyxRQUE0QjtJQUNqRSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRO2FBQ3hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3QyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFnQixDQUFDO2FBQzVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAnbm9kZTpxdWVyeXN0cmluZyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbW9ja3R0cCBmcm9tICdtb2NrdHRwJztcbmltcG9ydCB7IENvbXBsZXRlZFJlcXVlc3QgfSBmcm9tICdtb2NrdHRwJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0UHJveHlTZXJ2ZXIoY2VydERpclJvb3Q/OiBzdHJpbmcpOiBQcm9taXNlPFByb3h5U2VydmVyPiB7XG4gIGNvbnN0IGNlcnREaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihjZXJ0RGlyUm9vdCA/PyBvcy50bXBkaXIoKSwgJ2Nkay0nKSk7XG4gIGNvbnN0IGNlcnRQYXRoID0gcGF0aC5qb2luKGNlcnREaXIsICdjZXJ0LnBlbScpO1xuICBjb25zdCBrZXlQYXRoID0gcGF0aC5qb2luKGNlcnREaXIsICdrZXkucGVtJyk7XG5cbiAgLy8gU2V0IHVwIGtleSBhbmQgY2VydGlmaWNhdGVcbiAgY29uc3QgeyBrZXksIGNlcnQgfSA9IGF3YWl0IG1vY2t0dHAuZ2VuZXJhdGVDQUNlcnRpZmljYXRlKCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShrZXlQYXRoLCBrZXkpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoY2VydFBhdGgsIGNlcnQpO1xuXG4gIGNvbnN0IHNlcnZlciA9IG1vY2t0dHAuZ2V0TG9jYWwoe1xuICAgIGh0dHBzOiB7IGtleVBhdGg6IGtleVBhdGgsIGNlcnRQYXRoOiBjZXJ0UGF0aCB9LFxuICB9KTtcblxuICAvLyBXZSBkb24ndCBuZWVkIHRvIG1vZGlmeSBhbnkgcmVxdWVzdCwgc28gdGhlIHByb3h5XG4gIC8vIHBhc3NlcyB0aHJvdWdoIGFsbCByZXF1ZXN0cyB0byB0aGUgdGFyZ2V0IGhvc3QuXG4gIGNvbnN0IGVuZHBvaW50ID0gYXdhaXQgc2VydmVyXG4gICAgLmZvckFueVJlcXVlc3QoKVxuICAgIC50aGVuUGFzc1Rocm91Z2goKTtcblxuICBjb25zdCBwb3J0ID0gOTAwMCArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwKTtcblxuICAvLyBzZXJ2ZXIuZW5hYmxlRGVidWcoKTtcbiAgYXdhaXQgc2VydmVyLnN0YXJ0KHBvcnQpO1xuXG4gIHJldHVybiB7XG4gICAgY2VydFBhdGgsXG4gICAga2V5UGF0aCxcbiAgICBzZXJ2ZXIsXG4gICAgdXJsOiBzZXJ2ZXIudXJsLFxuICAgIHBvcnQ6IHNlcnZlci5wb3J0LFxuICAgIGdldFNlZW5SZXF1ZXN0czogKCkgPT4gZW5kcG9pbnQuZ2V0U2VlblJlcXVlc3RzKCksXG4gICAgYXN5bmMgc3RvcCgpIHtcbiAgICAgIGF3YWl0IHNlcnZlci5zdG9wKCk7XG4gICAgICBhd2FpdCBmcy5ybShjZXJ0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm94eVNlcnZlciB7XG4gIHJlYWRvbmx5IGNlcnRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtleVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VydmVyOiBtb2NrdHRwLk1vY2t0dHA7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgZ2V0U2VlblJlcXVlc3RzKCk6IFByb21pc2U8Q29tcGxldGVkUmVxdWVzdFtdPjtcbiAgc3RvcCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXdzQWN0aW9uc0Zyb21SZXF1ZXN0cyhyZXF1ZXN0czogQ29tcGxldGVkUmVxdWVzdFtdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQocmVxdWVzdHNcbiAgICAubWFwKHJlcSA9PiByZXEuYm9keS5idWZmZXIudG9TdHJpbmcoJ3V0Zi04JykpXG4gICAgLm1hcChib2R5ID0+IHF1ZXJ5c3RyaW5nLmRlY29kZShib2R5KSlcbiAgICAubWFwKHggPT4geC5BY3Rpb24gYXMgc3RyaW5nKVxuICAgIC5maWx0ZXIoYWN0aW9uID0+IGFjdGlvbiAhPSBudWxsKSldO1xufVxuIl19
|
package/lib/proxy.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import * as querystring from 'node:querystring';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as mockttp from 'mockttp';
|
|
6
|
+
import { CompletedRequest } from 'mockttp';
|
|
7
|
+
|
|
8
|
+
export async function startProxyServer(certDirRoot?: string): Promise<ProxyServer> {
|
|
9
|
+
const certDir = await fs.mkdtemp(path.join(certDirRoot ?? os.tmpdir(), 'cdk-'));
|
|
10
|
+
const certPath = path.join(certDir, 'cert.pem');
|
|
11
|
+
const keyPath = path.join(certDir, 'key.pem');
|
|
12
|
+
|
|
13
|
+
// Set up key and certificate
|
|
14
|
+
const { key, cert } = await mockttp.generateCACertificate();
|
|
15
|
+
await fs.writeFile(keyPath, key);
|
|
16
|
+
await fs.writeFile(certPath, cert);
|
|
17
|
+
|
|
18
|
+
const server = mockttp.getLocal({
|
|
19
|
+
https: { keyPath: keyPath, certPath: certPath },
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// We don't need to modify any request, so the proxy
|
|
23
|
+
// passes through all requests to the target host.
|
|
24
|
+
const endpoint = await server
|
|
25
|
+
.forAnyRequest()
|
|
26
|
+
.thenPassThrough();
|
|
27
|
+
|
|
28
|
+
const port = 9000 + Math.floor(Math.random() * 10000);
|
|
29
|
+
|
|
30
|
+
// server.enableDebug();
|
|
31
|
+
await server.start(port);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
certPath,
|
|
35
|
+
keyPath,
|
|
36
|
+
server,
|
|
37
|
+
url: server.url,
|
|
38
|
+
port: server.port,
|
|
39
|
+
getSeenRequests: () => endpoint.getSeenRequests(),
|
|
40
|
+
async stop() {
|
|
41
|
+
await server.stop();
|
|
42
|
+
await fs.rm(certDir, { recursive: true, force: true });
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface ProxyServer {
|
|
48
|
+
readonly certPath: string;
|
|
49
|
+
readonly keyPath: string;
|
|
50
|
+
readonly server: mockttp.Mockttp;
|
|
51
|
+
readonly url: string;
|
|
52
|
+
readonly port: number;
|
|
53
|
+
|
|
54
|
+
getSeenRequests(): Promise<CompletedRequest[]>;
|
|
55
|
+
stop(): Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function awsActionsFromRequests(requests: CompletedRequest[]): string[] {
|
|
59
|
+
return [...new Set(requests
|
|
60
|
+
.map(req => req.body.buffer.toString('utf-8'))
|
|
61
|
+
.map(body => querystring.decode(body))
|
|
62
|
+
.map(x => x.Action as string)
|
|
63
|
+
.filter(action => action != null))];
|
|
64
|
+
}
|
package/lib/with-aws.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ import { AwsClients } from './aws';
|
|
|
2
2
|
import { TestContext } from './integ-test';
|
|
3
3
|
import { ResourcePool } from './resource-pool';
|
|
4
4
|
import { DisableBootstrapContext } from './with-cdk-app';
|
|
5
|
+
export declare function atmosphereEnabled(): boolean;
|
|
6
|
+
export declare function atmosphereEndpoint(): string;
|
|
7
|
+
export declare function atmospherePool(): string;
|
|
5
8
|
export type AwsContext = {
|
|
6
9
|
readonly aws: AwsClients;
|
|
7
10
|
};
|
package/lib/with-aws.js
CHANGED
|
@@ -1,20 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.atmosphereEnabled = atmosphereEnabled;
|
|
4
|
+
exports.atmosphereEndpoint = atmosphereEndpoint;
|
|
5
|
+
exports.atmospherePool = atmospherePool;
|
|
3
6
|
exports.withAws = withAws;
|
|
4
7
|
exports.regionPool = regionPool;
|
|
8
|
+
const cdk_atmosphere_client_1 = require("@cdklabs/cdk-atmosphere-client");
|
|
5
9
|
const aws_1 = require("./aws");
|
|
6
10
|
const resource_pool_1 = require("./resource-pool");
|
|
11
|
+
function atmosphereEnabled() {
|
|
12
|
+
const enabled = process.env.CDK_INTEG_ATMOSPHERE_ENABLED;
|
|
13
|
+
return enabled === 'true' || enabled === '1';
|
|
14
|
+
}
|
|
15
|
+
function atmosphereEndpoint() {
|
|
16
|
+
const value = process.env.CDK_INTEG_ATMOSPHERE_ENDPOINT;
|
|
17
|
+
if (!value) {
|
|
18
|
+
throw new Error('CDK_INTEG_ATMOSPHERE_ENDPOINT is not defined');
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
function atmospherePool() {
|
|
23
|
+
const value = process.env.CDK_INTEG_ATMOSPHERE_POOL;
|
|
24
|
+
if (!value) {
|
|
25
|
+
throw new Error('CDK_INTEG_ATMOSPHERE_POOL is not defined');
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
7
29
|
/**
|
|
8
30
|
* Higher order function to execute a block with an AWS client setup
|
|
9
31
|
*
|
|
10
32
|
* Allocate the next region from the REGION pool and dispose it afterwards.
|
|
11
33
|
*/
|
|
12
34
|
function withAws(block, disableBootstrap = false) {
|
|
13
|
-
return
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
35
|
+
return async (context) => {
|
|
36
|
+
if (atmosphereEnabled()) {
|
|
37
|
+
const atmosphere = new cdk_atmosphere_client_1.AtmosphereClient(atmosphereEndpoint());
|
|
38
|
+
const allocation = await atmosphere.acquire({ pool: atmospherePool(), requester: context.name });
|
|
39
|
+
const aws = await aws_1.AwsClients.forIdentity(allocation.environment.region, {
|
|
40
|
+
accessKeyId: allocation.credentials.accessKeyId,
|
|
41
|
+
secretAccessKey: allocation.credentials.secretAccessKey,
|
|
42
|
+
sessionToken: allocation.credentials.sessionToken,
|
|
43
|
+
accountId: allocation.environment.account,
|
|
44
|
+
}, context.output);
|
|
45
|
+
await sanityCheck(aws);
|
|
46
|
+
let outcome = 'success';
|
|
47
|
+
try {
|
|
48
|
+
return await block({ ...context, disableBootstrap, aws });
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
outcome = 'failure';
|
|
52
|
+
throw e;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await atmosphere.release(allocation.id, outcome);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return regionPool().using(async (region) => {
|
|
60
|
+
const aws = await aws_1.AwsClients.forRegion(region, context.output);
|
|
61
|
+
await sanityCheck(aws);
|
|
62
|
+
return block({ ...context, disableBootstrap, aws });
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
};
|
|
18
66
|
}
|
|
19
67
|
let _regionPool;
|
|
20
68
|
function regionPool() {
|
|
@@ -57,4 +105,4 @@ async function sanityCheck(aws) {
|
|
|
57
105
|
}
|
|
58
106
|
}
|
|
59
107
|
let sanityChecked;
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1hd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3aXRoLWF3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU1BLDhDQUdDO0FBRUQsZ0RBTUM7QUFFRCx3Q0FNQztBQVNELDBCQW1DQztBQUdELGdDQWNDO0FBdEZELDBFQUFrRTtBQUNsRSwrQkFBbUM7QUFFbkMsbURBQStDO0FBRy9DLFNBQWdCLGlCQUFpQjtJQUMvQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDO0lBQ3pELE9BQU8sT0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssR0FBRyxDQUFDO0FBQy9DLENBQUM7QUFFRCxTQUFnQixrQkFBa0I7SUFDaEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQztJQUN4RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQWdCLGNBQWM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQztJQUNwRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUlEOzs7O0dBSUc7QUFDSCxTQUFnQixPQUFPLENBQ3JCLEtBQTJFLEVBQzNFLG1CQUE0QixLQUFLO0lBRWpDLE9BQU8sS0FBSyxFQUFFLE9BQVUsRUFBRSxFQUFFO1FBQzFCLElBQUksaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sVUFBVSxHQUFHLElBQUksd0NBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE1BQU0sVUFB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RCxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFDakYsQ0FBQztBQUNILENBQUM7QUFDRCxJQUFJLGFBQWtDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdG1vc3BoZXJlQ2xpZW50IH0gZnJvbSAnQGNka2xhYnMvY2RrLWF0bW9zcGhlcmUtY2xpZW50JztcbmltcG9ydCB7IEF3c0NsaWVudHMgfSBmcm9tICcuL2F3cyc7XG5pbXBvcnQgeyBUZXN0Q29udGV4dCB9IGZyb20gJy4vaW50ZWctdGVzdCc7XG5pbXBvcnQgeyBSZXNvdXJjZVBvb2wgfSBmcm9tICcuL3Jlc291cmNlLXBvb2wnO1xuaW1wb3J0IHsgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQgfSBmcm9tICcuL3dpdGgtY2RrLWFwcCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdG1vc3BoZXJlRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgZW5hYmxlZCA9IHByb2Nlc3MuZW52LkNES19JTlRFR19BVE1PU1BIRVJFX0VOQUJMRUQ7XG4gIHJldHVybiBlbmFibGVkID09PSAndHJ1ZScgfHwgZW5hYmxlZCA9PT0gJzEnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXRtb3NwaGVyZUVuZHBvaW50KCk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnYuQ0RLX0lOVEVHX0FUTU9TUEhFUkVfRU5EUE9JTlQ7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NES19JTlRFR19BVE1PU1BIRVJFX0VORFBPSU5UIGlzIG5vdCBkZWZpbmVkJyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXRtb3NwaGVyZVBvb2woKSB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnYuQ0RLX0lOVEVHX0FUTU9TUEhFUkVfUE9PTDtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ0RLX0lOVEVHX0FUTU9TUEhFUkVfUE9PTCBpcyBub3QgZGVmaW5lZCcpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUgQXdzQ29udGV4dCA9IHsgcmVhZG9ubHkgYXdzOiBBd3NDbGllbnRzIH07XG5cbi8qKlxuICogSGlnaGVyIG9yZGVyIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYSBibG9jayB3aXRoIGFuIEFXUyBjbGllbnQgc2V0dXBcbiAqXG4gKiBBbGxvY2F0ZSB0aGUgbmV4dCByZWdpb24gZnJvbSB0aGUgUkVHSU9OIHBvb2wgYW5kIGRpc3Bvc2UgaXQgYWZ0ZXJ3YXJkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhBd3M8QSBleHRlbmRzIFRlc3RDb250ZXh0PihcbiAgYmxvY2s6IChjb250ZXh0OiBBICYgQXdzQ29udGV4dCAmIERpc2FibGVCb290c3RyYXBDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+LFxuICBkaXNhYmxlQm9vdHN0cmFwOiBib29sZWFuID0gZmFsc2UsXG4pOiAoY29udGV4dDogQSkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogQSkgPT4ge1xuICAgIGlmIChhdG1vc3BoZXJlRW5hYmxlZCgpKSB7XG4gICAgICBjb25zdCBhdG1vc3BoZXJlID0gbmV3IEF0bW9zcGhlcmVDbGllbnQoYXRtb3NwaGVyZUVuZHBvaW50KCkpO1xuICAgICAgY29uc3QgYWxsb2NhdGlvbiA9IGF3YWl0IGF0bW9zcGhlcmUuYWNxdWlyZSh7IHBvb2w6IGF0bW9zcGhlcmVQb29sKCksIHJlcXVlc3RlcjogY29udGV4dC5uYW1lIH0pO1xuICAgICAgY29uc3QgYXdzID0gYXdhaXQgQXdzQ2xpZW50cy5mb3JJZGVudGl0eShhbGxvY2F0aW9uLmVudmlyb25tZW50LnJlZ2lvbiwge1xuICAgICAgICBhY2Nlc3NLZXlJZDogYWxsb2NhdGlvbi5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCxcbiAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiBhbGxvY2F0aW9uLmNyZWRlbnRpYWxzLnNlY3JldEFjY2Vzc0tleSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBhbGxvY2F0aW9uLmNyZWRlbnRpYWxzLnNlc3Npb25Ub2tlbixcbiAgICAgICAgYWNjb3VudElkOiBhbGxvY2F0aW9uLmVudmlyb25tZW50LmFjY291bnQsXG4gICAgICB9LCBjb250ZXh0Lm91dHB1dCk7XG5cbiAgICAgIGF3YWl0IHNhbml0eUNoZWNrKGF3cyk7XG5cbiAgICAgIGxldCBvdXRjb21lID0gJ3N1Y2Nlc3MnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKHsgLi4uY29udGV4dCwgZGlzYWJsZUJvb3RzdHJhcCwgYXdzIH0pO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIG91dGNvbWUgPSAnZmFpbHVyZSc7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBhdG1vc3BoZXJlLnJlbGVhc2UoYWxsb2NhdGlvbi5pZCwgb3V0Y29tZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZWdpb25Qb29sKCkudXNpbmcoYXN5bmMgKHJlZ2lvbikgPT4ge1xuICAgICAgICBjb25zdCBhd3MgPSBhd2FpdCBBd3NDbGllbnRzLmZvclJlZ2lvbihyZWdpb24sIGNvbnRleHQub3V0cHV0KTtcbiAgICAgICAgYXdhaXQgc2FuaXR5Q2hlY2soYXdzKTtcblxuICAgICAgICByZXR1cm4gYmxvY2soeyAuLi5jb250ZXh0LCBkaXNhYmxlQm9vdHN0cmFwLCBhd3MgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbmxldCBfcmVnaW9uUG9vbDogdW5kZWZpbmVkIHwgUmVzb3VyY2VQb29sO1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lvblBvb2woKTogUmVzb3VyY2VQb29sIHtcbiAgaWYgKF9yZWdpb25Qb29sICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gX3JlZ2lvblBvb2w7XG4gIH1cblxuICBjb25zdCBSRUdJT05TID0gcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTlNcbiAgICA/IHByb2Nlc3MuZW52LkFXU19SRUdJT05TLnNwbGl0KCcsJylcbiAgICA6IFtwcm9jZXNzLmVudi5BV1NfUkVHSU9OID8/IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTiA/PyAndXMtZWFzdC0xJ107XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coYFVzaW5nIHJlZ2lvbnM6ICR7UkVHSU9OU31cXG5gKTtcblxuICBfcmVnaW9uUG9vbCA9IFJlc291cmNlUG9vbC53aXRoUmVzb3VyY2VzKCdhd3NfcmVnaW9ucycsIFJFR0lPTlMpO1xuICByZXR1cm4gX3JlZ2lvblBvb2w7XG59XG5cbi8qKlxuICogUGVyZm9ybSBhIG9uZS10aW1lIHF1aWNrIHNhbml0eSBjaGVjayB0aGF0IHRoZSBBV1MgY2xpZW50cyBoYXZlIHByb3Blcmx5IGNvbmZpZ3VyZWQgY3JlZGVudGlhbHNcbiAqXG4gKiBJZiB3ZSBkb24ndCBkbyB0aGlzLCBjYWxscyBhcmUgZ29pbmcgdG8gZmFpbCBhbmQgdGhleSdsbCBiZSByZXRyaWVkIGFuZCBldmVyeXRoaW5nIHdpbGwgdGFrZVxuICogZm9yZXZlciBiZWZvcmUgdGhlIHVzZXIgbm90aWNlcyBhIHNpbXBsZSBtaXNjb25maWd1cmF0aW9uLlxuICpcbiAqIFdlIGNhbid0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNpbmNlIGNyZWRlbnRpYWxzIGNvdWxkIGNvbWUgZnJvbVxuICogYW55d2hlcmUsIHNvIGRvIHNpbXBsZSBhY2NvdW50IHJldHJpZXZhbC5cbiAqXG4gKiBPbmx5IGRvIGl0IG9uY2UgcGVyIHByb2Nlc3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhbml0eUNoZWNrKGF3czogQXdzQ2xpZW50cykge1xuICBpZiAoc2FuaXR5Q2hlY2tlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF3cy5hY2NvdW50KCk7XG4gICAgICBzYW5pdHlDaGVja2VkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHNhbml0eUNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQVdTIGNyZWRlbnRpYWxzIHByb2JhYmx5IG5vdCBjb25maWd1cmVkLCBnb3QgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICBpZiAoIXNhbml0eUNoZWNrZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FXUyBjcmVkZW50aWFscyBwcm9iYWJseSBub3QgY29uZmlndXJlZCwgc2VlIHByZXZpb3VzIGVycm9yJyk7XG4gIH1cbn1cbmxldCBzYW5pdHlDaGVja2VkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuIl19
|
package/lib/with-aws.ts
CHANGED
|
@@ -1,8 +1,30 @@
|
|
|
1
|
+
import { AtmosphereClient } from '@cdklabs/cdk-atmosphere-client';
|
|
1
2
|
import { AwsClients } from './aws';
|
|
2
3
|
import { TestContext } from './integ-test';
|
|
3
4
|
import { ResourcePool } from './resource-pool';
|
|
4
5
|
import { DisableBootstrapContext } from './with-cdk-app';
|
|
5
6
|
|
|
7
|
+
export function atmosphereEnabled(): boolean {
|
|
8
|
+
const enabled = process.env.CDK_INTEG_ATMOSPHERE_ENABLED;
|
|
9
|
+
return enabled === 'true' || enabled === '1';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function atmosphereEndpoint(): string {
|
|
13
|
+
const value = process.env.CDK_INTEG_ATMOSPHERE_ENDPOINT;
|
|
14
|
+
if (!value) {
|
|
15
|
+
throw new Error('CDK_INTEG_ATMOSPHERE_ENDPOINT is not defined');
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function atmospherePool() {
|
|
21
|
+
const value = process.env.CDK_INTEG_ATMOSPHERE_POOL;
|
|
22
|
+
if (!value) {
|
|
23
|
+
throw new Error('CDK_INTEG_ATMOSPHERE_POOL is not defined');
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
|
|
6
28
|
export type AwsContext = { readonly aws: AwsClients };
|
|
7
29
|
|
|
8
30
|
/**
|
|
@@ -14,12 +36,37 @@ export function withAws<A extends TestContext>(
|
|
|
14
36
|
block: (context: A & AwsContext & DisableBootstrapContext) => Promise<void>,
|
|
15
37
|
disableBootstrap: boolean = false,
|
|
16
38
|
): (context: A) => Promise<void> {
|
|
17
|
-
return (context: A) =>
|
|
18
|
-
|
|
19
|
-
|
|
39
|
+
return async (context: A) => {
|
|
40
|
+
if (atmosphereEnabled()) {
|
|
41
|
+
const atmosphere = new AtmosphereClient(atmosphereEndpoint());
|
|
42
|
+
const allocation = await atmosphere.acquire({ pool: atmospherePool(), requester: context.name });
|
|
43
|
+
const aws = await AwsClients.forIdentity(allocation.environment.region, {
|
|
44
|
+
accessKeyId: allocation.credentials.accessKeyId,
|
|
45
|
+
secretAccessKey: allocation.credentials.secretAccessKey,
|
|
46
|
+
sessionToken: allocation.credentials.sessionToken,
|
|
47
|
+
accountId: allocation.environment.account,
|
|
48
|
+
}, context.output);
|
|
49
|
+
|
|
50
|
+
await sanityCheck(aws);
|
|
20
51
|
|
|
21
|
-
|
|
22
|
-
|
|
52
|
+
let outcome = 'success';
|
|
53
|
+
try {
|
|
54
|
+
return await block({ ...context, disableBootstrap, aws });
|
|
55
|
+
} catch (e: any) {
|
|
56
|
+
outcome = 'failure';
|
|
57
|
+
throw e;
|
|
58
|
+
} finally {
|
|
59
|
+
await atmosphere.release(allocation.id, outcome);
|
|
60
|
+
}
|
|
61
|
+
} else {
|
|
62
|
+
return regionPool().using(async (region) => {
|
|
63
|
+
const aws = await AwsClients.forRegion(region, context.output);
|
|
64
|
+
await sanityCheck(aws);
|
|
65
|
+
|
|
66
|
+
return block({ ...context, disableBootstrap, aws });
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
};
|
|
23
70
|
}
|
|
24
71
|
|
|
25
72
|
let _regionPool: undefined | ResourcePool;
|
package/lib/with-cdk-app.d.ts
CHANGED
|
@@ -160,6 +160,7 @@ export declare class TestFixture extends ShellHelper {
|
|
|
160
160
|
constructor(integTestDir: string, stackNamePrefix: string, output: NodeJS.WritableStream, aws: AwsClients, randomString: string);
|
|
161
161
|
log(s: string): void;
|
|
162
162
|
cdkDeploy(stackNames: string | string[], options?: CdkCliOptions, skipStackRename?: boolean): Promise<string>;
|
|
163
|
+
cdkDeployCommandLine(stackNames: string | string[], options?: CdkCliOptions, skipStackRename?: boolean): string[];
|
|
163
164
|
cdkSynth(options?: CdkCliOptions): Promise<string>;
|
|
164
165
|
cdkDestroy(stackNames: string | string[], options?: CdkCliOptions): Promise<string>;
|
|
165
166
|
cdkBootstrapLegacy(options: CdkLegacyBootstrapCommandOptions): Promise<string>;
|
|
@@ -167,6 +168,16 @@ export declare class TestFixture extends ShellHelper {
|
|
|
167
168
|
cdkGarbageCollect(options: CdkGarbageCollectionCommandOptions): Promise<string>;
|
|
168
169
|
cdkMigrate(language: string, stackName: string, inputPath?: string, options?: CdkCliOptions): Promise<string>;
|
|
169
170
|
cdk(args: string[], options?: CdkCliOptions): Promise<string>;
|
|
171
|
+
/**
|
|
172
|
+
* Return the environment variables with which to execute CDK
|
|
173
|
+
*/
|
|
174
|
+
cdkShellEnv(): {
|
|
175
|
+
AWS_REGION: string;
|
|
176
|
+
AWS_DEFAULT_REGION: string;
|
|
177
|
+
STACK_NAME_PREFIX: string;
|
|
178
|
+
PACKAGE_LAYOUT_VERSION: string;
|
|
179
|
+
CI: string;
|
|
180
|
+
};
|
|
170
181
|
template(stackName: string): any;
|
|
171
182
|
bootstrapRepoName(): Promise<string>;
|
|
172
183
|
get bootstrapStackName(): string;
|