UNPKG

@artilleryio/platform-fargate

Version:
1 lines 4.73 kB
const{createDynamoDocumentClient,createDynamoClient}=require("../utils/create-dynamo-document-client"),getBackendId=require("../utils/get-backend-id"),{getAccountId,getTestRunsTableName,setTestRunsTableName}=require("../util"),AWS=require("aws-sdk");class DataMigrations{constructor(){return this}async init(){var backendId=(await getBackendId())["backendId"];this.region=backendId,AWS.config.update({region:this.region}),this.tableName||(this.accountId=await getAccountId(),backendId=await getTestRunsTableName(this.region),this.tableName=process.env.ARTILLERY_TEST_RUNS_TABLE||backendId||"artilleryio-test-runs-"+this.accountId),this.ddb=createDynamoDocumentClient(),this.dynamoClient=createDynamoClient()}async getDataMigrationsRecord(){var record=(await this.ddb.query({TableName:this.tableName,KeyConditions:{kind:{ComparisonOperator:"BEGINS_WITH",AttributeValueList:["id_"]},testRunId:{ComparisonOperator:"EQ",AttributeValueList:["__artilleryio:datamigrations"]}}}).promise()).Items[0];if(record)return record}async updateDataMigrationsRecord(data={}){var migrationsRecord,expressionAttributeValues,updateExpression,{version:data,report}=data;if(data)return migrationsRecord=await this.getDataMigrationsRecord(),expressionAttributeValues={":version":data,":updated":(new Date).toISOString()},updateExpression=["version = :version","updated = :updated"],report&&(updateExpression.push((data="migrationReport"+data)+" = :"+data),expressionAttributeValues[":"+data]="string"==typeof report?report:JSON.stringify(report)),await this.ddb.update({TableName:this.tableName,Key:{testRunId:"__artilleryio:datamigrations",kind:migrationsRecord.kind},UpdateExpression:"set "+updateExpression.join(", "),ExpressionAttributeValues:expressionAttributeValues}).promise(),this.getDataMigrationsRecord();throw new Error("updateDataMigrationsRecord: version is required")}async lockTestRunsTable(){var migrationsRecord=await this.getDataMigrationsRecord();if(migrationsRecord&&migrationsRecord.migrating)throw(err=new Error(`Migrations record ${migrationsRecord.testRunId}:${migrationsRecord.kind} found. Another data migration process may be already running.`)).name="MigrationInProgress",err;var err=[],migrationsRecord=(migrationsRecord&&err.push({Delete:{TableName:this.tableName,Key:{testRunId:"__artilleryio:datamigrations",kind:migrationsRecord.kind}}}),err.push({Put:{TableName:this.tableName,Item:{...migrationsRecord,testRunId:"__artilleryio:datamigrations",kind:"id_"+Math.random().toString(36).slice(3),migrating:!0,updated:(new Date).toISOString()}}}),await this.ddb.transactWrite({TransactItems:err}).promise(),await this.getDataMigrationsRecord());return migrationsRecord&&migrationsRecord.kind}async unlockTestRunsTable(){var migrationsRecord=await this.getDataMigrationsRecord();await this.ddb.update({TableName:this.tableName,Key:{testRunId:"__artilleryio:datamigrations",kind:migrationsRecord.kind},UpdateExpression:"set migrating = :migrating, updated = :updated",ExpressionAttributeValues:{":migrating":!1,":updated":(new Date).toISOString()}}).promise()}async getDataMigrationsStatus(){var migrationsRecord=await this.getDataMigrationsRecord();if(!migrationsRecord)return{migrating:!1};const{testRunId,kind,...status}=migrationsRecord;return{id:kind,...status}}async setTestRunsTableName(tableName){if(!tableName)throw new Error("setTestRunsTableName: tableName is required");await setTestRunsTableName(tableName,this.region)}async backupTable(tableName=this.tableName){var backupTableName=tableName+"-backup-"+(new Date).toISOString().split(".")[0].replace(/\-|\:/g,""),backupTableName=await this.dynamoClient.createBackup({TableName:tableName,BackupName:backupTableName}).promise();if(backupTableName&&backupTableName.BackupDetails&&backupTableName.BackupDetails.BackupArn)return this.backupDetails={name:backupTableName.BackupDetails?.BackupName,arn:backupTableName.BackupDetails?.BackupArn},this.backupDetails;throw new Error(`backupTable: backup of table ${tableName} cannot be created`)}async deleteTable(tableName=this.tableName){if(!this.backupDetails)throw new Error(`deleteTable: cannot delete table ${tableName} without a backup`);await this.dynamoClient.deleteTable({TableName:tableName}).promise()}async restoreTableBackup(targetTable){if(!targetTable)throw new Error("restoreTableBackup: targetTable argument is required");if(!this.backupDetails)throw new Error("restoreTableBackup: backup not found");var arn=this.backupDetails["arn"];await this.dynamoClient.restoreTableFromBackup({TargetTableName:targetTable,BackupArn:arn}).promise()}}let dataMigrations;function getOrCreateDataMigrationsInstance(){return dataMigrations=dataMigrations||new DataMigrations}module.exports=getOrCreateDataMigrationsInstance;