Refactored image code.

This commit is contained in:
Sean Li 2014-09-01 02:15:00 -07:00
parent 72271a3d20
commit 3d615fd776
3 changed files with 68 additions and 88 deletions

View File

@ -197,27 +197,14 @@
"removeAppWatcher": true, "removeAppWatcher": true,
"addAppWatcher": true, "addAppWatcher": true,
"resolveWatchers": true, "resolveWatchers": true,
"createTarFile": true,
"createTarFileSync": true,
"deleteImage": true,
"checkDefaultImages": true, "checkDefaultImages": true,
"resolveDefaultImages": true, "resolveDefaultImages": true,
"checkDefaultContainers": true, "checkDefaultContainers": true,
"resolveDefaultContainers": true, "resolveDefaultContainers": true,
"killAndRemoveContainers": true, "killAndRemoveContainers": true,
"deleteImageSync": true,
"upContainers": true, "upContainers": true,
"reloadDefaultContainers": true, "reloadDefaultContainers": true,
"removeImages": true, "removeImages": true,
"pullImageFromDockerfile": true,
"buildImage": true,
"getImageMetaData": true,
"getImageJSON": true,
"rebuildImage": true,
"saveImageFolderSync": true,
"rebuildImageSync": true,
"saveImageFolder": true,
"getFromImage": true,
// Forms // Forms
"showFormErrors": true, "showFormErrors": true,

View File

@ -91,3 +91,43 @@ Images.allow({
}); });
Images.attachSchema(schemaImages); Images.attachSchema(schemaImages);
Images.after.insert(function (userId, image) {
var imageId = this._id;
var imagePath = path.join(KITE_IMAGES_PATH, imageId);
Images.update(imageId, {
$set: {
path: imagePath
}
});
if (image.meta.logo) {
Images.update(imageId, {
$set: {
logoPath: path.join(imagePath, image.meta.logo)
}
});
}
image = Images.findOne(imageId);
Images.saveFolderSync(image.originPath, imageId);
Images.pull(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), imageId, function (err) {
if (err) { throw err; }
Images.build(image, function (err) {
if (err) { console.error(err); }
});
});
});
Images.after.remove(function (userId, image) {
if (image.docker) {
try {
Docker.removeImageSync(image.docker.Id);
} catch (e) {
console.error(e);
}
}
try {
Util.deleteFolder(image.path);
} catch (e) {
console.error(e);
}
});

View File

@ -1,4 +1,4 @@
createTarFile = function (image, callback) { var createTarFile = function (image, callback) {
var TAR_PATH = path.join(KITE_TAR_PATH, image._id + '.tar'); var TAR_PATH = path.join(KITE_TAR_PATH, image._id + '.tar');
exec('tar czf ' + TAR_PATH + ' -C ' + image.path + ' .', function (err) { exec('tar czf ' + TAR_PATH + ' -C ' + image.path + ' .', function (err) {
if (err) { callback(err, null); return; } if (err) { callback(err, null); return; }
@ -7,11 +7,11 @@ createTarFile = function (image, callback) {
}); });
}; };
createTarFileSync = function (image) { var createTarFileSync = function (image) {
return Meteor._wrapAsync(createTarFile)(image); return Meteor._wrapAsync(createTarFile)(image);
}; };
getFromImage = function (dockerfile) { var getFromImage = function (dockerfile) {
var patternString = "(FROM)(.*)"; var patternString = "(FROM)(.*)";
var regex = new RegExp(patternString, "g"); var regex = new RegExp(patternString, "g");
var fromInstruction = dockerfile.match(regex); var fromInstruction = dockerfile.match(regex);
@ -22,7 +22,7 @@ getFromImage = function (dockerfile) {
} }
}; };
getImageJSON = function (directory) { var getImageJSON = function (directory) {
var KITE_JSON_PATH = path.join(directory, 'image.json'); var KITE_JSON_PATH = path.join(directory, 'image.json');
if (fs.existsSync(KITE_JSON_PATH)) { if (fs.existsSync(KITE_JSON_PATH)) {
var data = fs.readFileSync(KITE_JSON_PATH, 'utf8'); var data = fs.readFileSync(KITE_JSON_PATH, 'utf8');
@ -32,23 +32,7 @@ getImageJSON = function (directory) {
} }
}; };
saveImageFolder = function (directory, imageId, callback) { var getImageMetaData = function (directory) {
var destinationPath = path.join(KITE_IMAGES_PATH, imageId);
if (!fs.existsSync(destinationPath)) {
fs.mkdirSync(destinationPath, function (err) {
if (err) { callback(err); return; }
});
Util.copyFolder(directory, destinationPath);
console.log('Copied image folder for: ' + imageId);
callback(null);
}
};
saveImageFolderSync = function (directory, imageId) {
return Meteor._wrapAsync(saveImageFolder)(directory, imageId);
};
getImageMetaData = function (directory) {
var kiteJSON = getImageJSON(directory); var kiteJSON = getImageJSON(directory);
if (kiteJSON) { if (kiteJSON) {
if (!kiteJSON.name) { if (!kiteJSON.name) {
@ -62,24 +46,23 @@ getImageMetaData = function (directory) {
return kiteJSON; return kiteJSON;
}; };
deleteImage = function (image, callback) { Images.saveFolder = function (directory, imageId, callback) {
if (!image.docker) { var destinationPath = path.join(KITE_IMAGES_PATH, imageId);
callback(null, {}); if (!fs.existsSync(destinationPath)) {
return; fs.mkdirSync(destinationPath, function (err) {
if (err) { callback(err); return; }
});
Util.copyFolder(directory, destinationPath);
console.log('Copied image folder for: ' + imageId);
callback(null);
} }
try {
Docker.removeImageSync(image.docker.Id);
} catch (e) {
console.error(e);
}
callback(null);
}; };
deleteImageSync = function (image) { Images.saveFolderSync = function (directory, imageId) {
return Meteor._wrapAsync(deleteImage)(image); return Meteor._wrapAsync(Images.saveFolder)(directory, imageId);
}; };
rebuildImage = function (image, callback) { Images.rebuild = function (image, callback) {
Util.deleteFolder(image.path); Util.deleteFolder(image.path);
var imageMetaData = getImageMetaData(image.originPath); var imageMetaData = getImageMetaData(image.originPath);
if (imageMetaData.logo) { if (imageMetaData.logo) {
@ -102,21 +85,21 @@ rebuildImage = function (image, callback) {
} }
}); });
image = Images.findOne(image._id); image = Images.findOne(image._id);
saveImageFolderSync(image.originPath, image._id); Images.saveFolderSync(image.originPath, image._id);
pullImageFromDockerfile(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), image._id, function (err) { Images.pull(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), image._id, function (err) {
if (err) { callback(err, null); return; } if (err) { callback(err, null); return; }
buildImage(image, function (err) { Images.build(image, function (err) {
if (err) { console.error(err); } if (err) { console.error(err); }
callback(null, null); callback(null, null);
}); });
}); });
}; };
rebuildImageSync = function (image) { Images.rebuildSync = function (image) {
return Meteor._wrapAsync(rebuildImage)(image); return Meteor._wrapAsync(Images.rebuild)(image);
}; };
pullImageFromDockerfile = function (dockerfile, imageId, callback) { Images.pull = function (dockerfile, imageId, callback) {
var fromImage = getFromImage(dockerfile); var fromImage = getFromImage(dockerfile);
console.log('From image: ' + fromImage); console.log('From image: ' + fromImage);
var installedImage = null; var installedImage = null;
@ -170,7 +153,7 @@ pullImageFromDockerfile = function (dockerfile, imageId, callback) {
} }
}; };
buildImage = function (image, callback) { Images.build = function (image, callback) {
Fiber(function () { Fiber(function () {
var tarFilePath = createTarFileSync(image); var tarFilePath = createTarFileSync(image);
Images.update(image._id, { Images.update(image._id, {
@ -251,29 +234,7 @@ Meteor.methods({
}; };
var imageMetaData = getImageMetaData(directory); var imageMetaData = getImageMetaData(directory);
imageObj.meta = imageMetaData; imageObj.meta = imageMetaData;
var imageId = Images.insert(imageObj); Images.insert(imageObj);
var imagePath = path.join(KITE_IMAGES_PATH, imageId);
Images.update(imageId, {
$set: {
path: imagePath
}
});
if (imageObj.meta.logo) {
Images.update(imageId, {
$set: {
logoPath: path.join(imagePath, imageObj.meta.logo)
}
});
}
var image = Images.findOne(imageId);
saveImageFolderSync(directory, imageId);
console.log('Saved folder sync');
pullImageFromDockerfile(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), imageId, function (err) {
if (err) { throw err; }
buildImage(image, function (err) {
if (err) { console.error(err); }
});
});
}, },
rebuildImage: function (imageId) { rebuildImage: function (imageId) {
this.unblock(); this.unblock();
@ -300,7 +261,7 @@ Meteor.methods({
} }
}); });
}); });
rebuildImageSync(image); Images.rebuildSync(image);
_.each(apps, function (app) { _.each(apps, function (app) {
app = Apps.findOne(app._id); app = Apps.findOne(app._id);
Meteor.call('runApp', app, function (err) { Meteor.call('runApp', app, function (err) {
@ -308,7 +269,7 @@ Meteor.methods({
}); });
}); });
} else { } else {
rebuildImageSync(image); Images.rebuildSync(image);
} }
}, },
changeDirectory: function (imageId, directory) { changeDirectory: function (imageId, directory) {
@ -337,15 +298,7 @@ Meteor.methods({
} }
var app = Apps.findOne({imageId: imageId}); var app = Apps.findOne({imageId: imageId});
if (!app) { if (!app) {
console.log('here'); Images.remove({_id: image._id});
try {
deleteImageSync(image);
Util.deleteFolder(image.path);
} catch (e) {
console.log(e);
} finally {
Images.remove({_id: image._id});
}
} else { } else {
throw new Meteor.Error(400, 'This image is currently being used by <a href="/apps/' + app.name + '">' + app.name + "</a>."); throw new Meteor.Error(400, 'This image is currently being used by <a href="/apps/' + app.name + '">' + app.name + "</a>.");
} }