You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by nn...@apache.org on 2015/09/23 23:24:49 UTC
mesos git commit: Fixed issue in the webui where task counts did not
update.
Repository: mesos
Updated Branches:
refs/heads/master a0fd3491e -> ce900da3d
Fixed issue in the webui where task counts did not update.
Review: https://reviews.apache.org/r/38056
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/ce900da3
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/ce900da3
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/ce900da3
Branch: refs/heads/master
Commit: ce900da3df6479edd4ec8224a5697049ed816c5a
Parents: a0fd349
Author: haosdent huang <ha...@gmail.com>
Authored: Wed Sep 23 13:47:49 2015 -0700
Committer: Niklas Q. Nielsen <ni...@mesosphere.io>
Committed: Wed Sep 23 14:24:34 2015 -0700
----------------------------------------------------------------------
src/webui/master/static/js/controllers.js | 172 ++++++++++++++++---------
1 file changed, 111 insertions(+), 61 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/ce900da3/src/webui/master/static/js/controllers.js
----------------------------------------------------------------------
diff --git a/src/webui/master/static/js/controllers.js b/src/webui/master/static/js/controllers.js
index c4340ab..ccf5c31 100644
--- a/src/webui/master/static/js/controllers.js
+++ b/src/webui/master/static/js/controllers.js
@@ -51,7 +51,7 @@
// Update the outermost scope with the new state.
- function update($scope, $timeout, data) {
+ function updateState($scope, $timeout, data) {
// Don't do anything if the data hasn't changed.
if ($scope.data == data) {
return true; // Continue polling.
@@ -123,13 +123,6 @@
$scope.offered_cpus = 0;
$scope.offered_mem = 0;
- $scope.staged_tasks = $scope.state.staged_tasks;
- $scope.started_tasks = $scope.state.started_tasks;
- $scope.finished_tasks = $scope.state.finished_tasks;
- $scope.killed_tasks = $scope.state.killed_tasks;
- $scope.failed_tasks = $scope.state.failed_tasks;
- $scope.lost_tasks = $scope.state.lost_tasks;
-
$scope.activated_slaves = $scope.state.activated_slaves;
$scope.deactivated_slaves = $scope.state.deactivated_slaves;
@@ -213,6 +206,20 @@
}
});
+ // Update the outermost scope with the metrics/snapshot endpoint.
+ function updateMetrics($scope, $timeout, data) {
+ var metrics = JSON.parse(data);
+ $scope.staged_tasks = metrics['master/tasks_staging'];
+ $scope.started_tasks = metrics['master/tasks_starting'];
+ $scope.finished_tasks = metrics['master/tasks_finished'];
+ $scope.killed_tasks = metrics['master/tasks_killed'];
+ $scope.failed_tasks = metrics['master/tasks_failed'];
+ $scope.lost_tasks = metrics['master/tasks_lost'];
+
+ return true; // Continue polling.
+ }
+
+
// Main controller that can be used to handle "global" events. E.g.,:
// $scope.$on('$afterRouteChange', function() { ...; });
//
@@ -247,6 +254,7 @@
$scope.delay = 2000;
$scope.retry = 0;
$scope.time_since_update = 0;
+ $scope.isErrorModalOpen = false;
// Ordered Array of path => activeTab mappings. On successful route changes,
// the `pathRegexp` values are matched against the current route. The first
@@ -281,66 +289,94 @@
if (!matched) $scope.navbarActiveTab = null;
});
- var poll = function() {
- $http.get('master/state',
+ var popupErrorModal = function() {
+ if ($scope.delay >= 128000) {
+ $scope.delay = 2000;
+ } else {
+ $scope.delay = $scope.delay * 2;
+ }
+
+ $scope.isErrorModalOpen = true;
+
+ var errorModal = $modal.open({
+ controller: function($scope, $modalInstance, scope) {
+ // Give the modal reference to the root scope so it can access the
+ // `retry` variable. It needs to be passed by reference, not by
+ // value, since its value is changed outside the scope of the
+ // modal.
+ $scope.rootScope = scope;
+ },
+ resolve: {
+ scope: function() { return $scope; }
+ },
+ templateUrl: "template/dialog/masterGone.html"
+ });
+
+ // Make it such that everytime we hide the error-modal, we stop the
+ // countdown and restart the polling.
+ errorModal.result.then(function() {
+ $scope.isErrorModalOpen = false;
+
+ if ($scope.countdown != null) {
+ if ($timeout.cancel($scope.countdown)) {
+ // Restart since they cancelled the countdown.
+ $scope.delay = 2000;
+ }
+ }
+
+ // Start polling again, but do it asynchronously (and wait at
+ // least a second because otherwise the error-modal won't get
+ // properly shown).
+ $timeout(pollState, 1000);
+ $timeout(pollMetrics, 1000);
+ });
+
+ $scope.retry = $scope.delay;
+ var countdown = function() {
+ if ($scope.retry === 0) {
+ errorModal.close();
+ } else {
+ $scope.retry = $scope.retry - 1000;
+ $scope.countdown = $timeout(countdown, 1000);
+ }
+ };
+ countdown();
+ };
+
+ var pollState = function() {
+ $http.get('master/state.json',
{transformResponse: function(data) { return data; }})
.success(function(data) {
- if (update($scope, $timeout, data)) {
+ if (updateState($scope, $timeout, data)) {
$scope.delay = updateInterval(_.size($scope.slaves));
- $timeout(poll, $scope.delay);
+ $timeout(pollState, $scope.delay);
}
})
.error(function() {
- if ($scope.delay >= 128000) {
- $scope.delay = 2000;
- } else {
- $scope.delay = $scope.delay * 2;
+ if ($scope.isErrorModalOpen === false) {
+ popupErrorModal();
}
+ });
+ };
- var errorModal = $modal.open({
- controller: function($scope, $modalInstance, scope) {
- // Give the modal reference to the root scope so it can access the
- // `retry` variable. It needs to be passed by reference, not by
- // value, since its value is changed outside the scope of the
- // modal.
- $scope.rootScope = scope;
- },
- resolve: {
- scope: function() { return $scope; }
- },
- templateUrl: "template/dialog/masterGone.html"
- });
-
- // Make it such that everytime we hide the error-modal, we stop the
- // countdown and restart the polling.
- errorModal.result.then(function() {
- if ($scope.countdown != null) {
- if ($timeout.cancel($scope.countdown)) {
- // Restart since they cancelled the countdown.
- $scope.delay = 2000;
- }
- }
-
- // Start polling again, but do it asynchronously (and wait at
- // least a second because otherwise the error-modal won't get
- // properly shown).
- $timeout(poll, 1000);
- });
-
- $scope.retry = $scope.delay;
- var countdown = function() {
- if ($scope.retry === 0) {
- errorModal.close();
- } else {
- $scope.retry = $scope.retry - 1000;
- $scope.countdown = $timeout(countdown, 1000);
- }
- };
- countdown();
+ var pollMetrics = function() {
+ $http.get('metrics/snapshot',
+ {transformResponse: function(data) { return data; }})
+ .success(function(data) {
+ if (updateMetrics($scope, $timeout, data)) {
+ $scope.delay = updateInterval(_.size($scope.slaves));
+ $timeout(pollMetrics, $scope.delay);
+ }
+ })
+ .error(function() {
+ if ($scope.isErrorModalOpen === false) {
+ popupErrorModal();
+ }
});
};
- poll();
+ pollState();
+ pollMetrics();
}]);
@@ -435,10 +471,6 @@
$scope.slave.frameworks = {};
$scope.slave.completed_frameworks = {};
- $scope.slave.staging_tasks = 0;
- $scope.slave.starting_tasks = 0;
- $scope.slave.running_tasks = 0;
-
// Computes framework stats by setting new attributes on the 'framework'
// object.
function computeFrameworkStats(framework) {
@@ -471,6 +503,24 @@
$scope.alert_message = 'Failed to get slave usage / state: ' + reason;
$('#alert').show();
});
+
+ $http.jsonp('//' + host + '/metrics/snapshot?jsonp=JSON_CALLBACK')
+ .success(function (response) {
+ if (!$scope.state) {
+ $scope.state = {};
+ }
+
+ $scope.state.staged_tasks = response['slave/tasks_staging'];
+ $scope.state.started_tasks = response['slave/tasks_starting'];
+ $scope.state.finished_tasks = response['slave/tasks_finished'];
+ $scope.state.killed_tasks = response['slave/tasks_killed'];
+ $scope.state.failed_tasks = response['slave/tasks_failed'];
+ $scope.state.lost_tasks = response['slave/tasks_lost'];
+ })
+ .error(function(reason) {
+ $scope.alert_message = 'Failed to get slave metrics: ' + reason;
+ $('#alert').show();
+ });
};
if ($scope.state) {