@yawetse/pkgcloud
Version:
An infrastructure-as-a-service agnostic cloud library for node.js
141 lines (117 loc) • 3.58 kB
JavaScript
/*
* containers.js: Instance methods for working with containers from AWS S3
*
* (C) 2012 Charlie Robbins, Ken Perkins, Ross Kukulinski & the Contributors.
*
*/
var async = require('async'),
pkgcloud = require('../../../../../lib/pkgcloud'),
storage = pkgcloud.providers.amazon.storage;
//
// ### function getContainers (callback)
// #### @callback {function} Continuation to respond to when complete.
// Gets all AWS S3 containers for this instance.
//
exports.getContainers = function (callback) {
var self = this;
self.s3.listBuckets(function(err, data) {
if (err) {
callback(err);
return;
}
var containers = data.Buckets;
containers = containers.map(function(container) {
return new (storage.Container)(self, container);
});
callback(err, containers);
});
};
//
// ### function getContainer (container, callback)
// #### @container {string|storage.Container} Name of the container to return
// #### @callback {function} Continuation to respond to when complete.
// Responds with the AWS S3 container for the specified
// `container`.
//
exports.getContainer = function (container, callback) {
var containerName = container instanceof storage.Container ? container.name : container,
self = this;
self.s3.listObjects({
Bucket: containerName
}, function(err, data) {
return err
? callback(err)
: callback(null, new (storage.Container)(self, data));
});
};
//
// ### function createContainer (options, callback)
// #### @options {string|Container} Container to create in AWS S3.
// #### @callback {function} Continuation to respond to when complete.
// Creates the specified `container` in AWS S3 account associated
// with this instance.
//
exports.createContainer = function (options, callback) {
var containerName = options instanceof storage.Container ? options.name : options,
self = this;
self.s3.createBucket({
Bucket: containerName
}, function(err) {
return err
? callback(err)
: callback(null, new (storage.Container)(self, options));
});
};
//
// ### function destroyContainer (container, callback)
// #### @container {string} Name of the container to destroy
// #### @callback {function} Continuation to respond to when complete.
// Destroys the specified `container` and all files in it.
//
exports.destroyContainer = function (container, callback) {
var containerName = container instanceof storage.Container ? container.name : container,
self = this;
function getPagedFiles(containerName, marker, callback) {
var options = {};
if (marker) {
options.marker = marker;
}
self.getFiles(containerName, marker, callback);
}
function deleteContainer(err) {
if (err) {
return callback(err);
}
self.s3.deleteBucket({
Bucket: containerName
}, function (err) {
return err
? callback(err)
: callback(null, true);
}
);
}
function handleResponse(err, files, meta) {
if (err) {
return callback(err);
}
if (meta.isTruncated) {
deleteFiles(files, function (err) {
if (err) {
callback(err);
return;
}
getPagedFiles(containerName, files[files.length - 1].name, handleResponse);
});
return;
}
deleteFiles(files, deleteContainer);
}
function deleteFiles(files, next) {
async.forEachLimit(files, 10, destroyFile, next);
}
function destroyFile(file, next) {
file.remove(next);
}
getPagedFiles(containerName, handleResponse);
};