docs/meteor/server/images.js

154 lines
4.1 KiB
JavaScript
Executable File

getImageMetaData = function (directory) {
var kiteJSON = getImageJSON(directory);
if (kiteJSON) {
if (!kiteJSON.name) {
kiteJSON.name = _.last(directory.split(path.sep));
}
} else {
kiteJSON = {
name: _.last(directory.split(path.sep))
};
}
return kiteJSON;
};
rebuildImage = function (image, callback) {
deleteFolder(image.path);
var imageMetaData = getImageMetaData(image.originPath);
if (imageMetaData.logo) {
Images.update(image._id, {
$set: {
logoPath: path.join(image.path, imageMetaData.logo)
}
});
} else {
Images.update(image._id, {
$set: {
logoPath: null
}
});
}
Images.update(image._id, {
$set: {
status: 'BUILDING',
meta: imageMetaData
}
});
image = Images.findOne(image._id);
saveImageFolderSync(image.originPath, image._id);
pullImageFromDockerfile(fs.readFileSync(path.join(image.path, 'Dockerfile'), 'utf8'), image._id, function (err) {
if (err) { callback(err, null); return; }
buildImage(image, function (err) {
if (err) { console.error(err); }
callback(null, null);
});
});
};
rebuildImageSync = function (image) {
return Meteor._wrapAsync(rebuildImage)(image);
};
Meteor.methods({
createImage: function (directory) {
this.unblock();
var imageObj = {
status: 'BUILDING',
originPath: directory
};
var imageMetaData = getImageMetaData(directory);
imageObj.meta = imageMetaData;
var imageId = 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) {
this.unblock();
var image = Images.findOne(imageId);
if (!image) {
throw new Meteor.Error(403, "No image found with this ID.");
}
var apps = Apps.find({imageId: imageId}).fetch();
if (apps.length > 0) {
_.each(apps, function (app) {
console.log('Updating app: ' + app.name);
deleteAppSync(app);
Apps.update(app._id, {
$set: {
'docker.Id': null,
status: 'STARTING',
logs: []
}
});
});
rebuildImageSync(image);
_.each(apps, function (app) {
app = Apps.findOne(app._id);
Meteor.call('runApp', app, function (err) {
if (err) { console.error(err); }
});
});
} else {
rebuildImageSync(image);
}
},
changeDirectory: function (imageId, directory) {
this.unblock();
var image = Images.findOne(imageId);
if (!image) {
throw new Meteor.Error(403, "No image found with this ID.");
}
Images.update(imageId, {
$set: {
originPath: directory
}
});
},
validateDirectory: function (directory) {
if (!hasDockerfile(directory)) {
throw new Meteor.Error(400, "Only directories with Dockerfiles are supported now.");
}
},
deleteImage: function (imageId) {
this.unblock();
var image = Images.findOne(imageId);
if (!image) {
throw new Meteor.Error(403, "No image found with this ID.");
}
var app = Apps.findOne({imageId: imageId});
if (!app) {
console.log('here');
try {
deleteImageSync(image);
deleteFolder(image.path);
} catch (e) {
console.log(e);
} finally {
Images.remove({_id: image._id});
}
} else {
throw new Meteor.Error(400, 'This image is currently being used by <a href="/apps/' + app.name + '">' + app.name + "</a>.");
}
}
});