features/extra/cleanup.js (84 lines of code) (raw):
module.exports = function() {
/**
* Cleanup fixtures and resources. The world does not exist when
* this handler is executed. Only resource cleanup and shutdown
* should happen here.
*/
this.registerHandler('AfterFeatures', function(event, callback) {
var path = require('path');
var fs = require('fs');
try {
var filePath = path.resolve('integ.buckets.json');
if (!fs.existsSync(filePath)) return callback();
deleteFixtures();
var cache = JSON.parse(fs.readFileSync(filePath));
var buckets = cache.buckets;
if (buckets.length) {
eachSeries(buckets, cleanBucket, function(err) {
fs.unlinkSync(filePath);
callback(err);
});
} else {
callback();
}
} catch (fileErr) {
callback(fileErr);
}
});
/**
* Delete fixtures
*/
var deleteFixtures = function() {
var fs = require('fs');
var path = require('path');
var fixturePath = path.resolve('./features/extra/fixtures/tmp');
if (fs.existsSync(fixturePath)) {
fs.readdirSync(fixturePath).forEach(function(file) {
fs.unlinkSync(path.join(fixturePath, file));
});
fs.rmdirSync(fixturePath);
}
};
/**
* Run bucket cleanup serially.
*
*/
var eachSeries = function(list, iter, callback) {
var item = list.shift();
iter(item, function(err) {
if (err) return callback(err);
else if (list.length) {
eachSeries(list, iter, callback);
} else {
return callback();
}
});
};
/*
* Delete objects and then bucket.
*/
var cleanBucket = function(bucket, callback) {
deleteObjects(bucket, function(err, data) {
if (err) callback(err);
deleteBucket(bucket, callback);
});
};
/*
* Delete bucket
*/
var deleteBucket = function(bucket, callback) {
var s3 = new AWS.S3({maxRetries: 100});
s3.deleteBucket({Bucket: bucket}, function(err, data) {
callback(err);
});
};
/**
* Delete objects.
*/
var deleteObjects = function(bucket, callback) {
var s3 = new AWS.S3({maxRetries: 100});
var params = {
Bucket: bucket
};
s3.listObjects(params, function (err, data) {
if (err) return callback(err);
if (data.Contents.length > 0) {
params.Delete = { Objects: [] };
data.Contents.forEach(function (item) {
params.Delete.Objects.push({Key: item.Key});
});
s3.deleteObjects(params, callback);
} else {
callback();
}
});
};
var bootSDK = function () {
var path = require('path');
var SDK = require(path.resolve('./'));
SDK.config.update({
region: process.env['CONFIGURED_REGION']
});
return SDK;
};
var AWS = bootSDK();
};