From 32b14b533512f345a852f445df01c8bb9913e6c6 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Sun, 28 Sep 2014 16:14:11 -0700 Subject: [PATCH 01/20] Added container listing function. --- meteor/client/lib/docker.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index 2bd3b447f4..025c47f682 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -27,6 +27,33 @@ Docker.removeContainer = function (containerId, callback) { }); }; +Docker.listContainers = function (callback) { + docker.listContainers(function (err, containers) { + if (err) { + callback(err, null); + } else { + var cbList = _.map(containers, function (container) { + return function (cb) { + Docker.getContainerData(container.Id, function (err, data) { + if (err) { + cb(err, null); + } else { + cb(null, data); + } + }); + } + }); + async.parallel(cbList, function (err, results) { + if (err) { + callback(err, null); + } else { + callback(null, results); + } + }); + } + }); +}; + Docker.getContainerData = function (containerId, callback) { var container = docker.getContainer(containerId); container.inspect(function (err, data) { From 8f0dc52325801508941b067846be82b2407cd8d2 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Sun, 28 Sep 2014 18:02:07 -0700 Subject: [PATCH 02/20] Function to list image data. --- meteor/client/lib/docker.js | 40 ++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index 025c47f682..78814c079a 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -28,7 +28,7 @@ Docker.removeContainer = function (containerId, callback) { }; Docker.listContainers = function (callback) { - docker.listContainers(function (err, containers) { + docker.listContainers({all: true}, function (err, containers) { if (err) { callback(err, null); } else { @@ -168,12 +168,42 @@ Docker.getImageData = function (imageId, callback) { image.inspect(function (err, data) { if (err) { callback(err, null); - return; } else { - data.Config.Volumes = convertVolumeObjToArray(data.Config.Volumes); - data.ContainerConfig.Volumes = convertVolumeObjToArray(data.ContainerConfig.Volumes); + if (data.Config && data.Config.Volumes) { + data.Config.Volumes = convertVolumeObjToArray(data.Config.Volumes); + } + if (data.ContainerConfig && data.ContainerConfig.Volumes) { + data.ContainerConfig.Volumes = convertVolumeObjToArray(data.ContainerConfig.Volumes); + } callback(null, data); - return; + } + }); +}; + +Docker.listImages = function (callback) { + docker.listImages({all: false}, function (err, images) { + if (err) { + callback(err, null); + } else { + var cbList = _.map(images, function (image) { + return function (cb) { + Docker.getImageData(image.Id, function (err, data) { + if (err) { + cb(err, null); + } else { + var mergedData = _.extend(image, data); + cb(null, mergedData); + } + }); + } + }); + async.parallel(cbList, function (err, results) { + if (err) { + callback(err, null); + } else { + callback(null, results); + } + }); } }); }; From f69ddb1251d0e1233be449f9b3ace05dbcd268c7 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Tue, 30 Sep 2014 13:12:16 -0700 Subject: [PATCH 03/20] Container status sync'ed across app and docker host. --- meteor/client/lib/apputil.js | 87 ++++++++++++++++++- meteor/client/lib/docker.js | 12 ++- meteor/client/main.js | 8 +- .../views/dashboard/apps/dashboard-apps.html | 38 ++++---- .../dashboard/components/modal-create-app.js | 5 -- .../dashboard/images/dashboard-images.html | 38 ++++---- .../dashboard/layouts/dashboard-layout.html | 4 +- 7 files changed, 143 insertions(+), 49 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index 058b0401f4..df87411209 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -1,12 +1,17 @@ var exec = require('exec'); var path = require('path'); +var fs = require('fs'); var Convert = require('ansi-to-html'); var convert = new Convert(); AppUtil = {}; +AppUtil.create = function () { + +}; + AppUtil.run = function (app) { - var image = Images.findOne({_id: app.imageId}); + var image = Images.findOne({'docker.Id': app.docker.Image}); // Delete old container if one already exists Docker.removeContainer(app.name, function (err) { if (err) { console.error(err); } @@ -166,3 +171,83 @@ AppUtil.recover = function () { }); }); }; + +AppUtil.sync = function () { + Docker.listContainers(function (err, containers) { + if (err) { + console.error(err); + } else { + var apps = Apps.find({}).fetch(); + _.each(apps, function (app) { + if (app.docker && app.docker.Id) { + Docker.getContainerData(app.docker.Id, function (err, data) { + console.log(data); + var status = 'STARTING'; + if (data.State.Running) { + status = 'READY'; + } else { + status = 'ERROR'; + } + Apps.update(app._id, { + $set: { + docker: data, + status: status + } + }) + }); + } + }); + var dockerIds = _.map(apps, function (app) { + return app.docker.Id; + }); + var containerIds = _.map(containers, function (container) { + return container.Id; + }); + var diffApps = _.difference(dockerIds, containerIds); + _.each(diffApps, function (appContainerId) { + var app = Apps.findOne({'docker.Id': appContainerId}); + if (app) { + AppUtil.remove(app._id); + } + }); + var diffContainers = _.reject(containers, function (container) { + return _.contains(dockerIds, container.Id); + }); + _.each(diffContainers, function (container) { + var appName = container.Name.substring(1); + var appPath = path.join(Util.KITE_PATH, appName); + if (!fs.existsSync(appPath)) { + console.log('Created Kite ' + appName + ' directory.'); + fs.mkdirSync(appPath, function (err) { + if (err) { throw err; } + }); + } + var envVars = container.Config.Env; + var config = {}; + _.each(envVars, function (envVar) { + var eqPos = envVar.indexOf('='); + var envKey = envVar.substring(0, eqPos); + var envVal = envVar.substring(eqPos + 1); + config[envKey] = envVal; + }); + var status = 'STARTING'; + if (container.State.Running) { + status = 'READY'; + } else { + status = 'ERROR'; + } + var appObj = { + name: appName, + docker: container, + status: status, + config: config, + path: appPath, + logs: [], + createdAt: new Date() + }; + console.log(appObj); + Apps.insert(appObj); + }); + } + }); +}; diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index 78814c079a..ef8bcd79a9 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -61,9 +61,15 @@ Docker.getContainerData = function (containerId, callback) { callback(err, null); return; } else { - data.Config.Volumes = convertVolumeObjToArray(data.Config.Volumes); - data.Volumes = convertVolumeObjToArray(data.Volumes); - data.VolumesRW = convertVolumeObjToArray(data.VolumesRW); + if (data.Config && data.Config.Volumes) { + data.Config.Volumes = convertVolumeObjToArray(data.Config.Volumes); + } + if (data.Volumes) { + data.Volumes = convertVolumeObjToArray(data.Volumes); + } + if (data.VolumesRW) { + data.VolumesRW = convertVolumeObjToArray(data.VolumesRW); + } callback(null, data); return; } diff --git a/meteor/client/main.js b/meteor/client/main.js index 33b0a1c216..1c62526865 100755 --- a/meteor/client/main.js +++ b/meteor/client/main.js @@ -150,7 +150,7 @@ Meteor.setInterval(function () { if (!Session.get('boot2dockerOff')) { fixBoot2DockerVM(function (err) { if (err) { console.log(err); return; } - AppUtil.recover(); + //AppUtil.recover(); fixDefaultImages(function (err) { if (err) { console.log(err); return; } fixDefaultContainers(function (err) { @@ -161,3 +161,9 @@ Meteor.setInterval(function () { } } }, 5000); + +Meteor.setInterval(function () { + if (!Session.get('installing')) { + AppUtil.sync(); + } +}, 5000); diff --git a/meteor/client/views/dashboard/apps/dashboard-apps.html b/meteor/client/views/dashboard/apps/dashboard-apps.html index 7831bfbe7e..c0c154a705 100755 --- a/meteor/client/views/dashboard/apps/dashboard-apps.html +++ b/meteor/client/views/dashboard/apps/dashboard-apps.html @@ -9,24 +9,26 @@ {{/if}} -
- {{#if hasItem apps}} -
- {{#each apps}} - {{> dashboard_single_app}} - {{/each}} -
- {{else}} -
-
-

There are no apps yet.

- {{#if $.Session.equals 'boot2dockerState' 'poweroff'}} - Create App - {{else}} - Create App - {{/if}} -
- {{/if}} +
+
+ {{#if hasItem apps}} +
+ {{#each apps}} + {{> dashboard_single_app}} + {{/each}} +
+ {{else}} +
+
+

There are no apps yet.

+ {{#if $.Session.equals 'boot2dockerState' 'poweroff'}} + Create App + {{else}} + Create App + {{/if}} +
+ {{/if}} +
{{> modal_create_app}} {{> modal_create_image}} diff --git a/meteor/client/views/dashboard/components/modal-create-app.js b/meteor/client/views/dashboard/components/modal-create-app.js index 63c7235277..068acaa1bc 100755 --- a/meteor/client/views/dashboard/components/modal-create-app.js +++ b/meteor/client/views/dashboard/components/modal-create-app.js @@ -36,11 +36,6 @@ Template.modal_create_app.events({ createdAt: new Date() }; var appId = Apps.insert(appObj); - Apps.update(appId, { - $set: { - 'config.APP_ID': appId - } - }); var app = Apps.findOne(appId); var image = Images.findOne(app.imageId); Util.copyVolumes(image.path, app.name, function (err) { diff --git a/meteor/client/views/dashboard/images/dashboard-images.html b/meteor/client/views/dashboard/images/dashboard-images.html index ea1d5f837c..e4e6a489da 100755 --- a/meteor/client/views/dashboard/images/dashboard-images.html +++ b/meteor/client/views/dashboard/images/dashboard-images.html @@ -9,24 +9,26 @@ {{/if}}
-
- {{#if hasItem images}} -
- {{#each images}} - {{> dashboard_single_image}} - {{/each}} -
- {{else}} -
-
-

There are no images yet.

- {{#if $.Session.equals 'boot2dockerState' 'poweroff'}} - Create Image - {{else}} - Create Image - {{/if}} -
- {{/if}} +
+
+ {{#if hasItem images}} +
+ {{#each images}} + {{> dashboard_single_image}} + {{/each}} +
+ {{else}} +
+
+

There are no images yet.

+ {{#if $.Session.equals 'boot2dockerState' 'poweroff'}} + Create Image + {{else}} + Create Image + {{/if}} +
+ {{/if}} +
{{> modal_create_app}} {{> modal_create_image}} diff --git a/meteor/client/views/dashboard/layouts/dashboard-layout.html b/meteor/client/views/dashboard/layouts/dashboard-layout.html index 62061490d2..ad3c0f3c0f 100755 --- a/meteor/client/views/dashboard/layouts/dashboard-layout.html +++ b/meteor/client/views/dashboard/layouts/dashboard-layout.html @@ -6,9 +6,7 @@ {{> dashboard_menu}}
-
- {{> yield}} -
+ {{> yield}}
From 61418d86a9f950215f21a66efb28947202b7b9c2 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Tue, 30 Sep 2014 14:20:13 -0700 Subject: [PATCH 04/20] Fixed app state syncing bugs. --- meteor/client/lib/apputil.js | 78 ++++++++++--------- .../views/dashboard/apps/dashboard-apps.js | 2 +- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index df87411209..d25ebc7c0c 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -6,12 +6,8 @@ var convert = new Convert(); AppUtil = {}; -AppUtil.create = function () { - -}; - AppUtil.run = function (app) { - var image = Images.findOne({'docker.Id': app.docker.Image}); + var image = Images.findOne({_id: app.imageId}); // Delete old container if one already exists Docker.removeContainer(app.name, function (err) { if (err) { console.error(err); } @@ -181,7 +177,6 @@ AppUtil.sync = function () { _.each(apps, function (app) { if (app.docker && app.docker.Id) { Docker.getContainerData(app.docker.Id, function (err, data) { - console.log(data); var status = 'STARTING'; if (data.State.Running) { status = 'READY'; @@ -198,7 +193,9 @@ AppUtil.sync = function () { } }); var dockerIds = _.map(apps, function (app) { - return app.docker.Id; + if (app.docker && app.docker.Id) { + return app.docker.Id; + } }); var containerIds = _.map(containers, function (container) { return container.Id; @@ -206,7 +203,7 @@ AppUtil.sync = function () { var diffApps = _.difference(dockerIds, containerIds); _.each(diffApps, function (appContainerId) { var app = Apps.findOne({'docker.Id': appContainerId}); - if (app) { + if (app && app.status !== 'STARTING') { AppUtil.remove(app._id); } }); @@ -215,38 +212,43 @@ AppUtil.sync = function () { }); _.each(diffContainers, function (container) { var appName = container.Name.substring(1); - var appPath = path.join(Util.KITE_PATH, appName); - if (!fs.existsSync(appPath)) { - console.log('Created Kite ' + appName + ' directory.'); - fs.mkdirSync(appPath, function (err) { - if (err) { throw err; } - }); - } - var envVars = container.Config.Env; - var config = {}; - _.each(envVars, function (envVar) { - var eqPos = envVar.indexOf('='); - var envKey = envVar.substring(0, eqPos); - var envVal = envVar.substring(eqPos + 1); - config[envKey] = envVal; + var startingApp = _.find(apps, function (app) { + return app.status === 'STARTING' && app.name === appName; }); - var status = 'STARTING'; - if (container.State.Running) { - status = 'READY'; - } else { - status = 'ERROR'; + if (!startingApp) { + var appPath = path.join(Util.KITE_PATH, appName); + if (!fs.existsSync(appPath)) { + console.log('Created Kite ' + appName + ' directory.'); + fs.mkdirSync(appPath, function (err) { + if (err) { throw err; } + }); + } + var envVars = container.Config.Env; + var config = {}; + _.each(envVars, function (envVar) { + var eqPos = envVar.indexOf('='); + var envKey = envVar.substring(0, eqPos); + var envVal = envVar.substring(eqPos + 1); + config[envKey] = envVal; + }); + var status = 'STARTING'; + if (container.State.Running) { + status = 'READY'; + } else { + status = 'ERROR'; + } + var appObj = { + name: appName, + docker: container, + status: status, + config: config, + path: appPath, + logs: [], + createdAt: new Date() + }; + console.log(appObj); + Apps.insert(appObj); } - var appObj = { - name: appName, - docker: container, - status: status, - config: config, - path: appPath, - logs: [], - createdAt: new Date() - }; - console.log(appObj); - Apps.insert(appObj); }); } }); diff --git a/meteor/client/views/dashboard/apps/dashboard-apps.js b/meteor/client/views/dashboard/apps/dashboard-apps.js index d71c0c7520..d0f8dbf2bd 100755 --- a/meteor/client/views/dashboard/apps/dashboard-apps.js +++ b/meteor/client/views/dashboard/apps/dashboard-apps.js @@ -1,5 +1,5 @@ Template.dashboard_apps.helpers({ apps: function () { - return Apps.find({}, {sort: {createdAt: -1}}); + return Apps.find({name: {$ne: 'kite-dns'}}, {sort: {createdAt: -1}}); } }); From 0002395e7fcd32dfcf65b6e32b3b97f80a679351 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Tue, 30 Sep 2014 17:02:31 -0700 Subject: [PATCH 05/20] Can now sync images. --- meteor/client/lib/imageutil.js | 85 +++++++++++++++++++ meteor/client/main.js | 1 + .../images/dashboard-images-settings.js | 14 +-- 3 files changed, 87 insertions(+), 13 deletions(-) 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 + '.'); From 79ac85b02520732004a5ee5791bff4ed9c027932 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Tue, 30 Sep 2014 17:14:34 -0700 Subject: [PATCH 06/20] Fixed bugs with image state syncing. --- meteor/client/lib/imageutil.js | 8 -------- meteor/client/views/dashboard/images/dashboard-images.js | 2 +- .../views/dashboard/images/dashboard-single-image.html | 6 ++++-- .../views/dashboard/layouts/dashboard-images-layout.html | 4 +++- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/meteor/client/lib/imageutil.js b/meteor/client/lib/imageutil.js index 4a279bd709..c7d5d1f718 100644 --- a/meteor/client/lib/imageutil.js +++ b/meteor/client/lib/imageutil.js @@ -291,16 +291,10 @@ ImageUtil.sync = function () { 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') { @@ -310,8 +304,6 @@ ImageUtil.sync = function () { 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(':'); diff --git a/meteor/client/views/dashboard/images/dashboard-images.js b/meteor/client/views/dashboard/images/dashboard-images.js index 9edaddcd94..197829a68b 100755 --- a/meteor/client/views/dashboard/images/dashboard-images.js +++ b/meteor/client/views/dashboard/images/dashboard-images.js @@ -1,5 +1,5 @@ Template.dashboard_images.helpers({ images: function () { - return Images.find({}, {sort: {createdAt: -1}}); + return Images.find({'meta.name': {$ne: 'kite-dns'}}, {sort: {createdAt: -1}}); } }); diff --git a/meteor/client/views/dashboard/images/dashboard-single-image.html b/meteor/client/views/dashboard/images/dashboard-single-image.html index 4040e6cdb7..b35da3a017 100755 --- a/meteor/client/views/dashboard/images/dashboard-single-image.html +++ b/meteor/client/views/dashboard/images/dashboard-single-image.html @@ -18,7 +18,7 @@ {{/if}} {{/if}} {{/if}} - {{meta.name}} + {{meta.name}}:{{meta.version}} {{#if $eq status 'BUILDING'}} Creating image. This may take a couple minutes... {{else}} @@ -29,7 +29,9 @@ {{#if $eq status 'READY'}} {{/if}} - + {{#if originPath}} + + {{/if}} {{#if $neq status 'BUILDING'}} {{/if}} diff --git a/meteor/client/views/dashboard/layouts/dashboard-images-layout.html b/meteor/client/views/dashboard/layouts/dashboard-images-layout.html index 5200b750ba..bd12904a9e 100755 --- a/meteor/client/views/dashboard/layouts/dashboard-images-layout.html +++ b/meteor/client/views/dashboard/layouts/dashboard-images-layout.html @@ -14,7 +14,9 @@ {{#if $eq status 'READY'}} {{/if}} - + {{#if originPath}} + + {{/if}} {{#if $neq status 'BUILDING'}} {{/if}} From b9a089180db1bc4b67a9f89e1370cb4fd06b7563 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Wed, 1 Oct 2014 13:31:08 -0700 Subject: [PATCH 07/20] Updated version and sync image name and tag. --- meteor/.meteor/release | 2 +- meteor/.meteor/versions | 67 +++++++++++++++++++--------------- meteor/client/lib/imageutil.js | 17 ++++++++- 3 files changed, 54 insertions(+), 32 deletions(-) diff --git a/meteor/.meteor/release b/meteor/.meteor/release index 8f6f45d174..01887b6a68 100755 --- a/meteor/.meteor/release +++ b/meteor/.meteor/release @@ -1 +1 @@ -METEOR@0.9.1.1 +METEOR@0.9.3.1 diff --git a/meteor/.meteor/versions b/meteor/.meteor/versions index cd174d525a..7133b02b45 100644 --- a/meteor/.meteor/versions +++ b/meteor/.meteor/versions @@ -1,54 +1,61 @@ -application-configuration@1.0.1 -autoupdate@1.0.6 +application-configuration@1.0.2 +autoupdate@1.1.1 +base64@1.0.0 binary-heap@1.0.0 blaze-tools@1.0.0 -blaze@2.0.0 +blaze@2.0.1 +boilerplate-generator@1.0.0 callback-hook@1.0.0 -check@1.0.0 +check@1.0.1 ctl-helper@1.0.3 ctl@1.0.1 dburles:collection-helpers@1.0.0 -ddp@1.0.8 -deps@1.0.3 -ejson@1.0.1 +ddp@1.0.9 +deps@1.0.4 +ejson@1.0.3 +fastclick@1.0.0 follower-livedata@1.0.1 geojson-utils@1.0.0 -html-tools@1.0.0 -htmljs@1.0.0 +html-tools@1.0.1 +htmljs@1.0.1 +http@1.0.6 id-map@1.0.0 iron:core@0.3.4 iron:dynamic-template@0.4.1 iron:layout@0.4.1 -iron:router@0.9.3 +iron:router@0.9.4 jquery@1.0.0 json@1.0.0 -less@1.0.7 -livedata@1.0.9 -logging@1.0.2 -meteor-platform@1.0.2 -meteor@1.0.3 -minifiers@1.0.2 -minimongo@1.0.2 -mongo-livedata@1.0.4 -mongo@1.0.4 +less@1.0.9 +livedata@1.0.10 +logging@1.0.3 +meteor-platform@1.1.1 +meteor@1.1.1 +minifiers@1.1.0 +minimongo@1.0.3 +mobile-status-bar@1.0.0 +mongo-livedata@1.0.5 +mongo@1.0.6 mrt:underscore-string-latest@2.3.3 observe-sequence@1.0.2 ordered-dict@1.0.0 -raix:handlebar-helpers@0.1.2 +raix:handlebar-helpers@0.1.3 random@1.0.0 -reactive-dict@1.0.2 -reactive-var@1.0.1 -reload@1.0.1 +reactive-dict@1.0.3 +reactive-var@1.0.2 +reload@1.1.0 retry@1.0.0 reywood:iron-router-ga@0.3.2 -routepolicy@1.0.0 -session@1.0.1 +routepolicy@1.0.1 +session@1.0.2 simison:bootstrap3-less@0.3.0 spacebars-compiler@1.0.2 -spacebars@1.0.1 -standard-app-packages@1.0.1 -templating@1.0.5 +spacebars@1.0.2 +standard-app-packages@1.0.2 +templating@1.0.7 tracker@1.0.2 -ui@1.0.2 +ui@1.0.3 underscore@1.0.0 -webapp@1.0.3 +url@1.0.0 +webapp-hashing@1.0.0 +webapp@1.1.2 diff --git a/meteor/client/lib/imageutil.js b/meteor/client/lib/imageutil.js index c7d5d1f718..1cd5ac45fe 100644 --- a/meteor/client/lib/imageutil.js +++ b/meteor/client/lib/imageutil.js @@ -277,10 +277,25 @@ ImageUtil.sync = function () { var images = Images.find({}).fetch(); _.each(images, function (image) { if (image.docker && image.docker.Id) { + var imageData = _.find(dockerImages, function (dockerImage) { + return dockerImage.Id === image.docker.Id; + }); + if (imageData && imageData.RepoTags) { + var repoTag = _.first(imageData.RepoTags); + var repoTagTokens = repoTag.split(':'); + var name = repoTagTokens[0]; + var version = repoTagTokens[1]; + Images.update(image._id, { + $set: { + 'meta.name': name, + 'meta.version': version + } + }); + } Docker.getImageData(image.docker.Id, function (err, data) { Images.update(image._id, { $set: { - docker: data, + docker: data } }) }); From 1249b235104f97048751ac31a9d08244ebd83b0f Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 2 Oct 2014 13:16:38 -0700 Subject: [PATCH 08/20] Refactoring and bug fixes. --- meteor/client/lib/apputil.js | 22 +++++++++---------- meteor/client/lib/docker.js | 17 +++++++-------- meteor/client/lib/imageutil.js | 7 +++--- meteor/client/lib/util.js | 39 +++++++++++++++++++++++++--------- 4 files changed, 51 insertions(+), 34 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index d25ebc7c0c..50311b4b76 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -33,11 +33,10 @@ AppUtil.restartHelper = function (app) { if (err) { console.error(err); } Docker.getContainerData(app.docker.Id, function (err, data) { if (err) { console.error(err); } - // Use dig to refresh the DNS - exec('/usr/bin/dig ' + app.name + '.kite @172.17.42.1', function(err, stdout, stderr) { - console.log(err); - console.log(stdout); - console.log(stderr); + Util.refreshDNS(app, function (err) { + if (err) { + console.error(err); + } Apps.update(app._id, {$set: { status: 'READY', docker: data @@ -58,11 +57,10 @@ AppUtil.start = function (appId) { if (err) { console.error(err); } Docker.getContainerData(app.docker.Id, function (err, data) { if (err) { console.error(err); } - // Use dig to refresh the DNS - exec('/usr/bin/dig ' + app.name + '.kite @172.17.42.1', function(err, stdout, stderr) { - console.log(err); - console.log(stdout); - console.log(stderr); + Util.refreshDNS(app, function (err) { + if (err) { + console.error(err); + } Apps.update(app._id, {$set: { status: 'READY', docker: data @@ -178,9 +176,9 @@ AppUtil.sync = function () { if (app.docker && app.docker.Id) { Docker.getContainerData(app.docker.Id, function (err, data) { var status = 'STARTING'; - if (data.State.Running) { + if (data && data.State && data.State.Running) { status = 'READY'; - } else { + } else if (data && data.State && !data.State.Running) { status = 'ERROR'; } Apps.update(app._id, { diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index ef8bcd79a9..928a2f39c7 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -84,7 +84,7 @@ Docker.runContainer = function (app, image, callback) { }); console.log(envParam); docker.createContainer({ - Image: image._id.toLowerCase(), + Image: image.docker.Id, Tty: false, Env: envParam, Hostname: app.name, @@ -94,7 +94,7 @@ Docker.runContainer = function (app, image, callback) { console.log('Created container: ' + container.id); // Bind volumes var binds = []; - if (image.docker.Config.Volumes.length > 0) { + if (image.docker.Config.Volumes && image.docker.Config.Volumes.length > 0) { _.each(image.docker.Config.Volumes, function (vol) { binds.push('/var/lib/docker/binds/' + app.name + vol.Path + ':' + vol.Path); }); @@ -106,11 +106,10 @@ Docker.runContainer = function (app, image, callback) { }, function (err) { if (err) { callback(err, null); return; } console.log('Started container: ' + container.id); - // Use dig to refresh the DNS - exec('/usr/bin/dig ' + app.name + '.kite @172.17.42.1', function(err, stdout, stderr) { - console.log(err); - console.log(stdout); - console.log(stderr); + Util.refreshDNS(app, function (err) { + if (err) { + console.error(err); + } callback(null, container); }); }); @@ -170,7 +169,7 @@ var convertVolumeObjToArray = function (obj) { }; Docker.getImageData = function (imageId, callback) { - var image = docker.getImage(imageId.toLowerCase()); + var image = docker.getImage(imageId); image.inspect(function (err, data) { if (err) { callback(err, null); @@ -215,7 +214,7 @@ Docker.listImages = function (callback) { }; Docker.removeImage = function (imageId, callback) { - var image = docker.getImage(imageId.toLowerCase()); + var image = docker.getImage(imageId); image.remove({force: true}, function (err) { if (err) { callback(err); return; } console.log('Deleted image: ' + imageId); diff --git a/meteor/client/lib/imageutil.js b/meteor/client/lib/imageutil.js index 1cd5ac45fe..e7bc233be5 100644 --- a/meteor/client/lib/imageutil.js +++ b/meteor/client/lib/imageutil.js @@ -196,7 +196,7 @@ ImageUtil.build = function (image, callback) { buildLogs: [] } }); - docker.buildImage(tarFilePath, {t: image._id.toLowerCase()}, function (err, response) { + docker.buildImage(tarFilePath, {t: image.meta.name + ':' + image.meta.version}, function (err, response) { if (err) { callback(err); } console.log('Building Docker image...'); response.setEncoding('utf8'); @@ -221,8 +221,9 @@ ImageUtil.build = function (image, callback) { console.error(e); } var imageData = null; - Docker.getImageData(image._id, function (err, data) { + Docker.getImageData(image.meta.name + ':' + image.meta.version, function (err, data) { if (err) { + console.error(err); Images.update(image._id, { $set: { status: 'ERROR' @@ -313,7 +314,7 @@ ImageUtil.sync = function () { _.each(diffImages, function (imageId) { var image = Images.findOne({'docker.Id': imageId}); if (image && image.status !== 'BUILDING') { - ImageUtil.remove(image._id); + //ImageUtil.remove(image._id); } }); var diffDockerImages = _.reject(dockerImages, function (image) { diff --git a/meteor/client/lib/util.js b/meteor/client/lib/util.js index 33eb5a626f..0f1da75816 100755 --- a/meteor/client/lib/util.js +++ b/meteor/client/lib/util.js @@ -4,10 +4,25 @@ var nodeCrypto = require('crypto'); var request = require('request'); var progress = require('request-progress'); var ncp = require('ncp').ncp; +var exec = require('exec'); ncp.limit = 16; Util = {}; +Util.refreshDNS = function (app, callback) { + // Use dig to refresh the DNS + exec('/usr/bin/dig ' + app.name + '.kite @172.17.42.1', function (err, stdout, stderr) { + console.log(err); + console.log(stdout); + console.log(stderr); + if (err) { + callback(err); + } else { + callback(null); + } + }); +}; + Util.getHomePath = function () { return process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME']; }; @@ -56,17 +71,21 @@ Util.copyFolder = function (src, dest, callback) { }; Util.copyVolumes = function (directory, appName, callback) { - var volumesPath = path.join(directory, 'volumes'); - if (fs.existsSync(volumesPath)) { - var destinationPath = path.join(Util.KITE_PATH, appName); - Util.copyFolder(volumesPath, destinationPath, function (err) { - if (err) { - callback(err); - return; - } - console.log('Copied volumes for: ' + appName); + if (directory) { + var volumesPath = path.join(directory, 'volumes'); + if (fs.existsSync(volumesPath)) { + var destinationPath = path.join(Util.KITE_PATH, appName); + Util.copyFolder(volumesPath, destinationPath, function (err) { + if (err) { + callback(err); + return; + } + console.log('Copied volumes for: ' + appName); + callback(null); + }); + } else { callback(null); - }); + } } else { callback(null); } From cd1c8558481faab708b9754e9099ab3af1f6665d Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 2 Oct 2014 18:58:07 -0700 Subject: [PATCH 09/20] Added timeout and retry limit for dig command. --- meteor/client/lib/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meteor/client/lib/util.js b/meteor/client/lib/util.js index 0f1da75816..f215ce5640 100755 --- a/meteor/client/lib/util.js +++ b/meteor/client/lib/util.js @@ -11,7 +11,7 @@ Util = {}; Util.refreshDNS = function (app, callback) { // Use dig to refresh the DNS - exec('/usr/bin/dig ' + app.name + '.kite @172.17.42.1', function (err, stdout, stderr) { + exec('/usr/bin/dig +time=2 +tries=1 ' + app.name + '.kite @172.17.42.1', function (err, stdout, stderr) { console.log(err); console.log(stdout); console.log(stderr); From 67d37878bf7c5e58afd2a251af486a5d2f857c90 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 9 Oct 2014 11:25:47 -0700 Subject: [PATCH 10/20] Fixed bug when image doesn't finish building. --- .gitignore | 2 +- meteor/client/lib/docker.js | 42 +++++++++++++------ meteor/client/lib/imageutil.js | 27 +++++++----- meteor/client/main.js | 4 ++ .../views/dashboard/apps/dashboard-apps.js | 2 +- .../components/modal-create-image.js | 1 + .../dashboard/images/dashboard-images.js | 2 +- .../images/dashboard-single-image.html | 6 ++- .../layouts/dashboard-images-layout.html | 4 +- 9 files changed, 62 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 293db15e3e..9640d95d0f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ bin # Resources resources/cache -resources/base-images.tar.gz +resources/base-images-*.tar.gz resources/virtualbox-*.pkg resources/boot2docker* resources/node-webkit diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index 928a2f39c7..cd3bb0f1a2 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -169,18 +169,37 @@ var convertVolumeObjToArray = function (obj) { }; Docker.getImageData = function (imageId, callback) { - var image = docker.getImage(imageId); - image.inspect(function (err, data) { + docker.listImages({all: false}, function (err, images) { if (err) { callback(err, null); } else { - if (data.Config && data.Config.Volumes) { - data.Config.Volumes = convertVolumeObjToArray(data.Config.Volumes); - } - if (data.ContainerConfig && data.ContainerConfig.Volumes) { - data.ContainerConfig.Volumes = convertVolumeObjToArray(data.ContainerConfig.Volumes); - } - callback(null, data); + var dockerImage = _.find(images, function (image) { + return image.Id === imageId; + }); + var image = docker.getImage(imageId); + image.inspect(function (err, data) { + if (err) { + callback(err, null); + } else { + if (data.Config && data.Config.Volumes) { + data.Config.Volumes = convertVolumeObjToArray(data.Config.Volumes); + } + if (data.ContainerConfig && data.ContainerConfig.Volumes) { + data.ContainerConfig.Volumes = convertVolumeObjToArray(data.ContainerConfig.Volumes); + } + /*console.log('Image ID'); + console.log(imageId); + console.log('Raw Docker Data:'); + console.log(dockerImage); + console.log('Inspected Data:'); + console.log(data);*/ + if (!dockerImage) { + callback(null, data); + } else { + callback(null, _.extend(dockerImage, data)); + } + } + }); } }); }; @@ -196,8 +215,7 @@ Docker.listImages = function (callback) { if (err) { cb(err, null); } else { - var mergedData = _.extend(image, data); - cb(null, mergedData); + cb(null, data); } }); } @@ -273,7 +291,7 @@ Docker.resolveDefaultImages = function () { image.inspect(function (err) { if (err) { if (err.reason === 'no such image') { - docker.loadImage(path.join(Util.getBinDir(), 'base-images.tar.gz'), {}, function (err) { + docker.loadImage(path.join(Util.getBinDir(), Docker.DEFAULT_IMAGES_FILENAME), {}, function (err) { if (err) { innerCallback(err); return; diff --git a/meteor/client/lib/imageutil.js b/meteor/client/lib/imageutil.js index e7bc233be5..e88a2486bc 100644 --- a/meteor/client/lib/imageutil.js +++ b/meteor/client/lib/imageutil.js @@ -44,9 +44,13 @@ ImageUtil.getMetaData = function (directory) { if (!kiteJSON.name) { kiteJSON.name = _.last(directory.split(path.sep)); } + if (!kiteJSON.version) { + kiteJSON.version = 'latest'; + } } else { kiteJSON = { - name: _.last(directory.split(path.sep)) + name: _.last(directory.split(path.sep)), + version: 'latest' }; } return kiteJSON; @@ -222,6 +226,7 @@ ImageUtil.build = function (image, callback) { } var imageData = null; Docker.getImageData(image.meta.name + ':' + image.meta.version, function (err, data) { + console.log(data); if (err) { console.error(err); Images.update(image._id, { @@ -277,19 +282,19 @@ ImageUtil.sync = function () { } else { var images = Images.find({}).fetch(); _.each(images, function (image) { - if (image.docker && image.docker.Id) { + var image = Images.findOne(image._id); + if (image && image.docker && image.docker.Id) { + var duplicateImages = Images.find({'docker.Id': image.docker.Id, _id: {$ne: image._id}}).fetch(); + _.each(duplicateImages, function (duplicateImage) { + Images.remove(duplicateImage._id); + }); var imageData = _.find(dockerImages, function (dockerImage) { return dockerImage.Id === image.docker.Id; }); if (imageData && imageData.RepoTags) { - var repoTag = _.first(imageData.RepoTags); - var repoTagTokens = repoTag.split(':'); - var name = repoTagTokens[0]; - var version = repoTagTokens[1]; Images.update(image._id, { $set: { - 'meta.name': name, - 'meta.version': version + tags: imageData.RepoTags } }); } @@ -314,7 +319,7 @@ ImageUtil.sync = function () { _.each(diffImages, function (imageId) { var image = Images.findOne({'docker.Id': imageId}); if (image && image.status !== 'BUILDING') { - //ImageUtil.remove(image._id); + ImageUtil.remove(image._id); } }); var diffDockerImages = _.reject(dockerImages, function (image) { @@ -328,17 +333,19 @@ ImageUtil.sync = function () { var buildingImage = _.find(images, function (image) { return image.status === 'BUILDING' && image.meta.name === name && image.meta.version === version; }); - if (!buildingImage) { + if (!buildingImage && name !== '' && version !== '') { var imageObj = { status: 'READY', docker: image, buildLogs: [], createdAt: new Date(), + tags: image.RepoTags, meta: { name: name, version: version } }; + console.log(imageObj); Images.insert(imageObj); } }); diff --git a/meteor/client/main.js b/meteor/client/main.js index 351cd56e94..6c376e12af 100755 --- a/meteor/client/main.js +++ b/meteor/client/main.js @@ -67,6 +67,10 @@ Handlebars.registerHelper('isUpdating', function () { return Session.get('isUpdating'); }); +Handlebars.registerHelper('displayTags', function (tags, delimiter) { + return tags.join(delimiter); +}); + var fixBoot2DockerVM = function (callback) { Boot2Docker.check(function (err) { if (err) { diff --git a/meteor/client/views/dashboard/apps/dashboard-apps.js b/meteor/client/views/dashboard/apps/dashboard-apps.js index d0f8dbf2bd..d71c0c7520 100755 --- a/meteor/client/views/dashboard/apps/dashboard-apps.js +++ b/meteor/client/views/dashboard/apps/dashboard-apps.js @@ -1,5 +1,5 @@ Template.dashboard_apps.helpers({ apps: function () { - return Apps.find({name: {$ne: 'kite-dns'}}, {sort: {createdAt: -1}}); + return Apps.find({}, {sort: {createdAt: -1}}); } }); diff --git a/meteor/client/views/dashboard/components/modal-create-image.js b/meteor/client/views/dashboard/components/modal-create-image.js index 410b7810ba..ddfbd4b636 100755 --- a/meteor/client/views/dashboard/components/modal-create-image.js +++ b/meteor/client/views/dashboard/components/modal-create-image.js @@ -49,6 +49,7 @@ Template.modal_create_image.events({ }; var imageMetaData = ImageUtil.getMetaData(directory); imageObj.meta = imageMetaData; + imageObj.tags = [imageMetaData.name + ':' + imageMetaData.version]; var imageId = Images.insert(imageObj); var imagePath = path.join(Util.KITE_IMAGES_PATH, imageId); Images.update(imageId, { diff --git a/meteor/client/views/dashboard/images/dashboard-images.js b/meteor/client/views/dashboard/images/dashboard-images.js index 197829a68b..9edaddcd94 100755 --- a/meteor/client/views/dashboard/images/dashboard-images.js +++ b/meteor/client/views/dashboard/images/dashboard-images.js @@ -1,5 +1,5 @@ Template.dashboard_images.helpers({ images: function () { - return Images.find({'meta.name': {$ne: 'kite-dns'}}, {sort: {createdAt: -1}}); + return Images.find({}, {sort: {createdAt: -1}}); } }); diff --git a/meteor/client/views/dashboard/images/dashboard-single-image.html b/meteor/client/views/dashboard/images/dashboard-single-image.html index b35da3a017..f714320b17 100755 --- a/meteor/client/views/dashboard/images/dashboard-single-image.html +++ b/meteor/client/views/dashboard/images/dashboard-single-image.html @@ -18,7 +18,7 @@ {{/if}} {{/if}} {{/if}} - {{meta.name}}:{{meta.version}} + {{displayTags tags ', '}} {{#if $eq status 'BUILDING'}} Creating image. This may take a couple minutes... {{else}} @@ -33,7 +33,9 @@ {{/if}} {{#if $neq status 'BUILDING'}} - + {{#if originPath}} + + {{/if}} {{/if}} diff --git a/meteor/client/views/dashboard/layouts/dashboard-images-layout.html b/meteor/client/views/dashboard/layouts/dashboard-images-layout.html index bd12904a9e..8489a0cd72 100755 --- a/meteor/client/views/dashboard/layouts/dashboard-images-layout.html +++ b/meteor/client/views/dashboard/layouts/dashboard-images-layout.html @@ -18,7 +18,9 @@ {{/if}} {{#if $neq status 'BUILDING'}} - + {{#if originPath}} + + {{/if}} {{/if}} From 0071a7fcf53f70d0fd62c8ef5d181cae6f086165 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 9 Oct 2014 11:43:13 -0700 Subject: [PATCH 11/20] Removes duplicate apps and fixes apps duplicating during installs. --- meteor/client/lib/apputil.js | 7 ++++++- meteor/client/lib/docker.js | 6 ------ meteor/client/lib/router.js | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index 50311b4b76..f5c4900490 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -173,7 +173,12 @@ AppUtil.sync = function () { } else { var apps = Apps.find({}).fetch(); _.each(apps, function (app) { - if (app.docker && app.docker.Id) { + var app = Apps.findOne(app._id); + if (app && app.docker && app.docker.Id) { + var duplicateApps = Apps.find({'docker.Id': app.docker.Id, _id: {$ne: app._id}}).fetch(); + _.each(duplicateApps, function (duplicateApp) { + Apps.remove(duplicateApp._id); + }); Docker.getContainerData(app.docker.Id, function (err, data) { var status = 'STARTING'; if (data && data.State && data.State.Running) { diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index cd3bb0f1a2..62c2767a2d 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -187,12 +187,6 @@ Docker.getImageData = function (imageId, callback) { if (data.ContainerConfig && data.ContainerConfig.Volumes) { data.ContainerConfig.Volumes = convertVolumeObjToArray(data.ContainerConfig.Volumes); } - /*console.log('Image ID'); - console.log(imageId); - console.log('Raw Docker Data:'); - console.log(dockerImage); - console.log('Inspected Data:'); - console.log(data);*/ if (!dockerImage) { callback(null, data); } else { diff --git a/meteor/client/lib/router.js b/meteor/client/lib/router.js index 7a24265013..c3bbef1d6b 100755 --- a/meteor/client/lib/router.js +++ b/meteor/client/lib/router.js @@ -13,7 +13,7 @@ Router.configure({ SetupController = RouteController.extend({ layoutTemplate: 'setup_layout', waitOn: function () { - return [Meteor.subscribe('installs'), Meteor.subscribe('settings')]; + return [Meteor.subscribe('apps'), Meteor.subscribe('images'), Meteor.subscribe('installs'), Meteor.subscribe('settings')]; } }); From 80758ffbdb0929fc65dc8f7083d11c382ccc41b2 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 9 Oct 2014 13:36:16 -0700 Subject: [PATCH 12/20] Ignores the kite-dns app and image during syncing. --- meteor/client/lib/apputil.js | 2 +- meteor/client/lib/imageutil.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index f5c4900490..5ae1610f14 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -218,7 +218,7 @@ AppUtil.sync = function () { var startingApp = _.find(apps, function (app) { return app.status === 'STARTING' && app.name === appName; }); - if (!startingApp) { + if (!startingApp && appName !== 'kite-dns') { var appPath = path.join(Util.KITE_PATH, appName); if (!fs.existsSync(appPath)) { console.log('Created Kite ' + appName + ' directory.'); diff --git a/meteor/client/lib/imageutil.js b/meteor/client/lib/imageutil.js index e88a2486bc..597b55b30a 100644 --- a/meteor/client/lib/imageutil.js +++ b/meteor/client/lib/imageutil.js @@ -333,7 +333,7 @@ ImageUtil.sync = function () { var buildingImage = _.find(images, function (image) { return image.status === 'BUILDING' && image.meta.name === name && image.meta.version === version; }); - if (!buildingImage && name !== '' && version !== '') { + if (!buildingImage && name !== '' && version !== '' && name !== 'kite-dns') { var imageObj = { status: 'READY', docker: image, From fdbc38fd1f827e747e0400e219ca299a8456b95f Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 9 Oct 2014 13:38:48 -0700 Subject: [PATCH 13/20] Re-enabled automatic app recovering. --- meteor/client/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meteor/client/main.js b/meteor/client/main.js index 6c376e12af..241115dab6 100755 --- a/meteor/client/main.js +++ b/meteor/client/main.js @@ -154,7 +154,7 @@ Meteor.setInterval(function () { if (!Session.get('boot2dockerOff')) { fixBoot2DockerVM(function (err) { if (err) { console.log(err); return; } - //AppUtil.recover(); + AppUtil.recover(); fixDefaultImages(function (err) { if (err) { console.log(err); return; } fixDefaultContainers(function (err) { From dd643f6acdafc834619b2b448a6adef3c895dac8 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 10 Oct 2014 12:38:51 -0700 Subject: [PATCH 14/20] Display the right image for the app. --- .../client/views/dashboard/apps/dashboard-single-app.html | 2 +- .../views/dashboard/layouts/dashboard-apps-layout.html | 4 +++- meteor/collections/apps.js | 6 +++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/meteor/client/views/dashboard/apps/dashboard-single-app.html b/meteor/client/views/dashboard/apps/dashboard-single-app.html index baa2df2470..f0e34d0991 100755 --- a/meteor/client/views/dashboard/apps/dashboard-single-app.html +++ b/meteor/client/views/dashboard/apps/dashboard-single-app.html @@ -19,7 +19,7 @@ {{/if}} {{/if}} {{name}} - {{image.meta.name}} + {{displayTags image.tags}}
{{#if $eq status 'READY'}} diff --git a/meteor/client/views/dashboard/layouts/dashboard-apps-layout.html b/meteor/client/views/dashboard/layouts/dashboard-apps-layout.html index 67465a1e9b..0ac0bd2745 100755 --- a/meteor/client/views/dashboard/layouts/dashboard-apps-layout.html +++ b/meteor/client/views/dashboard/layouts/dashboard-apps-layout.html @@ -16,7 +16,9 @@ {{/if}} - + {{#if image}} + + {{/if}} {{/if}} {{#if $eq status 'READY'}} diff --git a/meteor/collections/apps.js b/meteor/collections/apps.js index f59b617715..00cd62c731 100755 --- a/meteor/collections/apps.js +++ b/meteor/collections/apps.js @@ -24,7 +24,11 @@ Apps.allow({ Apps.helpers({ image: function () { - return Images.findOne(this.imageId); + if (this.docker && this.docker.Image) { + return Images.findOne({'docker.Id': this.docker.Image}); + } else { + return Images.findOne(this.imageId); + } }, hostUrl: function () { return this.name + '.kite'; From 1adde4dc2566e1becf46781aae31182bb90013b4 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 16 Oct 2014 17:44:55 -0700 Subject: [PATCH 15/20] Don't display anything if there are no tags. --- meteor/client/main.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/meteor/client/main.js b/meteor/client/main.js index 241115dab6..08ff7f7444 100755 --- a/meteor/client/main.js +++ b/meteor/client/main.js @@ -68,7 +68,11 @@ Handlebars.registerHelper('isUpdating', function () { }); Handlebars.registerHelper('displayTags', function (tags, delimiter) { - return tags.join(delimiter); + if (tags) { + return tags.join(delimiter); + } else { + return ''; + } }); var fixBoot2DockerVM = function (callback) { From 105fb835f22b3096569505f194a38ff49b178267 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 17 Oct 2014 11:08:23 -0700 Subject: [PATCH 16/20] Cannot create app from image without exposed port. --- .../client/views/dashboard/images/dashboard-single-image.html | 4 +++- .../views/dashboard/layouts/dashboard-images-layout.html | 4 +++- meteor/collections/images.js | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/meteor/client/views/dashboard/images/dashboard-single-image.html b/meteor/client/views/dashboard/images/dashboard-single-image.html index f714320b17..b2e39d6a23 100755 --- a/meteor/client/views/dashboard/images/dashboard-single-image.html +++ b/meteor/client/views/dashboard/images/dashboard-single-image.html @@ -27,7 +27,9 @@
{{#if $eq status 'READY'}} - + {{#if hasExposedPort}} + + {{/if}} {{/if}} {{#if originPath}} diff --git a/meteor/client/views/dashboard/layouts/dashboard-images-layout.html b/meteor/client/views/dashboard/layouts/dashboard-images-layout.html index 8489a0cd72..bbe9fd9438 100755 --- a/meteor/client/views/dashboard/layouts/dashboard-images-layout.html +++ b/meteor/client/views/dashboard/layouts/dashboard-images-layout.html @@ -12,7 +12,9 @@ Images » {{this.meta.name}} {{#if $eq status 'READY'}} - + {{#if hasExposedPort}} + + {{/if}} {{/if}} {{#if originPath}} diff --git a/meteor/collections/images.js b/meteor/collections/images.js index 1c94dfe578..c380d0edc3 100755 --- a/meteor/collections/images.js +++ b/meteor/collections/images.js @@ -19,6 +19,9 @@ Images.helpers({ } else { return '100%'; } + }, + hasExposedPort: function () { + return this.docker && this.docker.Config && this.docker.Config.ExposedPorts; } }); From 870fad25d462aac73bf59fce9b3458c69e1249d8 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 17 Oct 2014 13:33:12 -0700 Subject: [PATCH 17/20] Updated Meteor. --- meteor/.meteor/.finished-upgraders | 1 + meteor/.meteor/platforms | 2 + meteor/.meteor/release | 2 +- meteor/.meteor/versions | 104 +++++++++--------- .../dashboard/components/modal-create-app.js | 2 +- 5 files changed, 57 insertions(+), 54 deletions(-) create mode 100644 meteor/.meteor/platforms diff --git a/meteor/.meteor/.finished-upgraders b/meteor/.meteor/.finished-upgraders index ee0ed5a316..68df3d8d0d 100644 --- a/meteor/.meteor/.finished-upgraders +++ b/meteor/.meteor/.finished-upgraders @@ -4,3 +4,4 @@ notices-for-0.9.0 notices-for-0.9.1 +0.9.4-platform-file diff --git a/meteor/.meteor/platforms b/meteor/.meteor/platforms new file mode 100644 index 0000000000..efeba1b50c --- /dev/null +++ b/meteor/.meteor/platforms @@ -0,0 +1,2 @@ +server +browser diff --git a/meteor/.meteor/release b/meteor/.meteor/release index 01887b6a68..7057f80807 100755 --- a/meteor/.meteor/release +++ b/meteor/.meteor/release @@ -1 +1 @@ -METEOR@0.9.3.1 +METEOR@0.9.4 diff --git a/meteor/.meteor/versions b/meteor/.meteor/versions index 7133b02b45..a8192eeadd 100644 --- a/meteor/.meteor/versions +++ b/meteor/.meteor/versions @@ -1,61 +1,61 @@ -application-configuration@1.0.2 -autoupdate@1.1.1 -base64@1.0.0 -binary-heap@1.0.0 -blaze-tools@1.0.0 -blaze@2.0.1 -boilerplate-generator@1.0.0 -callback-hook@1.0.0 -check@1.0.1 -ctl-helper@1.0.3 -ctl@1.0.1 +application-configuration@1.0.3 +autoupdate@1.1.2 +base64@1.0.1 +binary-heap@1.0.1 +blaze-tools@1.0.1 +blaze@2.0.2 +boilerplate-generator@1.0.1 +callback-hook@1.0.1 +check@1.0.2 +ctl-helper@1.0.4 +ctl@1.0.2 dburles:collection-helpers@1.0.0 -ddp@1.0.9 -deps@1.0.4 -ejson@1.0.3 -fastclick@1.0.0 -follower-livedata@1.0.1 -geojson-utils@1.0.0 -html-tools@1.0.1 -htmljs@1.0.1 -http@1.0.6 -id-map@1.0.0 +ddp@1.0.10 +deps@1.0.5 +ejson@1.0.4 +fastclick@1.0.1 +follower-livedata@1.0.2 +geojson-utils@1.0.1 +html-tools@1.0.2 +htmljs@1.0.2 +http@1.0.7 +id-map@1.0.1 iron:core@0.3.4 iron:dynamic-template@0.4.1 iron:layout@0.4.1 iron:router@0.9.4 -jquery@1.0.0 -json@1.0.0 -less@1.0.9 -livedata@1.0.10 -logging@1.0.3 -meteor-platform@1.1.1 -meteor@1.1.1 -minifiers@1.1.0 -minimongo@1.0.3 -mobile-status-bar@1.0.0 -mongo-livedata@1.0.5 -mongo@1.0.6 +jquery@1.0.1 +json@1.0.1 +less@1.0.10 +livedata@1.0.11 +logging@1.0.4 +meteor-platform@1.1.2 +meteor@1.1.2 +minifiers@1.1.1 +minimongo@1.0.4 +mobile-status-bar@1.0.1 +mongo-livedata@1.0.6 +mongo@1.0.7 mrt:underscore-string-latest@2.3.3 -observe-sequence@1.0.2 -ordered-dict@1.0.0 +observe-sequence@1.0.3 +ordered-dict@1.0.1 raix:handlebar-helpers@0.1.3 -random@1.0.0 -reactive-dict@1.0.3 -reactive-var@1.0.2 -reload@1.1.0 -retry@1.0.0 +random@1.0.1 +reactive-dict@1.0.4 +reactive-var@1.0.3 +reload@1.1.1 +retry@1.0.1 reywood:iron-router-ga@0.3.2 -routepolicy@1.0.1 -session@1.0.2 +routepolicy@1.0.2 +session@1.0.3 simison:bootstrap3-less@0.3.0 -spacebars-compiler@1.0.2 -spacebars@1.0.2 -standard-app-packages@1.0.2 -templating@1.0.7 -tracker@1.0.2 -ui@1.0.3 -underscore@1.0.0 -url@1.0.0 -webapp-hashing@1.0.0 -webapp@1.1.2 +spacebars-compiler@1.0.3 +spacebars@1.0.3 +standard-app-packages@1.0.3 +templating@1.0.8 +tracker@1.0.3 +ui@1.0.4 +underscore@1.0.1 +url@1.0.1 +webapp-hashing@1.0.1 +webapp@1.1.3 diff --git a/meteor/client/views/dashboard/components/modal-create-app.js b/meteor/client/views/dashboard/components/modal-create-app.js index 068acaa1bc..6fd4f6328c 100755 --- a/meteor/client/views/dashboard/components/modal-create-app.js +++ b/meteor/client/views/dashboard/components/modal-create-app.js @@ -3,7 +3,7 @@ var path = require('path'); Template.modal_create_app.helpers({ images: function () { - return Images.find({status: 'READY'}, {sort: {createdAt: -1}}); + return Images.find({status: 'READY', 'docker.Config.ExposedPorts': {$ne: null}}, {sort: {createdAt: -1}}); } }); From ca3ac6fd1cb684a9a577498dad73c38103eb3f5c Mon Sep 17 00:00:00 2001 From: Sean Li Date: Sun, 19 Oct 2014 15:34:33 -0700 Subject: [PATCH 18/20] Fixing up deprecation warning. --- meteor/client/lib/boot2docker.js | 2 +- meteor/client/lib/util.js | 2 +- .../views/dashboard/settings/dashboard-settings.js | 14 ++++++-------- .../client/views/dashboard/setup/setup-install.js | 14 ++++++++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/meteor/client/lib/boot2docker.js b/meteor/client/lib/boot2docker.js index 71f842296a..a98369e0fc 100644 --- a/meteor/client/lib/boot2docker.js +++ b/meteor/client/lib/boot2docker.js @@ -7,7 +7,7 @@ Boot2Docker = {}; Boot2Docker.REQUIRED_IP = '192.168.60.103'; Boot2Docker.command = function () { - return path.join(Util.getBinDir().replace(' ', '\\ '), 'boot2docker-1.2.0') + ' --vm="kitematic-vm"'; + return path.join(Util.getBinDir(), 'boot2docker-1.2.0') + ' --vm="kitematic-vm"'; }; Boot2Docker.exec = function (command, callback) { diff --git a/meteor/client/lib/util.js b/meteor/client/lib/util.js index f215ce5640..0f1da75816 100755 --- a/meteor/client/lib/util.js +++ b/meteor/client/lib/util.js @@ -11,7 +11,7 @@ Util = {}; Util.refreshDNS = function (app, callback) { // Use dig to refresh the DNS - exec('/usr/bin/dig +time=2 +tries=1 ' + app.name + '.kite @172.17.42.1', function (err, stdout, stderr) { + exec('/usr/bin/dig ' + app.name + '.kite @172.17.42.1', function (err, stdout, stderr) { console.log(err); console.log(stdout); console.log(stderr); diff --git a/meteor/client/views/dashboard/settings/dashboard-settings.js b/meteor/client/views/dashboard/settings/dashboard-settings.js index dc811bc175..beee5528e4 100644 --- a/meteor/client/views/dashboard/settings/dashboard-settings.js +++ b/meteor/client/views/dashboard/settings/dashboard-settings.js @@ -56,13 +56,11 @@ Template.dashboard_settings.events({ Template.dashboard_settings.helpers({ settings: function () { return Settings.findOne({}); + }, + memory: function () { + return Session.get('boot2dockerMemoryUsage'); + }, + disk: function () { + return Session.get('boot2dockerDiskUsage'); } }); - -Template.dashboard_settings.memory = function () { - return Session.get('boot2dockerMemoryUsage'); -}; - -Template.dashboard_settings.disk = function () { - return Session.get('boot2dockerDiskUsage'); -}; diff --git a/meteor/client/views/dashboard/setup/setup-install.js b/meteor/client/views/dashboard/setup/setup-install.js index 59ac37286c..3919a89425 100644 --- a/meteor/client/views/dashboard/setup/setup-install.js +++ b/meteor/client/views/dashboard/setup/setup-install.js @@ -1,9 +1,11 @@ -Template.setup_install.steps = function () { - return Installer.steps.map(function (step, index) { - step.index = index; - return step; - }); -}; +Template.setup_install.helpers({ + steps: function () { + return Installer.steps.map(function (step, index) { + step.index = index; + return step; + }); + } +}); Template.setup_install.helpers({ currentInstallStep: function () { From fe2641d9c819182c4de3d5a99096170fb11588bb Mon Sep 17 00:00:00 2001 From: Jeff Morgan Date: Sun, 19 Oct 2014 16:28:53 -0700 Subject: [PATCH 19/20] Fixing any breaks from Docker 1.3 --- meteor/client/lib/boot2docker.js | 18 +++++++++------ meteor/client/lib/docker.js | 13 +++++++++-- meteor/client/lib/installer.js | 9 ++++---- meteor/client/lib/virtualbox.js | 10 ++++----- meteor/client/main.js | 38 +++++++++++++++++--------------- package.json | 8 +++---- script/setup.sh | 4 ++-- 7 files changed, 57 insertions(+), 43 deletions(-) diff --git a/meteor/client/lib/boot2docker.js b/meteor/client/lib/boot2docker.js index 71f842296a..d8618f30fe 100644 --- a/meteor/client/lib/boot2docker.js +++ b/meteor/client/lib/boot2docker.js @@ -7,7 +7,7 @@ Boot2Docker = {}; Boot2Docker.REQUIRED_IP = '192.168.60.103'; Boot2Docker.command = function () { - return path.join(Util.getBinDir().replace(' ', '\\ '), 'boot2docker-1.2.0') + ' --vm="kitematic-vm"'; + return path.join(Util.getBinDir().replace(' ', '\\ '), 'boot2docker-1.3.0') + ' --vm="kitematic-vm"'; }; Boot2Docker.exec = function (command, callback) { @@ -60,8 +60,12 @@ Boot2Docker.ip = function (callback) { }; Boot2Docker.setIp = function (ifname, ip, callback) { - this.exec('ssh "sudo ifconfig ' + ifname + ' ' + ip + ' netmask 255.255.255.0"', function (err, stdout) { - callback(err); + Boot2Docker.exec('ssh "sudo ifconfig ' + ifname + ' ' + ip + ' netmask 255.255.255.0"', function (err, stdout) { + Boot2Docker.exec('ssh "sudo awk \'{print $0 \",192.168.60.103\"}\' /var/lib/boot2docker/tls/hostnames > temp && sudo mv temp /var/lib/boot2docker/tls/hostnames && sudo chown root.root /var/lib/boot2docker/tls', function (err, stdout) { + Boot2Docker.exec('ssh "sudo /usr/local/etc/init.d/docker restart"', function (err, stdout) { + callback(err); + }); + }); }); }; @@ -78,10 +82,10 @@ Boot2Docker.start = function (callback) { callback('Cannot start if the boot2docker VM doesn\'t exist'); return; } - self.exec('up -v', function (err, stdout) { + self.exec('start', function (err, stdout) { // Sometimes boot2docker returns an error code even though it's working / waiting, so treat that as // Success as well - if (!err || (err.indexOf('Waiting for VM to be started') !== -1 || err.indexOf('..........') !== -1)) { + if (!err || (err.indexOf('Waiting') !== -1 || err.indexOf('Writing') !== -1)) { self.correct(function (err) { if (err) { callback(err); return; } self.injectUtilities(function (err) { @@ -96,7 +100,7 @@ Boot2Docker.start = function (callback) { }; Boot2Docker.correct = function (callback) { - Boot2Docker.setIp('eth2', Boot2Docker.REQUIRED_IP, function(err) { + Boot2Docker.setIp('eth1', Boot2Docker.REQUIRED_IP, function(err) { if (err) { callback(err); return; } VirtualBox.removeDHCP(function (err) { callback(); @@ -239,7 +243,7 @@ Boot2Docker.version = function (callback) { }; Boot2Docker.injectUtilities = function (callback) { - exec('/bin/cat ' + path.join(Util.getBinDir(), 'kite-binaries.tar.gz') + ' | ' + Boot2Docker.command() + ' ssh "tar zx -C /usr/local/bin"', function (err, stdout) { + exec('/bin/cat ' + path.join(Util.getBinDir(), 'kite-binaries.tar.gz') + ' | ' + Boot2Docker.command() + ' ssh "sudo tar zx -C /usr/local/bin && sudo chown -R root.root /usr/local/bin"', function (err, stdout) { callback(err); }); }; diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index 2bd3b447f4..a498b2e518 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -2,15 +2,24 @@ var Dockerode = require('dockerode'); var async = require('async'); var exec = require('exec'); var path = require('path'); +var fs = require('fs'); Docker = {}; -Docker.DOCKER_HOST = '192.168.60.103'; Docker.DEFAULT_IMAGES_FILENAME = 'base-images-0.0.2.tar.gz'; Docker.DEFAULT_IMAGES_CHECKSUM = 'a3517ac21034a1969d9ff15e3c41b1e2f1aa83c67b16a8bd0bc378ffefaf573b'; // Sha256 Checksum +Docker.CERT_DIR = path.join(process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'], '.boot2docker/certs/kitematic-vm'); +Docker.HOST_IP = '192.168.60.103'; +Docker.HOST_PORT = '2376'; Docker.client = function () { - return new Dockerode({host: Docker.DOCKER_HOST, port: '2375'}); + return new Dockerode({ + host: Docker.HOST_IP, + port: Docker.HOST_PORT, + ca: fs.readFileSync(path.join(Docker.CERT_DIR, 'ca.pem')), + cert: fs.readFileSync(path.join(Docker.CERT_DIR, 'cert.pem')), + key: fs.readFileSync(path.join(Docker.CERT_DIR, 'key.pem')) + }); }; var docker = Docker.client(); diff --git a/meteor/client/lib/installer.js b/meteor/client/lib/installer.js index e5f4041502..5fae2d2c05 100644 --- a/meteor/client/lib/installer.js +++ b/meteor/client/lib/installer.js @@ -38,7 +38,6 @@ Installer.steps = [ progressCallback(progress); }); } else { - // Version 4.3.12 is required. VirtualBox.version(function (err, installedVersion) { if (err) {callback(err); return;} if (Util.compareVersions(installedVersion, VirtualBox.REQUIRED_VERSION) < 0) { @@ -65,7 +64,7 @@ Installer.steps = [ }); } }, - pastMessage: 'VirtualBox installed', + pastMessage: 'VirtualBox Installed', message: 'Downloading & Installing VirtualBox', futureMessage: 'Download & Install VirtualBox if necessary' }, @@ -76,7 +75,7 @@ Installer.steps = [ Boot2Docker.exists(function (err, exists) { if (err) { callback(err); return; } if (!exists) { - var vmFilesPath = path.join(Util.getHomePath(), 'VirtualBox VMs', 'kitematic-vm'); + var vmFilesPath = path.join(Util.getHomePath(), 'VirtualBox\ VMs', 'kitematic-vm'); if (fs.existsSync(vmFilesPath)) { Util.deleteFolder(vmFilesPath); } @@ -92,7 +91,7 @@ Installer.steps = [ callback(err); }); }); - } + } } }); }, @@ -123,7 +122,7 @@ Installer.steps = [ callback(err); }); } else { - Boot2Docker.setIp('eth2', Boot2Docker.REQUIRED_IP, function(err) { + Boot2Docker.setIp('eth1', Boot2Docker.REQUIRED_IP, function(err) { callback(err); }); } diff --git a/meteor/client/lib/virtualbox.js b/meteor/client/lib/virtualbox.js index 85bae6dae9..6c0b6a1c30 100644 --- a/meteor/client/lib/virtualbox.js +++ b/meteor/client/lib/virtualbox.js @@ -4,10 +4,10 @@ var path = require('path'); VirtualBox = {}; -VirtualBox.REQUIRED_VERSION = '4.3.14'; -VirtualBox.INCLUDED_VERSION = '4.3.14'; -VirtualBox.INSTALLER_FILENAME = 'virtualbox-4.3.14.pkg'; -VirtualBox.INSTALLER_CHECKSUM = '486348a5336539728ca20dcd9674cf3d37e5c7f32255d90f1edc7391b54bd5dd'; // Sha256 Checksum +VirtualBox.REQUIRED_VERSION = '4.3.18'; +VirtualBox.INCLUDED_VERSION = '4.3.18'; +VirtualBox.INSTALLER_FILENAME = 'virtualbox-4.3.18.pkg'; +VirtualBox.INSTALLER_CHECKSUM = '5836c94481c460c648b9216386591a2915293ac86b9bb6c57746637796af6af2'; // Sha256 Checksum // Info for the hostonly interface we add to the VM. VirtualBox.HOSTONLY_HOSTIP = '192.168.60.3'; @@ -129,7 +129,7 @@ VirtualBox.addCustomHostAdapter = function (vm, callback) { var self = this; self.hostOnlyAdapter(function (err, ifname) { if (err) { callback(err); return; } - self.exec('modifyvm ' + vm + ' --nic3 hostonly --nictype3 virtio --cableconnected3 on --hostonlyadapter3 ' + ifname, function (err, stdout, stderr) { + self.exec('modifyvm ' + vm + ' --nic2 hostonly --nictype2 virtio --cableconnected2 on --hostonlyadapter2 ' + ifname, function (err, stdout, stderr) { callback(err, ifname); }); }); diff --git a/meteor/client/main.js b/meteor/client/main.js index 33b0a1c216..82206ca081 100755 --- a/meteor/client/main.js +++ b/meteor/client/main.js @@ -124,24 +124,26 @@ var fixDefaultContainers = function (callback) { }; Meteor.setInterval(function () { - Boot2Docker.exists(function (err, exists) { - if (err) { console.log(err); return; } - if (exists) { - Boot2Docker.state(function (err, state) { - if (err) { console.log(err); return; } - Session.set('boot2dockerState', state); - if (state === 'running') { - Boot2Docker.stats(function (err, stats) { - if (err) { console.log(err); return; } - if (stats.state !== 'poweroff' && stats.memory && stats.disk) { - Session.set('boot2dockerMemoryUsage', stats.memory); - Session.set('boot2dockerDiskUsage', stats.disk); - } - }); - } - }); - } - }); + if (!Session.get('installing')) { + Boot2Docker.exists(function (err, exists) { + if (err) { console.log(err); return; } + if (exists) { + Boot2Docker.state(function (err, state) { + if (err) { console.log(err); return; } + Session.set('boot2dockerState', state); + if (state === 'running') { + Boot2Docker.stats(function (err, stats) { + if (err) { console.log(err); return; } + if (stats.state !== 'poweroff' && stats.memory && stats.disk) { + Session.set('boot2dockerMemoryUsage', stats.memory); + Session.set('boot2dockerDiskUsage', stats.disk); + } + }); + } + }); + } + }); + } }, 5000); Meteor.setInterval(function () { diff --git a/package.json b/package.json index 38edfc153f..a9bb0c9d79 100644 --- a/package.json +++ b/package.json @@ -3,16 +3,16 @@ "main": "index.js", "version": "0.2.3", "dependencies": { + "ansi-to-html": "0.2.0", "async": "^0.9.0", "chokidar": "git+https://github.com/usekite/chokidar.git", + "dockerode": "2.0.3", "exec": "^0.1.2", "moment": "2.8.1", + "ncp": "0.6.0", "open": "0.0.5", - "dockerode": "2.0.3", - "tar": "0.1.20", - "ansi-to-html": "0.2.0", "request": "2.42.0", "request-progress": "0.3.1", - "ncp": "0.6.0" + "tar": "0.1.20" } } diff --git a/script/setup.sh b/script/setup.sh index 6808d9023e..6599e4d6d1 100755 --- a/script/setup.sh +++ b/script/setup.sh @@ -11,7 +11,7 @@ mkdir -p cache pushd cache -BOOT2DOCKER_CLI_VERSION=1.2.0 +BOOT2DOCKER_CLI_VERSION=1.3.0 BOOT2DOCKER_CLI_VERSION_FILE=boot2docker-$BOOT2DOCKER_CLI_VERSION BOOT2DOCKER_CLI_FILE=boot2docker @@ -54,7 +54,7 @@ pushd resources if [ ! -f $BOOT2DOCKER_CLI_VERSION_FILE ]; then cecho "-----> Downloading Boot2docker CLI..." $purple - curl -L -o $BOOT2DOCKER_CLI_VERSION_FILE https://s3.amazonaws.com/kite-installer/boot2docker-v$BOOT2DOCKER_CLI_VERSION + curl -L -o $BOOT2DOCKER_CLI_VERSION_FILE https://github.com/boot2docker/boot2docker-cli/releases/download/v${BOOT2DOCKER_CLI_VERSION}/boot2docker-v${BOOT2DOCKER_CLI_VERSION}-darwin-amd64 fi chmod +x $BOOT2DOCKER_CLI_VERSION_FILE From c5b54f7dbb5fdb6b39e0db3a7c550166398f50b1 Mon Sep 17 00:00:00 2001 From: Jeff Morgan Date: Sun, 19 Oct 2014 19:37:37 -0700 Subject: [PATCH 20/20] Moved additional eth2 network to instead replace eth1, bumped Boot2Docker dependency to 1.3 --- meteor/client/lib/boot2docker.js | 12 ++++-------- meteor/client/lib/docker.js | 2 ++ meteor/client/lib/installer.js | 8 +++++++- meteor/client/main.js | 18 +----------------- 4 files changed, 14 insertions(+), 26 deletions(-) diff --git a/meteor/client/lib/boot2docker.js b/meteor/client/lib/boot2docker.js index 67a42f0dab..19966da9b5 100644 --- a/meteor/client/lib/boot2docker.js +++ b/meteor/client/lib/boot2docker.js @@ -61,10 +61,8 @@ Boot2Docker.ip = function (callback) { Boot2Docker.setIp = function (ifname, ip, callback) { Boot2Docker.exec('ssh "sudo ifconfig ' + ifname + ' ' + ip + ' netmask 255.255.255.0"', function (err, stdout) { - Boot2Docker.exec('ssh "sudo awk \'{print $0 \",192.168.60.103\"}\' /var/lib/boot2docker/tls/hostnames > temp && sudo mv temp /var/lib/boot2docker/tls/hostnames && sudo chown root.root /var/lib/boot2docker/tls', function (err, stdout) { - Boot2Docker.exec('ssh "sudo /usr/local/etc/init.d/docker restart"', function (err, stdout) { - callback(err); - }); + Boot2Docker.exec('ssh "sudo rm -rf /var/lib/boot2docker/tls/* && sudo /etc/init.d/docker restart"', function (err, stdout) { + callback(err); }); }); }; @@ -83,11 +81,9 @@ Boot2Docker.start = function (callback) { return; } self.exec('start', function (err, stdout) { - // Sometimes boot2docker returns an error code even though it's working / waiting, so treat that as - // Success as well - if (!err || (err.indexOf('Waiting') !== -1 || err.indexOf('Writing') !== -1)) { + // Sometimes boot2docker returns an error code even though it's working / waiting, so treat that as success as well + if (!err || (err.indexOf('Waiting') !== -1 || err.indexOf('Writing') !== -1 || err.indexOf('Generating a server cert') !== -1)) { self.correct(function (err) { - if (err) { callback(err); return; } self.injectUtilities(function (err) { callback(err); }); diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index 44945c296e..dcc2133b25 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -14,6 +14,7 @@ Docker.HOST_PORT = '2376'; Docker.client = function () { return new Dockerode({ + protocol: 'https', host: Docker.HOST_IP, port: Docker.HOST_PORT, ca: fs.readFileSync(path.join(Docker.CERT_DIR, 'ca.pem')), @@ -353,6 +354,7 @@ Docker.reloadDefaultContainers = function (callback) { async.until(function () { return ready; }, function (callback) { + docker = Docker.client(); docker.listContainers(function (err) { if (!err) { ready = true; diff --git a/meteor/client/lib/installer.js b/meteor/client/lib/installer.js index 5fae2d2c05..3bff06d94a 100644 --- a/meteor/client/lib/installer.js +++ b/meteor/client/lib/installer.js @@ -119,7 +119,13 @@ Installer.steps = [ if (state !== 'running') { console.log('starting'); Boot2Docker.start(function (err) { - callback(err); + if (err) { + callback(err); + return; + } + Boot2Docker.setIp('eth1', Boot2Docker.REQUIRED_IP, function(err) { + callback(err); + }); }); } else { Boot2Docker.setIp('eth1', Boot2Docker.REQUIRED_IP, function(err) { diff --git a/meteor/client/main.js b/meteor/client/main.js index 09ffc5483b..4f04f15b31 100755 --- a/meteor/client/main.js +++ b/meteor/client/main.js @@ -157,24 +157,8 @@ Meteor.setInterval(function () { Meteor.setInterval(function () { if (!Session.get('installing')) { Sync.resolveWatchers(function () {}); - if (!Session.get('boot2dockerOff')) { - fixBoot2DockerVM(function (err) { - if (err) { console.log(err); return; } - AppUtil.recover(); - fixDefaultImages(function (err) { - if (err) { console.log(err); return; } - fixDefaultContainers(function (err) { - if (err) { console.log(err); } - }); - }); - }); - } - } -}, 5000); - -Meteor.setInterval(function () { - if (!Session.get('installing')) { ImageUtil.sync(); AppUtil.sync(); + AppUtil.recover(); } }, 5000);