@payfit/nx-core 4.41.0-ephemeral-hello-lambda-dded495.0 → 4.41.0-ephemeral-hello-lambda-fa84ca6.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/package.json
CHANGED
|
@@ -42,7 +42,7 @@ async function runSmokeTests(stackId, lambdaFunctions) {
|
|
|
42
42
|
async function createOrUpdateLambdaAlias(accountId, lambdaARN, alias, envVars, update = false) {
|
|
43
43
|
const aliasAction = update ? 'create-alias' : 'update-alias';
|
|
44
44
|
logger_1.consola.log(`Retrieving latest version for function ${lambdaARN}`);
|
|
45
|
-
const latestVersion = await (0, exec_1.exec)(`aws lambda list-versions-by-function --function-name ${lambdaARN} --query 'Versions[?Version!=\`$LATEST\`] | [-1].Version' --output text
|
|
45
|
+
const latestVersion = await (0, exec_1.exec)(`aws lambda list-versions-by-function --function-name ${lambdaARN} --query 'Versions[?Version!=\`$LATEST\`] | [-1].Version' --output text`, { throwOnError: true, nodeOptions: { env: envVars } }).pipe('tail', ['-1']);
|
|
46
46
|
logger_1.consola.log(`Creating or updating alias ${alias} for function ${lambdaARN} with version ${latestVersion}`);
|
|
47
47
|
const result = await (0, exec_1.exec)(`aws lambda ${aliasAction} --function-name ${lambdaARN} --name ${alias} --function-version ${latestVersion}`, {
|
|
48
48
|
throwOnError: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aws-lambda.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/utils/lambda/aws-lambda.ts"],"names":[],"mappings":";;AAaA,8CAKC;AAED,sCAqCC;AAED,8DAiCC;AA2GD,8CA0CC;AAjPD,yCAAqC;AACrC,6CAA0C;AAI1C,MAAM,WAAW,GAAgC;IAC/C,GAAG,EAAE,cAAc;IACnB,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,cAAc;IACtB,IAAI,EAAE,cAAc;CACrB,CAAA;AAED,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAC7E,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAEtE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,WAA0B,CAAC,CAAC,CAAA;AAC/D,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,eAAyB;IAEzB,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAG,MAAM,6BAA6B,CAAC,WAAW,CAAC,CAAA;IACpE,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAA;IAElD,MAAM,iBAAiB,GAAG,KAAK,EAAE,YAAoB,EAAiB,EAAE;QACtE,MAAM,SAAS,GAAG,4BAA4B,SAAS,aAAa,YAAY,aAAa,CAAA;QAE7F,IAAI,CAAC;YACH,gBAAO,CAAC,GAAG,CACT,2BAA2B,YAAY,WAAW,WAAW,EAAE,CAChE,CAAA;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;YAEpD,MAAM,IAAA,WAAI,EACR,qCAAqC,SAAS,cAAc,IAAI,CAAC,YAAY,CAAC,EAAE,EAChF,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CACtD,CAAA;YACD,gBAAO,CAAC,OAAO,CACb,kCAAkC,YAAY,OAAO,WAAW,EAAE,CACnE,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAO,CAAC,KAAK,CACX,kCAAkC,YAAY,OAAO,WAAW,GAAG,EACnE,KAAK,CACN,CAAA;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC,CAAA;IAED,gDAAgD;IAChD,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACzD,gBAAO,CAAC,OAAO,CAAC,6BAA6B,WAAW,cAAc,CAAC,CAAA;AACzE,CAAC;AAEM,KAAK,UAAU,yBAAyB,CAC7C,SAAiB,EACjB,SAAiB,EACjB,KAAa,EACb,OAA+B,EAC/B,MAAM,GAAG,KAAK;IAEd,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAA;IAE5D,gBAAO,CAAC,GAAG,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAA;IAClE,MAAM,aAAa,GAAG,MAAM,IAAA,WAAI,EAC9B,wDAAwD,SAAS,
|
|
1
|
+
{"version":3,"file":"aws-lambda.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/utils/lambda/aws-lambda.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { GraphQlService, RunState, SpaceliftService } from '@payfit/spacelift';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
import { exec } from '../common/exec';
|
|
6
|
+
import { consola } from '../common/logger';
|
|
7
|
+
import { createOrMoveAlias, retrieveAccoundId, runSmokeTests } from './aws-lambda';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
const mockUpdateStackEnvironmentVariable = vi.fn()
|
|
11
|
+
const mockTriggerStackRun = vi.fn()
|
|
12
|
+
const mockGetStackById = vi.fn()
|
|
13
|
+
|
|
14
|
+
vi.mock('../../utils/common/logger')
|
|
15
|
+
vi.mock('../../utils/common/github')
|
|
16
|
+
vi.mock('../../utils/common/exec', () => ({
|
|
17
|
+
exec: vi.fn(),
|
|
18
|
+
}))
|
|
19
|
+
|
|
20
|
+
vi.mock('@payfit/spacelift', async importOriginal => ({
|
|
21
|
+
...(await importOriginal()),
|
|
22
|
+
SpaceliftService: vi.fn().mockImplementation(() => ({
|
|
23
|
+
updateStackEnvironmentVariable: mockUpdateStackEnvironmentVariable,
|
|
24
|
+
triggerStackRun: mockTriggerStackRun,
|
|
25
|
+
getStackById: mockGetStackById,
|
|
26
|
+
})),
|
|
27
|
+
GraphQlService: vi.fn().mockImplementation(() => ({})),
|
|
28
|
+
}))
|
|
29
|
+
|
|
30
|
+
const mockConsolaSuccess = vi.spyOn(consola, 'success')
|
|
31
|
+
|
|
32
|
+
describe('retrieveAccoundId', () => {
|
|
33
|
+
it('should retrieve account ID', () => {
|
|
34
|
+
const expectedAccountId = '533547282673'
|
|
35
|
+
const result = retrieveAccoundId('toto-dev-eu-west-3')
|
|
36
|
+
expect(result).toEqual(['dev', expectedAccountId])
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
describe('runSmokeTest', () => {
|
|
41
|
+
const stackId = 'test-dev-eu-west-3'
|
|
42
|
+
const lambdaFunctions = ['lambda-a', 'lambda-b']
|
|
43
|
+
|
|
44
|
+
const mockAssumeRoleResponse = {
|
|
45
|
+
exitCode: 0,
|
|
46
|
+
stdout: JSON.stringify({
|
|
47
|
+
Credentials: {
|
|
48
|
+
AccessKeyId: 'AKIATEST',
|
|
49
|
+
SecretAccessKey: 'test-secret',
|
|
50
|
+
SessionToken: 'test-session-token',
|
|
51
|
+
},
|
|
52
|
+
}),
|
|
53
|
+
stderr: '',
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const mockLambdaInvokeResponse = {
|
|
57
|
+
exitCode: 0,
|
|
58
|
+
stdout: 'ok',
|
|
59
|
+
stderr: '',
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
vi.clearAllMocks()
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('should throw an error if assume role fails', async () => {
|
|
67
|
+
vi.mocked(exec).mockRejectedValueOnce(new Error('Role assumption failed'))
|
|
68
|
+
|
|
69
|
+
const runSmokeTestPromise = runSmokeTests(stackId, lambdaFunctions)
|
|
70
|
+
await expect(runSmokeTestPromise).rejects.toThrowError(
|
|
71
|
+
'Role assumption failed for dev: Role assumption failed',
|
|
72
|
+
)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('should throw an error if lambda invoke fails', async () => {
|
|
76
|
+
vi.mocked(exec)
|
|
77
|
+
.mockResolvedValueOnce(mockAssumeRoleResponse) // assume role success
|
|
78
|
+
.mockRejectedValue(new Error('Lambda invoke failed')) // lambda invoke fails
|
|
79
|
+
|
|
80
|
+
const runSmokeTestPromise = runSmokeTests(stackId, lambdaFunctions)
|
|
81
|
+
await expect(runSmokeTestPromise).rejects.toThrowError(
|
|
82
|
+
'Lambda invoke failed',
|
|
83
|
+
)
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
it('should call exec functions for assume role and lambda invokes', async () => {
|
|
87
|
+
vi.mocked(exec)
|
|
88
|
+
.mockResolvedValueOnce(mockAssumeRoleResponse) // assume role
|
|
89
|
+
.mockResolvedValueOnce(mockLambdaInvokeResponse) // first lambda invoke
|
|
90
|
+
.mockResolvedValueOnce(mockLambdaInvokeResponse) // second lambda invoke
|
|
91
|
+
|
|
92
|
+
await runSmokeTests(stackId, lambdaFunctions)
|
|
93
|
+
|
|
94
|
+
// Should call exec once for assume role + once for each lambda function
|
|
95
|
+
expect(vi.mocked(exec)).toHaveBeenCalledTimes(1 + lambdaFunctions.length)
|
|
96
|
+
|
|
97
|
+
// First call should be assume role
|
|
98
|
+
expect(vi.mocked(exec)).toHaveBeenNthCalledWith(
|
|
99
|
+
1,
|
|
100
|
+
'aws sts assume-role --role-arn arn:aws:iam::533547282673:role/invoke-lambda-nx-core --role-session-name nx-core',
|
|
101
|
+
{ throwOnError: true },
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
// Subsequent calls should be lambda invokes with assumed role credentials
|
|
105
|
+
expect(vi.mocked(exec)).toHaveBeenNthCalledWith(
|
|
106
|
+
2,
|
|
107
|
+
'aws lambda invoke --function-name arn:aws:lambda:eu-west-3:533547282673:function:lambda-a:smoke-test --payload eyJSZWNvcmRzIjpbXX0=',
|
|
108
|
+
{
|
|
109
|
+
throwOnError: true,
|
|
110
|
+
nodeOptions: {
|
|
111
|
+
env: expect.objectContaining({
|
|
112
|
+
AWS_ACCESS_KEY_ID: 'AKIATEST',
|
|
113
|
+
AWS_SECRET_ACCESS_KEY: 'test-secret',
|
|
114
|
+
AWS_SESSION_TOKEN: 'test-session-token',
|
|
115
|
+
}),
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
expect(mockConsolaSuccess).toHaveBeenCalledWith(
|
|
121
|
+
`All smoke tests passed in dev environment`,
|
|
122
|
+
)
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
describe('createOrMoveAlias', () => {
|
|
127
|
+
const stackId = 'test-dev-eu-west-3'
|
|
128
|
+
const lambdaFunctions = ['lambda-a', 'lambda-b']
|
|
129
|
+
const version = '20250717-1-1'
|
|
130
|
+
|
|
131
|
+
// Create fresh mock response for this test suite
|
|
132
|
+
const createMockResponse = (stdout: string, withPipe = false) => {
|
|
133
|
+
const mockResponse = Promise.resolve({
|
|
134
|
+
exitCode: 0,
|
|
135
|
+
stdout,
|
|
136
|
+
stderr: '',
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
if (withPipe) {
|
|
140
|
+
// Add pipe method directly to the promise
|
|
141
|
+
// @ts-ignore
|
|
142
|
+
mockResponse.pipe = vi.fn().mockResolvedValue(stdout.trim())
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return mockResponse
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const mockAssumeRoleResponse = createMockResponse(
|
|
149
|
+
JSON.stringify({
|
|
150
|
+
Credentials: {
|
|
151
|
+
AccessKeyId: 'AKIATEST2',
|
|
152
|
+
SecretAccessKey: 'test-secret2',
|
|
153
|
+
SessionToken: 'test-session-token2',
|
|
154
|
+
},
|
|
155
|
+
}),
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
const mockGetVersionResponse = createMockResponse('1', true)
|
|
159
|
+
|
|
160
|
+
const mockCreateAliasResponse = createMockResponse(`{ "Name": "${version}" }`)
|
|
161
|
+
|
|
162
|
+
beforeEach(() => {
|
|
163
|
+
vi.clearAllMocks()
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
it('should throw an error if assume role fails', async () => {
|
|
167
|
+
vi.mocked(exec).mockRejectedValueOnce(new Error('Role assumption failed'))
|
|
168
|
+
|
|
169
|
+
const createAliasPromise = createOrMoveAlias(
|
|
170
|
+
stackId,
|
|
171
|
+
lambdaFunctions,
|
|
172
|
+
version,
|
|
173
|
+
)
|
|
174
|
+
await expect(createAliasPromise).rejects.toThrowError(
|
|
175
|
+
'Role assumption failed for dev: Role assumption failed',
|
|
176
|
+
)
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
it('should throw an error if lambda alias creation fails', async () => {
|
|
180
|
+
// Test with only one lambda function to make mock sequence predictable
|
|
181
|
+
const singleLambdaFunction = ['lambda-a']
|
|
182
|
+
|
|
183
|
+
vi.mocked(exec)
|
|
184
|
+
.mockResolvedValueOnce( mockAssumeRoleResponse) // assume role success
|
|
185
|
+
.mockResolvedValueOnce( mockGetVersionResponse) // get version for first lambda success
|
|
186
|
+
.mockRejectedValueOnce(new Error('Lambda alias creation failed')) // create alias for first lambda fails
|
|
187
|
+
|
|
188
|
+
const createAliasPromise = createOrMoveAlias(
|
|
189
|
+
stackId,
|
|
190
|
+
singleLambdaFunction,
|
|
191
|
+
version,
|
|
192
|
+
)
|
|
193
|
+
await expect(createAliasPromise).rejects.toThrowError(
|
|
194
|
+
'Lambda alias creation failed',
|
|
195
|
+
)
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
it('should throw an error if exec does not return expected version', async () => {
|
|
199
|
+
// Test with only one lambda function to make mock sequence predictable
|
|
200
|
+
const singleLambdaFunction = ['lambda-a']
|
|
201
|
+
|
|
202
|
+
vi.mocked(exec)
|
|
203
|
+
.mockResolvedValueOnce( mockAssumeRoleResponse) // assume role success
|
|
204
|
+
.mockResolvedValueOnce( mockGetVersionResponse) // get version in createOrUpdateLambdaAlias
|
|
205
|
+
.mockResolvedValueOnce({
|
|
206
|
+
exitCode: 0,
|
|
207
|
+
stdout: '{ "Name": "20250717-1-2" }', // create-alias response with wrong version
|
|
208
|
+
stderr: '',
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
const createAliasPromise = createOrMoveAlias(
|
|
212
|
+
stackId,
|
|
213
|
+
singleLambdaFunction,
|
|
214
|
+
version,
|
|
215
|
+
)
|
|
216
|
+
await expect(createAliasPromise).rejects.toThrowError(
|
|
217
|
+
'Lambda alias 20250717-1-1 creation failed for function arn:aws:lambda:eu-west-3:533547282673:function:lambda-a in 533547282673. Response name should match version',
|
|
218
|
+
)
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
it('should call exec functions for assume role and lambda operations', async () => {
|
|
222
|
+
// Test with only one lambda function to make mock sequence predictable
|
|
223
|
+
const singleLambdaFunction = ['lambda-a']
|
|
224
|
+
|
|
225
|
+
vi.mocked(exec)
|
|
226
|
+
.mockResolvedValueOnce(await mockAssumeRoleResponse) // assume role
|
|
227
|
+
.mockResolvedValueOnce( mockGetVersionResponse) // get version in createOrUpdateLambdaAlias
|
|
228
|
+
.mockResolvedValueOnce(await mockCreateAliasResponse) // create-alias response
|
|
229
|
+
|
|
230
|
+
await createOrMoveAlias(stackId, singleLambdaFunction, version)
|
|
231
|
+
|
|
232
|
+
// Should call exec once for assume role + twice for the lambda function (get version + create alias)
|
|
233
|
+
expect(vi.mocked(exec)).toHaveBeenCalledTimes(
|
|
234
|
+
1 + singleLambdaFunction.length * 2,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
// First call should be assume role
|
|
238
|
+
expect(vi.mocked(exec)).toHaveBeenNthCalledWith(
|
|
239
|
+
1,
|
|
240
|
+
'aws sts assume-role --role-arn arn:aws:iam::533547282673:role/invoke-lambda-nx-core --role-session-name nx-core',
|
|
241
|
+
{ throwOnError: true },
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
expect(mockConsolaSuccess).toHaveBeenCalledWith(
|
|
245
|
+
`All alias created for functions in dev`,
|
|
246
|
+
)
|
|
247
|
+
})
|
|
248
|
+
})
|