summaryrefslogtreecommitdiff
path: root/ambari-web
diff options
context:
space:
mode:
authorYusaku Sako <yusaku@apache.org>2012-12-09 13:32:45 +0000
committerYusaku Sako <yusaku@apache.org>2012-12-09 13:32:45 +0000
commit6e0b836d9eba9502454f0f3cb6271c236cd6cf3e (patch)
treecb34ed128208839d5f75860d53129027b85c348c /ambari-web
parent465917e291b5a4133741bd6b1db9aa12a3af06a0 (diff)
AMBARI-1059. Refactor cluster management. (yusaku)
git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/branches/AMBARI-666@1418944 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'ambari-web')
-rw-r--r--ambari-web/app/assets/data/wizard/bootstrap/bootstrap.json5
-rw-r--r--ambari-web/app/assets/data/wizard/bootstrap/poll_1.json16
-rw-r--r--ambari-web/app/assets/data/wizard/bootstrap/poll_2.json16
-rw-r--r--ambari-web/app/controllers/wizard/step2_controller.js10
-rw-r--r--ambari-web/app/controllers/wizard/step3_controller.js80
-rw-r--r--ambari-web/app/initialize.js1
-rw-r--r--ambari-web/app/messages.js3
-rw-r--r--ambari-web/app/models/hosts.js44
-rw-r--r--ambari-web/app/styles/application.less3
-rw-r--r--ambari-web/app/templates/wizard/step3.hbs16
-rw-r--r--ambari-web/app/templates/wizard/step3_host_log_popup.hbs (renamed from ambari-web/app/templates/wizard/step3HostLogPopup.hbs)7
-rw-r--r--ambari-web/app/views/wizard/step3_view.js2
12 files changed, 160 insertions, 43 deletions
diff --git a/ambari-web/app/assets/data/wizard/bootstrap/bootstrap.json b/ambari-web/app/assets/data/wizard/bootstrap/bootstrap.json
new file mode 100644
index 0000000000..2703955e49
--- /dev/null
+++ b/ambari-web/app/assets/data/wizard/bootstrap/bootstrap.json
@@ -0,0 +1,5 @@
+{
+ "status": "OK",
+ "log": "Running Bootstrap now",
+ "requestId": "1"
+} \ No newline at end of file
diff --git a/ambari-web/app/assets/data/wizard/bootstrap/poll_1.json b/ambari-web/app/assets/data/wizard/bootstrap/poll_1.json
new file mode 100644
index 0000000000..ac9bbbbf84
--- /dev/null
+++ b/ambari-web/app/assets/data/wizard/bootstrap/poll_1.json
@@ -0,0 +1,16 @@
+{
+ "status": "RUNNING",
+ "hostsStatus": [
+ {
+ "status": "RUNNING",
+ "hostName": "dev001",
+ "log": "STDOUT\n\nSTDERR\nWarning: Permanently added 'dev001,10.0.2.15' (RSA) to the list of known hosts.\n"
+ },
+ {
+ "status": "RUNNING",
+ "hostName": "dev002",
+ "log": "STDOUT\n\nSTDERR\nWarning: Permanently added 'dev002,10.0.2.16' (RSA) to the list of known hosts.\n"
+ }
+ ],
+ "log": ""
+}
diff --git a/ambari-web/app/assets/data/wizard/bootstrap/poll_2.json b/ambari-web/app/assets/data/wizard/bootstrap/poll_2.json
new file mode 100644
index 0000000000..7208d5670d
--- /dev/null
+++ b/ambari-web/app/assets/data/wizard/bootstrap/poll_2.json
@@ -0,0 +1,16 @@
+{
+ "status": "SUCCESS",
+ "hostsStatus": [
+ {
+ "status": "FAILED",
+ "hostName": "dev001",
+ "log": "STDOUT\n\nSTDERR\nWarning: Permanently added 'dev001,10.0.2.15' (RSA) to the list of known hosts.\r\n/etc/yum.repos.d/ambari.repo: No such file or directory\nSTDOUT\n\nSTDERR\nPermission denied, please try again.\r\nConnection closed by UNKNOWN\r\nlost connection\nSTDOUT\n\nSTDERR\npython: can't open file '/tmp/setupAgent.py': [Errno 2] No such file or directory\n"
+ },
+ {
+ "status": "DONE",
+ "hostName": "dev002",
+ "log": "STDOUT\n\nSTDERR\nWarning: Permanently added 'dev002,10.0.2.16' (RSA) to the list of known hosts.\r\n/etc/yum.repos.d/ambari.repo: No such file or directory\nSTDOUT\n\nSTDERR\nPermission denied, please try again.\r\nConnection closed by UNKNOWN\r\nlost connection\nSTDOUT\n\nSTDERR\npython: can't open file '/tmp/setupAgent.py': [Errno 2] No such file or directory\n"
+ }
+ ],
+ "log": "\n\nINFO:root:BootStrapping hosts ['dev001','dev002'] using /root/dev/ambari/ambari-server/src/main/python with sshKey File /tmp/bootstrap/1/sshKey using tmp dir /tmp/bootstrap/1 ambari: localhost\nINFO:root:Running scp command scp -o ConnectTimeout=3 -o StrictHostKeyChecking=no -i /tmp/bootstrap/1/sshKey /etc/yum.repos.d/ambari.repo root@dev001:/etc/yum.repos.d\nINFO:root:scp /etc/yum.repos.d/ambari.repo done for host dev001, exitcode=1\nINFO:root:Parallel scp returns for repo file\nINFO:root:Running scp command scp -o ConnectTimeout=3 -o StrictHostKeyChecking=no -i /tmp/bootstrap/1/sshKey /root/dev/ambari/ambari-server/src/main/python/setupAgent.py root@dev001:/tmp\nINFO:root:scp /root/dev/ambari/ambari-server/src/main/python/setupAgent.py done for host dev001, exitcode=1\nINFO:root:Parallel scp returns for agent script\nINFO:root:Running setup agent...\nINFO:root:Running ssh command ssh -o ConnectTimeOut=3 -o StrictHostKeyChecking=no -i /tmp/bootstrap/1/sshKey root@dev001 python /tmp/setupAgent.py tmp localhost\nINFO:root:Setup agent done for host dev001, exitcode=2\nINFO:root:Parallel ssh returns for setup agent\n"
+} \ No newline at end of file
diff --git a/ambari-web/app/controllers/wizard/step2_controller.js b/ambari-web/app/controllers/wizard/step2_controller.js
index b849ffefa0..9e83a58394 100644
--- a/ambari-web/app/controllers/wizard/step2_controller.js
+++ b/ambari-web/app/controllers/wizard/step2_controller.js
@@ -140,15 +140,17 @@ App.WizardStep2Controller = Em.Controller.extend({
var bootStrapData = JSON.stringify({'verbose': true, 'sshKey': this.get('sshKey'), hosts: this.get('hostNameArr')});
- // TODO: skipping bootstrap for now
- if (true) {
+ if (App.skipBootstrap) {
App.router.send('next');
return true;
}
+ var method = App.testMode ? 'GET' : 'POST';
+ var url = App.testMode ? '/data/wizard/bootstrap/bootstrap.json' : '/api/bootstrap';
+
$.ajax({
- type: 'POST',
- url: '/api/bootstrap',
+ type: method,
+ url: url,
data: bootStrapData,
timeout: 10000,
contentType: 'application/json',
diff --git a/ambari-web/app/controllers/wizard/step3_controller.js b/ambari-web/app/controllers/wizard/step3_controller.js
index 89f65f22d5..d43c16d4b9 100644
--- a/ambari-web/app/controllers/wizard/step3_controller.js
+++ b/ambari-web/app/controllers/wizard/step3_controller.js
@@ -42,8 +42,16 @@ App.WizardStep3Controller = Em.Controller.extend({
navigateStep: function () {
this.loadStep();
- if (App.db.getBootStatus() === false) {
- this.startBootstrap();
+ if (App.db.getInstallType().installType !== 'manual') {
+ if (App.db.getBootStatus() === false) {
+ this.startBootstrap();
+ }
+ } else {
+ // TODO: assume manually bootstrapped hosts are all successful for now
+ this.get('hosts').forEach(function (_host) {
+ _host.set('bootStatus', 'DONE');
+ _host.set('bootLog', 'Success');
+ });
}
},
@@ -55,7 +63,7 @@ App.WizardStep3Controller = Em.Controller.extend({
console.log("TRACE: Loading step3: Confirm Hosts");
this.clearStep();
var hosts = this.loadHosts();
- // hosts.setEach('bootStatus', 'pending');
+ // hosts.setEach('bootStatus', 'RUNNING');
this.renderHosts(hosts);
},
@@ -88,30 +96,27 @@ App.WizardStep3Controller = Em.Controller.extend({
},
/**
- * Parses and updates the content, and governs the possibility
- * of the next doBootstrap (polling) call.
- * Returns true if polling should stop (no hosts are in "pending" state); false otherwise
+ * Parses and updates the content based on bootstrap API response.
+ * Returns true if polling should continue (some hosts are in "RUNNING" state); false otherwise
*/
- parseHostInfo: function (hostsFromServer, hostsFromContent) {
- var result = true; // default value as true implies
- hostsFromServer.forEach(function (_hostFromServer) {
- var host = hostsFromContent.findProperty('name', _hostFromServer.name);
+ parseHostInfo: function (hostsStatusFromServer) {
+ hostsStatusFromServer.forEach(function (_hostStatus) {
+ var host = this.get('bootHosts').findProperty('name', _hostStatus.hostName);
if (host !== null && host !== undefined) { // check if hostname extracted from REST API data matches any hostname in content
- host.set('bootStatus', _hostFromServer.status);
- host.set('cpu', _hostFromServer.cpu);
- host.set('memory', _hostFromServer.memory);
+ host.set('bootStatus', _hostStatus.status);
+ host.set('bootLog', _hostStatus.log);
}
- });
- // if the data rendered by REST API has no hosts or no hosts are in "pending" state, polling will stop
- return this.hosts.length == 0 || !this.hosts.someProperty('bootStatus', 'pending');
+ }, this);
+ // if the data rendered by REST API has hosts in "RUNNING" state, polling will continue
+ return this.get('bootHosts').length != 0 && this.get('bootHosts').someProperty('bootStatus', 'RUNNING');
},
/* Returns the current set of visible hosts on view (All, Succeeded, Failed) */
visibleHosts: function () {
if (this.get('category') === 'Success') {
- return (this.hosts.filterProperty('bootStatus', 'success'));
+ return (this.hosts.filterProperty('bootStatus', 'DONE'));
} else if (this.get('category') === 'Error') {
- return (this.hosts.filterProperty('bootStatus', 'error'));
+ return (this.hosts.filterProperty('bootStatus', 'FAILED'));
} else { // if (this.get('category') === 'All Hosts')
return this.hosts;
}
@@ -179,27 +184,42 @@ App.WizardStep3Controller = Em.Controller.extend({
}
},
+ numPolls: 0,
+
startBootstrap: function () {
//this.set('isSubmitDisabled', true); //TODO: uncomment after actual hookup
+ this.numPolls = 0;
this.set('bootHosts', this.get('hosts'));
this.doBootstrap();
},
doBootstrap: function () {
+ this.numPolls++;
var self = this;
- var url = '/api/bootstrap';
+ var url = App.testMode ? '/data/wizard/bootstrap/poll_' + this.numPolls + '.json' : '/api/bootstrap/1';
$.ajax({
type: 'GET',
url: url,
timeout: 5000,
success: function (data) {
- console.log("TRACE: In success function for the GET bootstrap call");
- var result = self.parseHostInfo(data, this.get('bootHosts'));
- window.setTimeout(self.doBootstrap, 3000);
+ if (data.hostsStatus !== null) {
+ // in case of bootstrapping just one server, the server returns an object rather than an array...
+ if (!(data.hostsStatus instanceof Array)) {
+ data.hostsStatus = [ data.hostsStatus ];
+ }
+ console.log("TRACE: In success function for the GET bootstrap call");
+ var result = self.parseHostInfo(data.hostsStatus);
+ if (result) {
+ window.setTimeout(function () { self.doBootstrap() }, 3000);
+ return;
+ }
+ }
+ console.log('Bootstrap failed');
+ self.stopBootstrap();
},
error: function () {
- console.log("ERROR");
+ console.log('Bootstrap failed');
self.stopBootstrap();
},
@@ -210,6 +230,7 @@ App.WizardStep3Controller = Em.Controller.extend({
stopBootstrap: function () {
//TODO: uncomment following line after the hook up with the API call
+ console.log('stopBootstrap() called');
// this.set('isSubmitDisabled',false);
},
@@ -220,14 +241,21 @@ App.WizardStep3Controller = Em.Controller.extend({
}
},
- hostLogPopup: function (event) {
+ hostLogPopup: function (event, context) {
+ var host = event.context;
+
App.ModalPopup.show({
- header: Em.I18n.t('installer.step3.hostLog.popup.header'),
+
+ header: Em.I18n.t('installer.step3.hostLog.popup.header').format(host.get('name')),
+ secondary: null,
+
onPrimary: function () {
this.hide();
},
+
bodyClass: Ember.View.extend({
- templateName: require('templates/wizard/step3HostLogPopup')
+ templateName: require('templates/wizard/step3_host_log_popup'),
+ host: host
})
});
},
diff --git a/ambari-web/app/initialize.js b/ambari-web/app/initialize.js
index c0f787c990..6882e8eff1 100644
--- a/ambari-web/app/initialize.js
+++ b/ambari-web/app/initialize.js
@@ -20,6 +20,7 @@
window.App = require('app');
App.testMode = false;
+App.skipBootstrap = false;
require('messages');
require('utils/data_table');
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index f6e378fec9..c5230c5ede 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -88,8 +88,7 @@ Em.I18n.translations = {
'installer.step3.header':'Confirm Hosts',
'installer.step3.body':'Here are the results of the host discovery process.<br>' +
'Please verify and remove the ones that you do not want to be part of the cluster.',
- 'installer.step3.hostLog.popup.header':'Log file for the host',
- 'installer.step3.hostLog.popup.body':'Placeholder for the log file',
+ 'installer.step3.hostLog.popup.header':'Bootstrap log for {0}',
'installer.step3.hosts.remove.popup.header':'Remove Hosts',
'installer.step3.hosts.remove.popup.body':'Are you sure you want to remove the selected host(s)?',
'installer.step3.hosts.retry.popup.header':'Retry Host Discovery',
diff --git a/ambari-web/app/models/hosts.js b/ambari-web/app/models/hosts.js
index da2abf342d..9a493d96a3 100644
--- a/ambari-web/app/models/hosts.js
+++ b/ambari-web/app/models/hosts.js
@@ -21,12 +21,50 @@ var App = require('app');
App.HostInfo = Ember.Object.extend({
elementId: 'host',
name: '',
- bootStatus: 'pending',
cpu: '2',
memory: '2',
message: 'Information',
barColor: 'progress-info',
isChecked: true,
- horizonData:
- [{"cpu":"61","date":"2012-09-05T11:03:00+03:00","id":"0","memory":"44","name":"Node-0.0","network":"36","status":"LIVE","rackName":"Rack-0","io":"23"},{"cpu":"1","date":"2012-09-05T11:06:00+03:00","id":"0","memory":"46","name":"Node-0.0","network":"54","status":"LIVE","rackName":"Rack-0","io":"96"},{"cpu":"36","date":"2012-09-05T11:09:00+03:00","id":"0","memory":"65","name":"Node-0.0","network":"42","status":"LIVE","rackName":"Rack-0","io":"49"},{"cpu":"50","date":"2012-09-05T11:12:00+03:00","id":"0","memory":"46","name":"Node-0.0","network":"76","status":"LIVE","rackName":"Rack-0","io":"67"},{"cpu":"79","date":"2012-09-05T11:15:00+03:00","id":"0","memory":"91","name":"Node-0.0","network":"14","status":"LIVE","rackName":"Rack-0","io":"47"},{"cpu":"65","date":"2012-09-05T11:18:00+03:00","id":"0","memory":"44","name":"Node-0.0","network":"90","status":"LIVE","rackName":"Rack-0","io":"74"},{"cpu":"42","date":"2012-09-05T11:21:00+03:00","id":"0","memory":"96","name":"Node-0.0","network":"29","status":"LIVE","rackName":"Rack-0","io":"6"},{"cpu":"76","date":"2012-09-05T11:24:00+03:00","id":"0","memory":"28","name":"Node-0.0","network":"52","status":"LIVE","rackName":"Rack-0","io":"1"},{"cpu":"24","date":"2012-09-05T11:27:00+03:00","id":"0","memory":"66","name":"Node-0.0","network":"75","status":"LIVE","rackName":"Rack-0","io":"31"},{"cpu":"71","date":"2012-09-05T11:30:00+03:00","id":"0","memory":"8","name":"Node-0.0","network":"1","status":"LIVE","rackName":"Rack-0","io":"36"},{"cpu":"3","date":"2012-09-05T11:33:00+03:00","id":"0","memory":"57","name":"Node-0.0","network":"12","status":"LIVE","rackName":"Rack-0","io":"71"},{"cpu":"85","date":"2012-09-05T11:36:00+03:00","id":"0","memory":"44","name":"Node-0.0","network":"76","status":"LIVE","rackName":"Rack-0","io":"54"},{"cpu":"49","date":"2012-09-05T11:39:00+03:00","id":"0","memory":"8","name":"Node-0.0","network":"28","status":"LIVE","rackName":"Rack-0","io":"60"},{"cpu":"46","date":"2012-09-05T11:42:00+03:00","id":"0","memory":"75","name":"Node-0.0","network":"7","status":"LIVE","rackName":"Rack-0","io":"86"},{"cpu":"61","date":"2012-09-05T11:45:00+03:00","id":"0","memory":"11","name":"Node-0.0","network":"65","status":"LIVE","rackName":"Rack-0","io":"65"},{"cpu":"5","date":"2012-09-05T11:48:00+03:00","id":"0","memory":"24","name":"Node-0.0","network":"14","status":"LIVE","rackName":"Rack-0","io":"62"},{"cpu":"30","date":"2012-09-05T11:51:00+03:00","id":"0","memory":"40","name":"Node-0.0","network":"52","status":"LIVE","rackName":"Rack-0","io":"98"},{"cpu":"5","date":"2012-09-05T11:54:00+03:00","id":"0","memory":"38","name":"Node-0.0","network":"17","status":"LIVE","rackName":"Rack-0","io":"27"},{"cpu":"22","date":"2012-09-05T11:57:00+03:00","id":"0","memory":"80","name":"Node-0.0","network":"62","status":"LIVE","rackName":"Rack-0","io":"38"}]
+
+ bootLog: null,
+
+ bootStatus: 'RUNNING',
+
+ bootStatusForDisplay: function() {
+ switch (this.get('bootStatus')) {
+ case 'DONE':
+ return 'Success';
+ case 'FAILED':
+ return 'Failed';
+ case 'RUNNING':
+ return 'Running';
+ }
+ }.property('bootStatus'),
+
+ bootBarColor: function() {
+ switch (this.get('bootStatus')) {
+ case 'DONE':
+ return 'progress-success';
+ case 'FAILED':
+ return 'progress-danger';
+ case 'RUNNING':
+ default:
+ return 'progress-info';
+ }
+ }.property('bootStatus'),
+
+ isBootDone: function() {
+ switch (this.get('bootStatus')) {
+ case 'DONE':
+ case 'FAILED':
+ return true;
+ case 'RUNNING':
+ default:
+ return false;
+ }
+
+ }.property('bootStatus')
+ /* horizonData:
+ [{"cpu":"61","date":"2012-09-05T11:03:00+03:00","id":"0","memory":"44","name":"Node-0.0","network":"36","status":"LIVE","rackName":"Rack-0","io":"23"},{"cpu":"1","date":"2012-09-05T11:06:00+03:00","id":"0","memory":"46","name":"Node-0.0","network":"54","status":"LIVE","rackName":"Rack-0","io":"96"},{"cpu":"36","date":"2012-09-05T11:09:00+03:00","id":"0","memory":"65","name":"Node-0.0","network":"42","status":"LIVE","rackName":"Rack-0","io":"49"},{"cpu":"50","date":"2012-09-05T11:12:00+03:00","id":"0","memory":"46","name":"Node-0.0","network":"76","status":"LIVE","rackName":"Rack-0","io":"67"},{"cpu":"79","date":"2012-09-05T11:15:00+03:00","id":"0","memory":"91","name":"Node-0.0","network":"14","status":"LIVE","rackName":"Rack-0","io":"47"},{"cpu":"65","date":"2012-09-05T11:18:00+03:00","id":"0","memory":"44","name":"Node-0.0","network":"90","status":"LIVE","rackName":"Rack-0","io":"74"},{"cpu":"42","date":"2012-09-05T11:21:00+03:00","id":"0","memory":"96","name":"Node-0.0","network":"29","status":"LIVE","rackName":"Rack-0","io":"6"},{"cpu":"76","date":"2012-09-05T11:24:00+03:00","id":"0","memory":"28","name":"Node-0.0","network":"52","status":"LIVE","rackName":"Rack-0","io":"1"},{"cpu":"24","date":"2012-09-05T11:27:00+03:00","id":"0","memory":"66","name":"Node-0.0","network":"75","status":"LIVE","rackName":"Rack-0","io":"31"},{"cpu":"71","date":"2012-09-05T11:30:00+03:00","id":"0","memory":"8","name":"Node-0.0","network":"1","status":"LIVE","rackName":"Rack-0","io":"36"},{"cpu":"3","date":"2012-09-05T11:33:00+03:00","id":"0","memory":"57","name":"Node-0.0","network":"12","status":"LIVE","rackName":"Rack-0","io":"71"},{"cpu":"85","date":"2012-09-05T11:36:00+03:00","id":"0","memory":"44","name":"Node-0.0","network":"76","status":"LIVE","rackName":"Rack-0","io":"54"},{"cpu":"49","date":"2012-09-05T11:39:00+03:00","id":"0","memory":"8","name":"Node-0.0","network":"28","status":"LIVE","rackName":"Rack-0","io":"60"},{"cpu":"46","date":"2012-09-05T11:42:00+03:00","id":"0","memory":"75","name":"Node-0.0","network":"7","status":"LIVE","rackName":"Rack-0","io":"86"},{"cpu":"61","date":"2012-09-05T11:45:00+03:00","id":"0","memory":"11","name":"Node-0.0","network":"65","status":"LIVE","rackName":"Rack-0","io":"65"},{"cpu":"5","date":"2012-09-05T11:48:00+03:00","id":"0","memory":"24","name":"Node-0.0","network":"14","status":"LIVE","rackName":"Rack-0","io":"62"},{"cpu":"30","date":"2012-09-05T11:51:00+03:00","id":"0","memory":"40","name":"Node-0.0","network":"52","status":"LIVE","rackName":"Rack-0","io":"98"},{"cpu":"5","date":"2012-09-05T11:54:00+03:00","id":"0","memory":"38","name":"Node-0.0","network":"17","status":"LIVE","rackName":"Rack-0","io":"27"},{"cpu":"22","date":"2012-09-05T11:57:00+03:00","id":"0","memory":"80","name":"Node-0.0","network":"62","status":"LIVE","rackName":"Rack-0","io":"38"}] */
});
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 126883e8b7..ee011fc807 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -260,6 +260,9 @@ h1 {
margin-bottom: 0;
}
}
+ .progress {
+ margin-bottom: 0;
+ }
}
#step4, #step6 {
a.selected {
diff --git a/ambari-web/app/templates/wizard/step3.hbs b/ambari-web/app/templates/wizard/step3.hbs
index 35bfd7c770..3a4af157c4 100644
--- a/ambari-web/app/templates/wizard/step3.hbs
+++ b/ambari-web/app/templates/wizard/step3.hbs
@@ -61,11 +61,10 @@
<thead>
<tr>
<th class="span1">{{view Ember.Checkbox checkedBinding="allChecked"}}</th>
- <th class="span2">Status</th>
- <!-- given by the parsing function that parses data from bootstrap call -->
- <th class="span4">Host</th>
+ <th class="span3">Host</th>
<!-- retrieved from local storage initially -->
- <th class="span2">Message</th>
+ <th class="span3">Progress</th>
+ <th class="span2">Status</th>
<!-- given by the parsing function that parses data from bootstrap call, dynamically assign the color -->
<th class="span3">Action</th>
<!-- trash icon -->
@@ -81,14 +80,17 @@
{{view Ember.Checkbox checkedBinding="host.isChecked"}}
</td>
<td>
- {{host.bootStatus}}
+ {{host.name}}
</td>
<td>
- {{host.name}}
+ <div {{bindAttr class="host.bootBarColor host.isBootDone::progress-striped host.isBootDone::active :progress"}}>
+ <div class="bar" style="width:100%">
+ </div>
+ </div>
</td>
<td>
<a href="javascript:void(null)"
- data-toggle="modal" {{action hostLogPopup target="controller"}}>{{host.message}}</a>
+ data-toggle="modal" {{action hostLogPopup host target="controller"}}>{{host.bootStatusForDisplay}}</a>
</td>
<td>
{{#if view.isRemovable}}<a class="btn btn-mini" {{action remove target="view"}}><i class="icon-trash"></i>
diff --git a/ambari-web/app/templates/wizard/step3HostLogPopup.hbs b/ambari-web/app/templates/wizard/step3_host_log_popup.hbs
index 7e9ab9e162..9a1ca7df58 100644
--- a/ambari-web/app/templates/wizard/step3HostLogPopup.hbs
+++ b/ambari-web/app/templates/wizard/step3_host_log_popup.hbs
@@ -16,4 +16,9 @@
* limitations under the License.
}}
-<p>{{t installer.step3.hostLog.popup.body}}</p>
+
+<div id="host-log">
+ <div>
+ <pre class="bootLog">{{view.host.bootLog}}</pre>
+ </div>
+</div>
diff --git a/ambari-web/app/views/wizard/step3_view.js b/ambari-web/app/views/wizard/step3_view.js
index 8c21f2ffea..c2ea51650c 100644
--- a/ambari-web/app/views/wizard/step3_view.js
+++ b/ambari-web/app/views/wizard/step3_view.js
@@ -52,3 +52,5 @@ App.WizardHostView = Em.View.extend({
}.property('hostInfo.bootStatus')
});
+
+