diff --git a/meteor/client/lib/imageutil.js b/meteor/client/lib/imageutil.js index f37e7422c8..4a279bd709 100644 --- a/meteor/client/lib/imageutil.js +++ b/meteor/client/lib/imageutil.js @@ -252,3 +252,88 @@ ImageUtil.build = function (image, callback) { }); }); }; + +ImageUtil.remove = function (imageId) { + var image = Images.findOne(imageId); + Images.remove({_id: image._id}); + if (image.docker) { + Docker.removeImage(image.docker.Id, function (err) { + if (err) { console.error(err); } + }); + } + try { + Util.deleteFolder(image.path); + } catch (e) { + console.error(e); + } + Sync.removeAppWatcher(imageId); +}; + +ImageUtil.sync = function () { + Docker.listImages(function (err, dockerImages) { + if (err) { + console.error(err); + } else { + var images = Images.find({}).fetch(); + _.each(images, function (image) { + if (image.docker && image.docker.Id) { + Docker.getImageData(image.docker.Id, function (err, data) { + Images.update(image._id, { + $set: { + docker: data, + } + }) + }); + } + }); + var dockerIds = _.map(images, function (image) { + if (image.docker && image.docker.Id) { + return image.docker.Id; + } + }); + console.log('Doc Ids'); + console.log(dockerIds); + var imageIds = _.map(dockerImages, function (image) { + return image.Id; + }); + console.log('Host Ids'); + console.log(imageIds); + var diffImages = _.difference(dockerIds, imageIds); + console.log('Dangling Ids'); + console.log(diffImages); + _.each(diffImages, function (imageId) { + var image = Images.findOne({'docker.Id': imageId}); + if (image && image.status !== 'BUILDING') { + ImageUtil.remove(image._id); + } + }); + var diffDockerImages = _.reject(dockerImages, function (image) { + return _.contains(dockerIds, image.Id); + }); + console.log('To be added:'); + console.log(diffDockerImages); + _.each(diffDockerImages, function (image) { + var repoTag = _.first(image.RepoTags); + var repoTagTokens = repoTag.split(':'); + var name = repoTagTokens[0]; + var version = repoTagTokens[1]; + var buildingImage = _.find(images, function (image) { + return image.status === 'BUILDING' && image.meta.name === name && image.meta.version === version; + }); + if (!buildingImage) { + var imageObj = { + status: 'READY', + docker: image, + buildLogs: [], + createdAt: new Date(), + meta: { + name: name, + version: version + } + }; + Images.insert(imageObj); + } + }); + } + }); +}; diff --git a/meteor/client/main.js b/meteor/client/main.js index 1c62526865..351cd56e94 100755 --- a/meteor/client/main.js +++ b/meteor/client/main.js @@ -164,6 +164,7 @@ Meteor.setInterval(function () { Meteor.setInterval(function () { if (!Session.get('installing')) { + ImageUtil.sync(); AppUtil.sync(); } }, 5000); diff --git a/meteor/client/views/dashboard/images/dashboard-images-settings.js b/meteor/client/views/dashboard/images/dashboard-images-settings.js index 5f5d8f1f54..76a40f31dc 100755 --- a/meteor/client/views/dashboard/images/dashboard-images-settings.js +++ b/meteor/client/views/dashboard/images/dashboard-images-settings.js @@ -11,21 +11,9 @@ Template.dashboard_images_settings.events({ if (index !== 0) { return; } - var image = Images.findOne(imageId); var app = Apps.findOne({imageId: imageId}); if (!app) { - Images.remove({_id: image._id}); - if (image.docker) { - Docker.removeImage(image.docker.Id, function (err) { - if (err) { console.error(err); } - }); - } - try { - Util.deleteFolder(image.path); - } catch (e) { - console.error(e); - } - Sync.removeAppWatcher(imageId); + ImageUtil.remove(imageId); Router.go('dashboard_images'); } else { $('#error-delete-image').html('This image is currently being used by ' + app.name + '.');