UNPKG

@aws-cdk-testing/cli-integ

Version:

Integration tests for the AWS CDK CLI

72 lines 12.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const client_cloudformation_1 = require("@aws-sdk/client-cloudformation"); const client_lambda_1 = require("@aws-sdk/client-lambda"); const lib_1 = require("../../../lib"); jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime (0, lib_1.integTest)('cdk drift', (0, lib_1.withDefaultFixture)(async (fixture) => { await fixture.cdkDeploy('driftable', {}); // Assert that, right after deploying, there is no drift (because we just deployed it) const drift = await fixture.cdk(['drift', fixture.fullStackName('driftable')], { verbose: false }); expect(drift).toMatch(/Stack.*driftable/); // can't just .toContain because of formatting expect(drift).toContain('No drift detected'); expect(drift).toContain('✨ Number of resources with drift: 0'); expect(drift).not.toContain('unchecked'); // should not see unchecked resources unless verbose // Get the Lambda, we want to now make it drift const response = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStackResourcesCommand({ StackName: fixture.fullStackName('driftable'), })); const lambdaResource = response.StackResources?.find(resource => resource.ResourceType === 'AWS::Lambda::Function'); if (!lambdaResource || !lambdaResource.PhysicalResourceId) { throw new Error('Could not find Lambda function in stack resources'); } const functionName = lambdaResource.PhysicalResourceId; // Update the Lambda function, introducing drift await fixture.aws.lambda.send(new client_lambda_1.UpdateFunctionConfigurationCommand({ FunctionName: functionName, Description: 'I\'m slowly drifting (drifting away)', })); // Wait for the stack update to complete await waitForLambdaUpdateComplete(fixture, functionName); const driftAfterModification = await fixture.cdk(['drift', fixture.fullStackName('driftable')], { verbose: false }); const expectedMatches = [ /Stack.*driftable/, /[-].*This is my function!/m, /[+].*I'm slowly drifting \(drifting away\)/m, ]; const expectedSubstrings = [ '1 resource has drifted', // num resources drifted '✨ Number of resources with drift: 1', 'AWS::Lambda::Function', // the lambda should be marked drifted '/Description', // the resources that have drifted ]; for (const expectedMatch of expectedMatches) { expect(driftAfterModification).toMatch(expectedMatch); } for (const expectedSubstring of expectedSubstrings) { expect(driftAfterModification).toContain(expectedSubstring); } })); async function waitForLambdaUpdateComplete(fixture, functionName) { const delaySeconds = 5; const timeout = 30_000; // timeout after 30s const deadline = Date.now() + timeout; while (true) { const response = await fixture.aws.lambda.send(new client_lambda_1.GetFunctionCommand({ FunctionName: functionName, })); const lastUpdateStatus = response.Configuration?.LastUpdateStatus; if (lastUpdateStatus === 'Successful') { return; // Update completed successfully } if (lastUpdateStatus === 'Failed') { throw new Error('Lambda function update failed'); } if (Date.now() > deadline) { throw new Error(`Timed out after ${timeout / 1000} seconds.`); } // Wait before checking again await (0, lib_1.sleep)(delaySeconds * 1000); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kcmlmdC5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstY2RrLWRyaWZ0LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUErRTtBQUMvRSwwREFBZ0c7QUFDaEcsc0NBQW9FO0FBRXBFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCxXQUFXLEVBQ1gsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV6QyxzRkFBc0Y7SUFDdEYsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRW5HLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztJQUN6RixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0RBQW9EO0lBRTlGLCtDQUErQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDcEQsSUFBSSxxREFBNkIsQ0FBQztRQUNoQyxTQUFTLEVBQUUsT0FB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WSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVTdGFja1Jlc291cmNlc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgR2V0RnVuY3Rpb25Db21tYW5kLCBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHNsZWVwLCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgZHJpZnQnLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZHJpZnRhYmxlJywge30pO1xuXG4gICAgLy8gQXNzZXJ0IHRoYXQsIHJpZ2h0IGFmdGVyIGRlcGxveWluZywgdGhlcmUgaXMgbm8gZHJpZnQgKGJlY2F1c2Ugd2UganVzdCBkZXBsb3llZCBpdClcbiAgICBjb25zdCBkcmlmdCA9IGF3YWl0IGZpeHR1cmUuY2RrKFsnZHJpZnQnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ2RyaWZ0YWJsZScpXSwgeyB2ZXJib3NlOiBmYWxzZSB9KTtcblxuICAgIGV4cGVjdChkcmlmdCkudG9NYXRjaCgvU3RhY2suKmRyaWZ0YWJsZS8pOyAvLyBjYW4ndCBqdXN0IC50b0NvbnRhaW4gYmVjYXVzZSBvZiBmb3JtYXR0aW5nXG4gICAgZXhwZWN0KGRyaWZ0KS50b0NvbnRhaW4oJ05vIGRyaWZ0IGRldGVjdGVkJyk7XG4gICAgZXhwZWN0KGRyaWZ0KS50b0NvbnRhaW4oJ+KcqCAgTnVtYmVyIG9mIHJlc291cmNlcyB3aXRoIGRyaWZ0OiAwJyk7XG4gICAgZXhwZWN0KGRyaWZ0KS5ub3QudG9Db250YWluKCd1bmNoZWNrZWQnKTsgLy8gc2hvdWxkIG5vdCBzZWUgdW5jaGVja2VkIHJlc291cmNlcyB1bmxlc3MgdmVyYm9zZVxuXG4gICAgLy8gR2V0IHRoZSBMYW1iZGEsIHdlIHdhbnQgdG8gbm93IG1ha2UgaXQgZHJpZnRcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQoXG4gICAgICBuZXcgRGVzY3JpYmVTdGFja1Jlc291cmNlc0NvbW1hbmQoe1xuICAgICAgICBTdGFja05hbWU6IGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnZHJpZnRhYmxlJyksXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IGxhbWJkYVJlc291cmNlID0gcmVzcG9uc2UuU3RhY2tSZXNvdXJjZXM/LmZpbmQoXG4gICAgICByZXNvdXJjZSA9PiByZXNvdXJjZS5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICk7XG4gICAgaWYgKCFsYW1iZGFSZXNvdXJjZSB8fCAhbGFtYmRhUmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIExhbWJkYSBmdW5jdGlvbiBpbiBzdGFjayByZXNvdXJjZXMnKTtcbiAgICB9XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbGFtYmRhUmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBMYW1iZGEgZnVuY3Rpb24sIGludHJvZHVjaW5nIGRyaWZ0XG4gICAgYXdhaXQgZml4dHVyZS5hd3MubGFtYmRhLnNlbmQoXG4gICAgICBuZXcgVXBkYXRlRnVuY3Rpb25Db25maWd1cmF0aW9uQ29tbWFuZCh7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBEZXNjcmlwdGlvbjogJ0lcXCdtIHNsb3dseSBkcmlmdGluZyAoZHJpZnRpbmcgYXdheSknLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFdhaXQgZm9yIHRoZSBzdGFjayB1cGRhdGUgdG8gY29tcGxldGVcbiAgICBhd2FpdCB3YWl0Rm9yTGFtYmRhVXBkYXRlQ29tcGxldGUoZml4dHVyZSwgZnVuY3Rpb25OYW1lKTtcblxuICAgIGNvbnN0IGRyaWZ0QWZ0ZXJNb2RpZmljYXRpb24gPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RyaWZ0JywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCdkcmlmdGFibGUnKV0sIHsgdmVyYm9zZTogZmFsc2UgfSk7XG5cbiAgICBjb25zdCBleHBlY3RlZE1hdGNoZXMgPSBbXG4gICAgICAvU3RhY2suKmRyaWZ0YWJsZS8sXG4gICAgICAvWy1dLipUaGlzIGlzIG15IGZ1bmN0aW9uIS9tLFxuICAgICAgL1srXS4qSSdtIHNsb3dseSBkcmlmdGluZyBcXChkcmlmdGluZyBhd2F5XFwpL20sXG4gICAgXTtcbiAgICBjb25zdCBleHBlY3RlZFN1YnN0cmluZ3MgPSBbXG4gICAgICAnMSByZXNvdXJjZSBoYXMgZHJpZnRlZCcsIC8vIG51bSByZXNvdXJjZXMgZHJpZnRlZFxuICAgICAgJ+KcqCAgTnVtYmVyIG9mIHJlc291cmNlcyB3aXRoIGRyaWZ0OiAxJyxcbiAgICAgICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCAvLyB0aGUgbGFtYmRhIHNob3VsZCBiZSBtYXJrZWQgZHJpZnRlZFxuICAgICAgJy9EZXNjcmlwdGlvbicsIC8vIHRoZSByZXNvdXJjZXMgdGhhdCBoYXZlIGRyaWZ0ZWRcbiAgICBdO1xuICAgIGZvciAoY29uc3QgZXhwZWN0ZWRNYXRjaCBvZiBleHBlY3RlZE1hdGNoZXMpIHtcbiAgICAgIGV4cGVjdChkcmlmdEFmdGVyTW9kaWZpY2F0aW9uKS50b01hdGNoKGV4cGVjdGVkTWF0Y2gpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4cGVjdGVkU3Vic3RyaW5nIG9mIGV4cGVjdGVkU3Vic3RyaW5ncykge1xuICAgICAgZXhwZWN0KGRyaWZ0QWZ0ZXJNb2RpZmljYXRpb24pLnRvQ29udGFpbihleHBlY3RlZFN1YnN0cmluZyk7XG4gICAgfVxuICB9KSxcbik7XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JMYW1iZGFVcGRhdGVDb21wbGV0ZShmaXh0dXJlOiBhbnksIGZ1bmN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlbGF5U2Vjb25kcyA9IDU7XG4gIGNvbnN0IHRpbWVvdXQgPSAzMF8wMDA7IC8vIHRpbWVvdXQgYWZ0ZXIgMzBzXG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXQ7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpeHR1cmUuYXdzLmxhbWJkYS5zZW5kKFxuICAgICAgbmV3IEdldEZ1bmN0aW9uQ29tbWFuZCh7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGxhc3RVcGRhdGVTdGF0dXMgPSByZXNwb25zZS5Db25maWd1cmF0aW9uPy5MYXN0VXBkYXRlU3RhdHVzO1xuXG4gICAgaWYgKGxhc3RVcGRhdGVTdGF0dXMgPT09ICdTdWNjZXNzZnVsJykge1xuICAgICAgcmV0dXJuOyAvLyBVcGRhdGUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgIH1cblxuICAgIGlmIChsYXN0VXBkYXRlU3RhdHVzID09PSAnRmFpbGVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMYW1iZGEgZnVuY3Rpb24gdXBkYXRlIGZhaWxlZCcpO1xuICAgIH1cblxuICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IGFmdGVyICR7dGltZW91dCAvIDEwMDB9IHNlY29uZHMuYCk7XG4gICAgfVxuXG4gICAgLy8gV2FpdCBiZWZvcmUgY2hlY2tpbmcgYWdhaW5cbiAgICBhd2FpdCBzbGVlcChkZWxheVNlY29uZHMgKiAxMDAwKTtcbiAgfVxufVxuIl19