From 34fd6aaebbf6d3d3360da0e9a4df431904e9d282 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Tue, 6 Jan 2015 15:13:01 -0800 Subject: [PATCH 1/4] Fix metrics and untagged images --- meteor/client/lib/apputil.js | 3 +-- meteor/client/lib/imageutil.js | 4 ++-- meteor/client/lib/metrics.js | 23 +++++++++++++++++------ meteor/client/lib/startup.js | 32 ++++++++++++-------------------- meteor/client/lib/util.js | 8 ++++++++ 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index dc72553703..00e53e3bc7 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -31,7 +31,6 @@ AppUtil.run = function (app, callback) { }}); return; } - // Set a delay for app to spin up Apps.update(app._id, {$set: { docker: data, status: 'READY' @@ -167,7 +166,7 @@ AppUtil.sync = function (callback) { var diffApps = _.difference(guiIds, containerIds); _.each(diffApps, function (appContainerId) { var app = Apps.findOne({'docker.Id': appContainerId}); - if (app && app.status === 'READY') { + if (app && app.status !== 'STARTING') { AppUtil.remove(app._id); } }); diff --git a/meteor/client/lib/imageutil.js b/meteor/client/lib/imageutil.js index 4aa4548bf5..db7cfc7442 100644 --- a/meteor/client/lib/imageutil.js +++ b/meteor/client/lib/imageutil.js @@ -259,7 +259,7 @@ ImageUtil.sync = function (callback) { var diffImages = _.difference(kitematicIds, daemonIds); _.each(diffImages, function (imageId) { var image = Images.findOne({'docker.Id': imageId}); - if (image && image.status === 'READY') { + if (image && image.status !== 'BUILDING') { Images.remove(image._id); } }); @@ -269,7 +269,7 @@ ImageUtil.sync = function (callback) { return _.contains(kitematicIds, image.Id); }); _.each(diffDockerImages, function (image) { - if (!image.RepoTags || !image.Config || _.isEmpty(image.Config.ExposedPorts)) { + if (!image.RepoTags || !image.RepoTags || image.RepoTags[0] === ':' || !image.Config || _.isEmpty(image.Config.ExposedPorts)) { return; } diff --git a/meteor/client/lib/metrics.js b/meteor/client/lib/metrics.js index 2321e17381..53fb465830 100644 --- a/meteor/client/lib/metrics.js +++ b/meteor/client/lib/metrics.js @@ -2,9 +2,11 @@ var remote = require('remote'); var app = remote.require('app'); var crypto = require('crypto'); var uuid = require('node-uuid'); -var level = require('levelup'); var path = require('path'); -var db = level(path.join(process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'], 'Library/Application Support/Kitematic/data', 'db')); +var fs = require('fs'); + +var level = require('levelup'); +var db; Metrics = {}; @@ -49,19 +51,28 @@ Metrics.trackEvent = function (name) { }); }; -Metrics.prepareTracking = function () { +Metrics.prepareTracking = function (callback) { + db = level(Util.getMetricsDir()); db.get('metrics.enabled', function (err, value) { if (err && err.notFound) { var settings = Settings.findOne(); if (settings && settings.tracking) { - db.put('metrics.enabled', !!settings.tracking); + db.put('metrics.enabled', !!settings.tracking, function(err) { + callback(); + }); } else { - db.put('metrics.enabled', true); + db.put('metrics.enabled', true, function (err) { + callback(); + }); } } db.get('metrics.uuid', function (err, value) { if (err && err.notFound) { - db.put('metrics.uuid', uuid.v4()); + db.put('metrics.uuid', uuid.v4(), function (err) { + callback(); + }); + } else { + callback(); } }); }); diff --git a/meteor/client/lib/startup.js b/meteor/client/lib/startup.js index 6bd9ea31f5..ee11a019a0 100644 --- a/meteor/client/lib/startup.js +++ b/meteor/client/lib/startup.js @@ -2,28 +2,20 @@ var fs = require('fs'); Meteor.startup(function () { console.log('Kitematic started.'); - if (!fs.existsSync(Util.KITE_PATH)) { - console.log('Created Kitematic directory.'); - fs.mkdirSync(Util.KITE_PATH); - } - if (!fs.existsSync(Util.KITE_TAR_PATH)) { - console.log('Created Kitematic .tar directory.'); - fs.mkdirSync(Util.KITE_TAR_PATH); - } - if (!fs.existsSync(Util.KITE_IMAGES_PATH)) { - console.log('Created Kitematic .images directory.'); - fs.mkdirSync(Util.KITE_IMAGES_PATH); - } - if (!fs.existsSync(Util.getResourceDir())) { - fs.mkdirSync(Util.getResourceDir()); - } - Metrics.prepareTracking(); - Metrics.trackEvent('app started'); - Metrics.trackEvent('app heartbeat'); - Meteor.setInterval(function () { + [Util.KITE_PATH, Util.KITE_TAR_PATH, Util.KITE_IMAGES_PATH, Util.getAppSupportDir(), Util.getResourceDir(), Util.getDataDir(), Util.getMetricsDir()].forEach(function (d) { + if (!fs.existsSync(d)) { + fs.mkdirSync(d); + } + }); + + Metrics.prepareTracking(function() { + Metrics.trackEvent('app started'); Metrics.trackEvent('app heartbeat'); - }, 14400000); + Meteor.setInterval(function () { + Metrics.trackEvent('app heartbeat'); + }, 14400000); + }); Boot2Docker.ip(function (err, ip) { if (!err) { diff --git a/meteor/client/lib/util.js b/meteor/client/lib/util.js index c55302344c..31672455fe 100755 --- a/meteor/client/lib/util.js +++ b/meteor/client/lib/util.js @@ -17,6 +17,10 @@ Util.getBinDir = function () { return path.join(process.env.DIR, 'resources'); }; +Util.getAppSupportDir = function () { + return path.join(Util.getHomePath(), 'Library/Application Support/Kitematic'); +}; + Util.getResourceDir = function () { return path.join(Util.getHomePath(), 'Library/Application Support/Kitematic/Resources'); }; @@ -25,6 +29,10 @@ Util.getDataDir = function () { return path.join(Util.getHomePath(), 'Library/Application Support/Kitematic/data'); }; +Util.getMetricsDir = function () { + return path.join(Util.getHomePath(), 'Library/Application Support/Kitematic/data/db'); +}; + Util.KITE_PATH = path.join(Util.getHomePath(), 'Kitematic'); Util.KITE_TAR_PATH = path.join(Util.KITE_PATH, '.tar'); Util.KITE_IMAGES_PATH = path.join(Util.KITE_PATH, '.images'); From a4c085a361ed273647cc1a95a44178d87ee398c2 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Tue, 6 Jan 2015 15:13:15 -0800 Subject: [PATCH 2/4] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 707acace61..5c9939209d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Kitematic", - "version": "0.4.3", + "version": "0.4.4", "author": "Kitematic", "description": "Simple Docker App management for Mac OS X.", "homepage": "https://kitematic.com/", From 553b0773c848c90cc3d3b47ba0322a4168e05d8f Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Tue, 6 Jan 2015 15:20:09 -0800 Subject: [PATCH 3/4] fixing metrics --- meteor/client/lib/metrics.js | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/meteor/client/lib/metrics.js b/meteor/client/lib/metrics.js index 53fb465830..e906e4d87e 100644 --- a/meteor/client/lib/metrics.js +++ b/meteor/client/lib/metrics.js @@ -51,6 +51,18 @@ Metrics.trackEvent = function (name) { }); }; +Metrics.prepareUUID = function (callback) { + db.get('metrics.uuid', function (err, value) { + if (err && err.notFound) { + db.put('metrics.uuid', uuid.v4(), function (err) { + callback(); + }); + } else { + callback(); + } + }); +}); + Metrics.prepareTracking = function (callback) { db = level(Util.getMetricsDir()); db.get('metrics.enabled', function (err, value) { @@ -58,22 +70,15 @@ Metrics.prepareTracking = function (callback) { var settings = Settings.findOne(); if (settings && settings.tracking) { db.put('metrics.enabled', !!settings.tracking, function(err) { - callback(); + Metrics.prepareUUID(callback); }); } else { db.put('metrics.enabled', true, function (err) { - callback(); + Metrics.prepareUUID(callback); }); } + } else { + Metrics.prepareUUID(callback); } - db.get('metrics.uuid', function (err, value) { - if (err && err.notFound) { - db.put('metrics.uuid', uuid.v4(), function (err) { - callback(); - }); - } else { - callback(); - } - }); }); }; From eaaf813ac158893298daa508c43026b97ca763f8 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Tue, 6 Jan 2015 16:15:53 -0800 Subject: [PATCH 4/4] Fixing random containers created --- meteor/client/lib/apputil.js | 2 +- meteor/client/lib/docker.js | 3 --- meteor/client/lib/metrics.js | 2 +- meteor/client/main.js | 4 ++-- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index 00e53e3bc7..85ca32d569 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -179,7 +179,7 @@ AppUtil.sync = function (callback) { return app.status === 'STARTING' && app.name === appName; }); - if (startingApp || _.isEmpty(container.NetworkSettings.Ports)) { + if (startingApp || _.isEmpty(container.NetworkSettings.Ports) || !_.pairs(container.NetworkSettings.Ports)[0][1]) { return; } diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index 5a406723fd..bef58be0a9 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -109,8 +109,6 @@ Docker.runContainer = function (app, image, callback) { containerOpts.ExposedPorts = app.docker.NetworkSettings.Ports; } - console.log(containerOpts); - Docker.client().createContainer(containerOpts, function (err, container) { if (err) { callback(err, null); return; } console.log('Created container: ' + container.id); @@ -135,7 +133,6 @@ Docker.runContainer = function (app, image, callback) { startOpts.PublishAllPorts = true; } - console.log(startOpts); container.start(startOpts, function (err) { if (err) { callback(err, null); return; } console.log('Started container: ' + container.id); diff --git a/meteor/client/lib/metrics.js b/meteor/client/lib/metrics.js index e906e4d87e..fbb2377e63 100644 --- a/meteor/client/lib/metrics.js +++ b/meteor/client/lib/metrics.js @@ -61,7 +61,7 @@ Metrics.prepareUUID = function (callback) { callback(); } }); -}); +}; Metrics.prepareTracking = function (callback) { db = level(Util.getMetricsDir()); diff --git a/meteor/client/main.js b/meteor/client/main.js index 300c07df70..b6ee870a03 100755 --- a/meteor/client/main.js +++ b/meteor/client/main.js @@ -225,7 +225,7 @@ updateBoot2DockerUtilization = function (callback) { startUpdatingBoot2DockerUtilization = function () { updateBoot2DockerUtilization(function (err) { if (err) {console.log(err);} }); - Meteor.setTimeout(startUpdatingBoot2DockerUtilization, 2000); + Meteor.setTimeout(startUpdatingBoot2DockerUtilization, 8000); }; startSyncingAppState = function () { @@ -239,5 +239,5 @@ startSyncingAppState = function () { } }); }); - Meteor.setTimeout(startSyncingAppState, 2000); + Meteor.setTimeout(startSyncingAppState, 8000); };