Can now sync images.

This commit is contained in:
Sean Li 2014-09-30 17:02:31 -07:00
parent 61418d86a9
commit 0002395e7f
3 changed files with 87 additions and 13 deletions

View File

@ -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);
}
});
}
});
};

View File

@ -164,6 +164,7 @@ Meteor.setInterval(function () {
Meteor.setInterval(function () {
if (!Session.get('installing')) {
ImageUtil.sync();
AppUtil.sync();
}
}, 5000);

View File

@ -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('<small class="error">This image is currently being used by <a href="/apps/' + app.name + '">' + app.name + '</a>.</small>');