-
Notifications
You must be signed in to change notification settings - Fork 550
/
cleanup.js
104 lines (97 loc) · 2.58 KB
/
cleanup.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
var { S3 } = require("../../clients/client-s3");
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 S3({ maxRetries: 100 });
s3.deleteBucket({ Bucket: bucket }, function(err, data) {
callback(err);
});
};
/**
* Delete objects.
*/
var deleteObjects = function(bucket, callback) {
var s3 = new S3({ maxRetries: 100 });
var params = {
Bucket: bucket
};
s3.listObjects(params, function(err, data) {
if (err) return callback(err);
if (data.Contents && 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();
}
});
};
};