From f69ddb1251d0e1233be449f9b3ace05dbcd268c7 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Tue, 30 Sep 2014 13:12:16 -0700 Subject: [PATCH] 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}}