MCPcopy Create free account
hub / github.com/api3dao/airnode / removeAirnode

Function removeAirnode

packages/airnode-deployer/src/infrastructure/index.ts:635–709  ·  view source on GitHub ↗
(deploymentId: string)

Source from the content-addressed store, hash-verified

633}
634
635export async function removeAirnode(deploymentId: string) {
636 const cloudProviderType = deploymentId.slice(0, 3) as CloudProvider['type'];
637 if (!availableCloudProviders.includes(cloudProviderType)) {
638 throw new Error(`Invalid deployment ID '${deploymentId}'`);
639 }
640
641 const spinner = logger.getSpinner();
642 spinner.start(`Removing Airnode '${deploymentId}'`);
643 if (logger.inDebugMode()) {
644 spinner.info();
645 }
646
647 const goRemove = await go(async () => {
648 const goFetchDeployment = await go(() => fetchDeployment(cloudProviderType, deploymentId));
649 if (!goFetchDeployment.success) {
650 spinner.stop();
651 throw goFetchDeployment.error;
652 }
653 const { deployment } = goFetchDeployment.data;
654
655 const {
656 cloudProvider,
657 airnodeAddress,
658 stage,
659 airnodeVersion: deployedVersion,
660 bucket,
661 bucketLatestDeploymentPath,
662 } = deployment;
663
664 if (deployedVersion !== nodeVersion) {
665 throw new Error(
666 `Can't remove an Airnode deployment with airnode-deployer of a different version. Deployed version: ${deployedVersion}, airnode-deployer version: ${nodeVersion}`
667 );
668 }
669
670 logger.debug('Removing Airnode via Terraform recipes');
671 const airnodeTmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'airnode'));
672 const execOptions = { cwd: airnodeTmpDir };
673 await terraformAirnodeDestroy(execOptions, cloudProvider, deploymentId, bucket, bucketLatestDeploymentPath);
674 fs.rmSync(airnodeTmpDir, { recursive: true });
675
676 // Refreshing the bucket content because the source code archives were removed by Terraform
677 logger.debug('Refreshing Airnode bucket content');
678 const directoryStructure = await cloudProviderLib[cloudProviderType].getBucketDirectoryStructure(bucket);
679 const addressDirectory = getAddressDirectory(directoryStructure, airnodeAddress) as Directory;
680 const stageDirectory = getStageDirectory(directoryStructure, airnodeAddress, stage) as Directory;
681
682 // Delete stage directory and its content
683 logger.debug(`Deleting deployment directory '${stageDirectory.bucketKey}' and its content`);
684 await cloudProviderLib[cloudProviderType].deleteBucketDirectory(bucket, stageDirectory);
685 // eslint-disable-next-line functional/immutable-data
686 delete addressDirectory.children[stage];
687
688 // Delete Airnode address directory if empty
689 if (Object.keys(addressDirectory.children).length === 0) {
690 logger.debug(`Deleting Airnode address directory '${addressDirectory.bucketKey}'`);
691 await cloudProviderLib[cloudProviderType].deleteBucketDirectory(bucket, addressDirectory);
692 // eslint-disable-next-line functional/immutable-data

Callers 3

index.tsFile · 0.90
removeWithReceiptFunction · 0.90
commands.test.tsFile · 0.90

Calls 9

getAddressDirectoryFunction · 0.90
getStageDirectoryFunction · 0.90
fetchDeploymentFunction · 0.85
terraformAirnodeDestroyFunction · 0.85
startMethod · 0.80
infoMethod · 0.80
stopMethod · 0.80
failMethod · 0.80
succeedMethod · 0.80

Tested by

no test coverage detected