You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by ma...@apache.org on 2014/05/22 01:17:45 UTC

git commit: Make JS compliant with JSHint rules

Repository: incubator-aurora
Updated Branches:
  refs/heads/master d2ab18213 -> 9fd8b5559


Make JS compliant with JSHint rules

Testing Done:
$ ./gradlew clean build

Bugs closed: AURORA-438

Reviewed at https://reviews.apache.org/r/21523/


Project: http://git-wip-us.apache.org/repos/asf/incubator-aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-aurora/commit/9fd8b555
Tree: http://git-wip-us.apache.org/repos/asf/incubator-aurora/tree/9fd8b555
Diff: http://git-wip-us.apache.org/repos/asf/incubator-aurora/diff/9fd8b555

Branch: refs/heads/master
Commit: 9fd8b5559d89d0d682d008e8202c622eaa140972
Parents: d2ab182
Author: David McLaughlin <da...@dmclaughlin.com>
Authored: Wed May 21 16:09:42 2014 -0700
Committer: Suman Karumuri <sk...@twitter.com>
Committed: Wed May 21 16:09:42 2014 -0700

----------------------------------------------------------------------
 build.gradle                                    |   6 +-
 .../apache/aurora/scheduler/http/ui/js/app.js   |  37 +-
 .../aurora/scheduler/http/ui/js/controllers.js  | 671 ++++++++++---------
 .../aurora/scheduler/http/ui/js/directives.js   | 202 +++---
 .../aurora/scheduler/http/ui/js/filters.js      | 117 ++--
 .../aurora/scheduler/http/ui/js/services.js     | 452 +++++++------
 6 files changed, 755 insertions(+), 730 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/9fd8b555/build.gradle
----------------------------------------------------------------------
diff --git a/build.gradle b/build.gradle
index 77fba33..d220385 100644
--- a/build.gradle
+++ b/build.gradle
@@ -293,7 +293,7 @@ task jsHint(type:com.eriwen.gradle.js.tasks.JsHintTask) {
   source = fileTree('src/main/resources/org/apache/aurora/scheduler/http/ui/js/')
   dest file("${buildDir}/jshint.out")
   // Set this to false once JS code complies with JSHint.
-  ignoreExitCode true
+  ignoreExitCode false
   outputToStdOut true
   jshint.options = [
     // See: http://www.jshint.com/docs/options/ for explanation.
@@ -302,10 +302,12 @@ task jsHint(type:com.eriwen.gradle.js.tasks.JsHintTask) {
     curly: true,
     eqeqeq: true,
     indent: 2,
+    maxlen: 100,
     quotmark: true,
     trailing: true,
     undef: true,
-    unused: true
+    unused: 'vars',
+    white: true
   ]
   jshint.predef = [
     '_': true,

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/9fd8b555/src/main/resources/org/apache/aurora/scheduler/http/ui/js/app.js
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/app.js b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/app.js
index 1a61712..2a27a8c 100644
--- a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/app.js
+++ b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/app.js
@@ -13,27 +13,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-'use strict';
+(function () {
+  'use strict';
 
-// Declare app level module which depends on filters, and services
-var auroraUI = angular.module('auroraUI', ['ngRoute', 'auroraUI.controllers', 'smartTable.table']);
+  // Declare app level module which depends on filters, and services
+  var auroraUI = angular.module('auroraUI',
+    ['ngRoute', 'auroraUI.controllers', 'smartTable.table']);
 
-auroraUI.config(function ($routeProvider, $locationProvider) {
-  $routeProvider.when("/scheduler",
-    {templateUrl: '/home.html', controller: 'RoleSummaryController'});
+  auroraUI.config(function ($routeProvider, $locationProvider) {
+    $routeProvider.when('/scheduler',
+      {templateUrl: '/home.html', controller: 'RoleSummaryController'});
 
-  $routeProvider.when("/scheduler/:role",
-    {templateUrl: '/role.html', controller: 'JobSummaryController'});
+    $routeProvider.when('/scheduler/:role',
+      {templateUrl: '/role.html', controller: 'JobSummaryController'});
 
-  $routeProvider.when("/scheduler/:role/:environment",
-    {templateUrl: '/role.html', controller: 'JobSummaryController'});
+    $routeProvider.when('/scheduler/:role/:environment',
+      {templateUrl: '/role.html', controller: 'JobSummaryController'});
 
-  $routeProvider.when("/scheduler/:role/:environment/:job",
-    {templateUrl: '/job.html', controller: 'JobController'});
+    $routeProvider.when('/scheduler/:role/:environment/:job',
+      {templateUrl: '/job.html', controller: 'JobController'});
 
-  $routeProvider.otherwise({redirectTo: function (location, path) {
-    window.location.href = path;
-  }});
+    $routeProvider.otherwise({redirectTo: function (location, path) {
+      window.location.href = path;
+    }});
 
-  $locationProvider.html5Mode(true);
-});
+    $locationProvider.html5Mode(true);
+  });
+})();

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/9fd8b555/src/main/resources/org/apache/aurora/scheduler/http/ui/js/controllers.js
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/controllers.js b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/controllers.js
index 1fa1cea..87cdfb2 100644
--- a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/controllers.js
+++ b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/controllers.js
@@ -13,404 +13,407 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-'use strict';
-
-/* Controllers */
-
-var auroraUIControllers = angular.module('auroraUI.controllers', []);
+(function () {
+  /* global ScheduleStatus:false */
+  'use strict';
+
+  /* Controllers */
+
+  var auroraUIControllers = angular.module('auroraUI.controllers', []);
+
+  var infoTableConfig = {
+    isGlobalSearchActivated: true,
+    isPaginationEnabled: true,
+    itemsByPage: 25,
+    maxSize: 8,
+    selectionMode: 'single'
+  };
+
+  var summaryTableConfig = {
+    isPaginationEnabled: false,
+    isGlobalSearchActivated: false,
+    selectionMode: 'none'
+  };
+
+  auroraUIControllers.controller('RoleSummaryController',
+    function ($scope, auroraClient) {
+      $scope.title = 'Scheduled Jobs Summary';
+
+      $scope.error = '';
+
+      $scope.roleSummaryColumns = [
+        {label: 'Role', map: 'role', cellTemplateUrl: 'roleLink.html'},
+        {label: 'Jobs', map: 'jobCount'},
+        {label: 'Cron Jobs', map: 'cronJobCount'}
+      ];
 
-var infoTableConfig = {
-  isGlobalSearchActivated: true,
-  isPaginationEnabled: true,
-  itemsByPage: 25,
-  maxSize: 8,
-  selectionMode: 'single'
-};
+      $scope.roleSummaries = parseResponse(auroraClient.getRoleSummary());
 
-var summaryTableConfig = {
-  isPaginationEnabled: false,
-  isGlobalSearchActivated: false,
-  selectionMode: 'none'
-};
+      function parseResponse(response) {
+        $scope.error = response.error ? 'Error requesting role summary: ' + response.error : '';
 
-auroraUIControllers.controller('RoleSummaryController',
-  function ($scope, auroraClient) {
-    $scope.title = 'Scheduled Jobs Summary';
+        if ($scope.error) {
+          return [];
+        }
 
-    $scope.error = '';
+        // TODO(Suman Karumuri): Replace sort with defaultSortColumn once it lands
+        // https://github.com/lorenzofox3/Smart-Table/pull/61
+        return response.summaries.sort(function (a, b) {
+          if (a.role.toLowerCase() > b.role.toLowerCase()) {
+            return 1;
+          }
+          if (a.role.toLowerCase() < b.role.toLowerCase()) {
+            return -1;
+          }
+          return 0;
+        });
+      }
 
-    $scope.roleSummaryColumns = [
-      {label: 'Role', map: 'role', cellTemplateUrl: 'roleLink.html'},
-      {label: 'Jobs', map: 'jobCount'},
-      {label: 'Cron Jobs', map: 'cronJobCount'}
-    ];
+      $scope.roleSummaryTableConfig = infoTableConfig;
+    });
+
+  auroraUIControllers.controller('JobSummaryController',
+    function ($scope, $routeParams, auroraClient) {
+      $scope.role = $routeParams.role;
+      $scope.environment = $routeParams.environment;
+
+      $scope.error = '';
+
+      $scope.jobsTableColumns = [
+        {label: 'Job Type', map: 'jobType'},
+        {label: 'Environment', map: 'environment', cellTemplateUrl: '/roleEnvLink.html'},
+        {label: 'Job', map: 'jobName', cellTemplateUrl: '/jobLink.html'},
+        {label: 'production', map: 'isProduction'},
+        {label: 'Pending Tasks', map: 'pendingTasks'},
+        {label: 'Active Tasks', map: 'activeTasks'},
+        {label: 'Finished Tasks', map: 'finishedTasks'},
+        {label: 'Failed Tasks', map: 'failedTasks'}
+      ];
 
-    $scope.roleSummaries = parseResponse(auroraClient.getRoleSummary());
+      $scope.jobsTableConfig = infoTableConfig;
 
-    function parseResponse(response) {
-      $scope.error = response.error ? 'Error requesting role summary: ' + response.error : '';
+      $scope.jobs = getJobs();
 
-      if ($scope.error) {
-        return [];
-      }
+      function getJobs() {
+        var summaries = auroraClient.getJobSummary($scope.role);
+        $scope.error = summaries.error ? 'Error fetching job summaries: ' + summaries.error : '';
 
-      // TODO(Suman Karumuri): Replace sort with defaultSortColumn once it lands
-      // https://github.com/lorenzofox3/Smart-Table/pull/61
-      return response.summaries.sort(function (a, b) {
-        if (a.role.toLowerCase() > b.role.toLowerCase()) {
-          return 1;
+        if ($scope.error) {
+          return [];
         }
-        if (a.role.toLowerCase() < b.role.toLowerCase()) {
-          return -1;
-        }
-        return 0;
-      });
-    }
-
-    $scope.roleSummaryTableConfig = infoTableConfig;
-  });
 
-auroraUIControllers.controller('JobSummaryController',
-  function ($scope, $routeParams, auroraClient) {
-    $scope.role = $routeParams.role;
-    $scope.environment = $routeParams.environment;
+        var jobSummaries = summaries.jobs;
 
-    $scope.error = '';
+        if ($scope.environment) {
+          jobSummaries = _.filter(jobSummaries, function (summary) {
+            return summary.job.key.environment === $scope.environment;
+          });
+        }
 
-    $scope.jobsTableColumns = [
-      {label: 'Job Type', map: 'jobType'},
-      {label: 'Environment', map: 'environment', cellTemplateUrl: '/roleEnvLink.html'},
-      {label: 'Job', map: 'jobName', cellTemplateUrl: '/jobLink.html'},
-      {label: 'production', map: 'isProduction'},
-      {label: 'Pending Tasks', map: 'pendingTasks'},
-      {label: 'Active Tasks', map: 'activeTasks'},
-      {label: 'Finished Tasks', map: 'finishedTasks'},
-      {label: 'Failed Tasks', map: 'failedTasks'}
-    ];
+        var byJobName = function (summary) {
+          return summary.jobName;
+        };
 
-    $scope.jobsTableConfig = infoTableConfig;
+        return _.chain(jobSummaries)
+          .map(function (summary) {
+            return {
+              role: $scope.role, // required for roleEnvLink directive
+              environment: summary.job.key.environment,
+              jobName: summary.job.taskConfig.jobName,
+              jobType: getJobType(summary.job),
+              isProduction: summary.job.taskConfig.production ? 'yes' : '',
+              pendingTasks: summary.stats.pendingTaskCount,
+              activeTasks: summary.stats.activeTaskCount,
+              finishedTasks: summary.stats.finishedTaskCount,
+              failedTasks: summary.stats.failedTaskCount
+            };
+          })
+          .sortBy(byJobName)
+          .value();
+      }
 
-    $scope.jobs = getJobs();
+      function getJobType(job) {
+        if (job.taskConfig.isService) {
+          return 'service';
+        }
 
-    function getJobs() {
-      var summaries = auroraClient.getJobSummary($scope.role);
-      $scope.error = summaries.error ? 'Error fetching job summaries: ' + summaries.error : '';
+        if (job.cronSchedule !== null) {
+          return 'cron';
+        }
 
-      if ($scope.error) {
-        return [];
+        return 'adhoc';
       }
+    });
 
-      var jobSummaries = summaries.jobs;
+  auroraUIControllers.controller('QuotaController',
+    function ($scope, $filter, auroraClient) {
+      $scope.error = '';
 
-      if ($scope.environment) {
-        jobSummaries = _.filter(jobSummaries, function (summary) {
-          return summary.job.key.environment === $scope.environment;
-        });
-      }
+      $scope.resourcesTableColumns = [
+        {label: 'Resource', map: 'resource'},
+        {label: 'Production Consumption', map: 'prodConsumption'},
+        {label: 'Quota', map: 'quota'},
+        {label: 'Non-Production Consumption', map: 'nonProdConsumption'}
+      ];
 
-      var byJobName = function (summary) {
-        return summary.jobName;
-      };
+      $scope.resourcesTableConfig = summaryTableConfig;
 
-      return _.chain(jobSummaries)
-        .map(function (summary) {
-          return {
-            role: $scope.role, // required for roleEnvLink directive
-            environment: summary.job.key.environment,
-            jobName: summary.job.taskConfig.jobName,
-            jobType: getJobType(summary.job),
-            isProduction: summary.job.taskConfig.production ? 'yes' : '',
-            pendingTasks: summary.stats.pendingTaskCount,
-            activeTasks: summary.stats.activeTaskCount,
-            finishedTasks: summary.stats.finishedTaskCount,
-            failedTasks: summary.stats.failedTaskCount
-          };
-        })
-        .sortBy(byJobName)
-        .value();
-    }
+      $scope.resources = getQuota();
 
-    function getJobType(job) {
-      if (job.taskConfig.isService) {
-        return 'service';
-      }
+      function getQuota() {
+        var quotaResponse = auroraClient.getQuota($scope.role);
+        $scope.error = quotaResponse.error ? 'Error fetching quota: ' + quotaResponse.error : '';
 
-      if (job.cronSchedule !== null) {
-        return 'cron';
-      }
+        if ($scope.error) {
+          return [];
+        }
 
-      return 'adhoc';
+        var consumption = quotaResponse.quota;
+        return [
+          {
+            resource: 'CPU',
+            prodConsumption: $filter('toCores')(consumption.prodConsumption.numCpus),
+            quota: $filter('toCores')(consumption.quota.numCpus),
+            nonProdConsumption: $filter('toCores')(consumption.nonProdConsumption.numCpus)
+          },
+          {
+            resource: 'RAM',
+            prodConsumption: $filter('scaleMb')(consumption.prodConsumption.ramMb),
+            quota: $filter('scaleMb')(consumption.quota.ramMb),
+            nonProdConsumption: $filter('scaleMb')(consumption.nonProdConsumption.ramMb)
+          },
+          {
+            resource: 'Disk',
+            prodConsumption: $filter('scaleMb')(consumption.prodConsumption.diskMb),
+            quota: $filter('scaleMb')(consumption.quota.diskMb),
+            nonProdConsumption: $filter('scaleMb')(consumption.nonProdConsumption.diskMb)
+          }
+        ];
+      }
     }
-  });
-
-auroraUIControllers.controller('QuotaController',
-  function ($scope, $filter, auroraClient) {
-    $scope.error = '';
+  );
+
+  auroraUIControllers.controller('CronJobSummaryController',
+    function ($scope, $filter, cronJobSummaryService) {
+      $scope.cronJobSummaryTableConfig = summaryTableConfig;
+
+      $scope.cronJobSummaryTableColumns = [
+        {label: 'Number of tasks', map: 'tasks', isSortable: false},
+        {label: 'Cron Schedule', map: 'schedule', isSortable: false},
+        {label: 'Next Cron Run', map: 'nextCronRun', isSortable: false},
+        {label: 'Collision Policy', map: 'collisionPolicy', isSortable: false},
+        {label: 'Metadata', map: 'metadata', isSortable: false}
+      ];
 
-    $scope.resourcesTableColumns = [
-      {label: 'Resource', map: 'resource'},
-      {label: 'Production Consumption', map: 'prodConsumption'},
-      {label: 'Quota', map: 'quota'},
-      {label: 'Non-Production Consumption', map: 'nonProdConsumption'}
-    ];
+      $scope.error = '';
+      $scope.cronJobSummary = [];
 
-    $scope.resourcesTableConfig = summaryTableConfig;
+      var cronJobSummary = cronJobSummaryService.getCronJobSummary($scope.role, $scope.environment,
+        $scope.job);
 
-    $scope.resources = getQuota();
+      if (cronJobSummary.error) {
+        $scope.error = 'Error fetching cron job summary: ' + cronJobSummary.error;
+        return [];
+      }
 
-    function getQuota() {
-      var quotaResponse = auroraClient.getQuota($scope.role);
-      $scope.error = quotaResponse.error ? 'Error fetching quota: ' + quotaResponse.error : '';
+      if (cronJobSummary.cronJobSummary) {
+        var nextCronRunTs = cronJobSummary.cronJobSummary.nextCronRun;
+        cronJobSummary.cronJobSummary.nextCronRun =
+          $filter('toLocalTime')(nextCronRunTs) + ', ' + $filter('toUtcTime')(nextCronRunTs);
 
-      if ($scope.error) {
-        return [];
+        $scope.cronJobSummary = [cronJobSummary.cronJobSummary];
       }
+    }
+  );
+
+  auroraUIControllers.controller('JobController',
+    function ($scope, $routeParams, auroraClient, taskUtil) {
+      $scope.error = '';
+
+      $scope.role = $routeParams.role;
+      $scope.environment = $routeParams.environment;
+      $scope.job = $routeParams.job;
+
+      var taskTableConfig = {
+        isGlobalSearchActivated: false,
+        isPaginationEnabled: true,
+        itemsByPage: 50,
+        maxSize: 8,
+        selectionMode: 'single'
+      };
 
-      var consumption = quotaResponse.quota;
-      return [
-        {
-          resource: 'CPU',
-          prodConsumption: $filter('toCores')(consumption.prodConsumption.numCpus),
-          quota: $filter('toCores')(consumption.quota.numCpus),
-          nonProdConsumption: $filter('toCores')(consumption.nonProdConsumption.numCpus)
-        },
-        {
-          resource: 'RAM',
-          prodConsumption: $filter('scaleMb')(consumption.prodConsumption.ramMb),
-          quota: $filter('scaleMb')(consumption.quota.ramMb),
-          nonProdConsumption: $filter('scaleMb')(consumption.nonProdConsumption.ramMb)
-        },
-        {
-          resource: 'Disk',
-          prodConsumption: $filter('scaleMb')(consumption.prodConsumption.diskMb),
-          quota: $filter('scaleMb')(consumption.quota.diskMb),
-          nonProdConsumption: $filter('scaleMb')(consumption.nonProdConsumption.diskMb)
-        }
+      $scope.activeTasksTableConfig = taskTableConfig;
+      $scope.completedTasksTableConfig = taskTableConfig;
+
+      var taskColumns = [
+        {label: 'Instance', map: 'instanceId'},
+        {label: 'Status', map: 'status', cellTemplateUrl: '/taskStatus.html'},
+        {label: 'Host', map: 'host', cellTemplateUrl: '/taskSandbox.html'}
       ];
-    }
-  }
-);
-
-auroraUIControllers.controller('CronJobSummaryController',
-  function ($scope, $filter, cronJobSummaryService) {
-    $scope.cronJobSummaryTableConfig = summaryTableConfig;
-
-    $scope.cronJobSummaryTableColumns = [
-      {label: 'Number of tasks', map: 'tasks', isSortable: false},
-      {label: 'Cron Schedule', map: 'schedule', isSortable: false},
-      {label: 'Next Cron Run', map: 'nextCronRun', isSortable: false},
-      {label: 'Collision Policy', map: 'collisionPolicy', isSortable: false},
-      {label: 'Metadata', map: 'metadata', isSortable: false}
-    ];
-
-    $scope.error = '';
-    $scope.cronJobSummary = [];
-
-    var cronJobSummary = cronJobSummaryService.getCronJobSummary($scope.role, $scope.environment,
-      $scope.job);
-
-    if (cronJobSummary.error) {
-      $scope.error = 'Error fetching cron job summary: ' + cronJobSummary.error;
-      return [];
-    }
 
-    if (cronJobSummary.cronJobSummary) {
-      var nextCronRunTs = cronJobSummary.cronJobSummary.nextCronRun;
-      cronJobSummary.cronJobSummary.nextCronRun =
-        $filter('toLocalTime')(nextCronRunTs) + ', ' + $filter('toUtcTime')(nextCronRunTs);
+      var completedTaskColumns = addColumn(2,
+        taskColumns,
+        {label: 'Running duration',
+          map: 'duration',
+          formatFunction: function (duration) {
+            return moment.duration(duration).humanize();
+          }
+        });
 
-      $scope.cronJobSummary = [cronJobSummary.cronJobSummary];
-    }
-  }
-);
-
-auroraUIControllers.controller('JobController',
-  function ($scope, $routeParams, auroraClient, taskUtil) {
-    $scope.error = '';
-
-    $scope.role = $routeParams.role;
-    $scope.environment = $routeParams.environment;
-    $scope.job = $routeParams.job;
-
-    var taskTableConfig = {
-      isGlobalSearchActivated: false,
-      isPaginationEnabled: true,
-      itemsByPage: 50,
-      maxSize: 8,
-      selectionMode: 'single'
-    };
-
-    $scope.activeTasksTableConfig = taskTableConfig;
-    $scope.completedTasksTableConfig = taskTableConfig;
-
-    var taskColumns = [
-      {label: 'Instance', map: 'instanceId'},
-      {label: 'Status', map: 'status', cellTemplateUrl: '/taskStatus.html'},
-      {label: 'Host', map: 'host', cellTemplateUrl: '/taskSandbox.html'}
-    ];
-
-    var completedTaskColumns = addColumn(2,
-      taskColumns,
-      {label: 'Running duration',
-        map: 'duration',
-        formatFunction: function (duration) {
-          return moment.duration(duration).humanize();
-        }
-      });
+      var taskIdColumn = {label: 'Task ID', map: 'taskId', cellTemplateUrl: '/taskLink.html'};
 
-    var taskIdColumn = {label: 'Task ID', map: 'taskId', cellTemplateUrl: '/taskLink.html'};
+      $scope.activeTasksTableColumns = taskColumns;
 
-    $scope.activeTasksTableColumns = taskColumns;
+      $scope.completedTasksTableColumns = completedTaskColumns;
 
-    $scope.completedTasksTableColumns = completedTaskColumns;
+      function addColumn(idxPosition, currentColumns, newColumn) {
+        return _.union(
+          _.first(currentColumns, idxPosition),
+          [newColumn],
+          _.last(currentColumns, currentColumns.length - idxPosition));
+      }
 
-    function addColumn(idxPosition, currentColumns, newColumn) {
-      return _.union(
-        _.first(currentColumns, idxPosition),
-        [newColumn],
-        _.last(currentColumns, currentColumns.length - idxPosition));
-    }
+      $scope.showTaskInfoLink = false;
 
-    $scope.showTaskInfoLink = false;
+      $scope.toggleTaskInfoLinkVisibility = function () {
+        $scope.showTaskInfoLink = !$scope.showTaskInfoLink;
 
-    $scope.toggleTaskInfoLinkVisibility = function () {
-      $scope.showTaskInfoLink = !$scope.showTaskInfoLink;
+        $scope.activeTasksTableColumns = $scope.showTaskInfoLink ?
+          addColumn(2, taskColumns, taskIdColumn) :
+          taskColumns;
 
-      $scope.activeTasksTableColumns = $scope.showTaskInfoLink
-        ? addColumn(2, taskColumns, taskIdColumn)
-        : taskColumns;
+        $scope.completedTasksTableColumns = $scope.showTaskInfoLink ?
+          addColumn(3, completedTaskColumns, taskIdColumn) :
+          completedTaskColumns;
+      };
 
-      $scope.completedTasksTableColumns = $scope.showTaskInfoLink
-        ? addColumn(3, completedTaskColumns, taskIdColumn) :
-        completedTaskColumns;
-    };
+      $scope.jobDashboardUrl = '';
 
-    $scope.jobDashboardUrl = '';
+      $scope.completedTasks = [];
 
-    $scope.completedTasks = [];
+      $scope.activeTasks = getTasksForJob($scope.role, $scope.environment, $scope.job);
 
-    $scope.activeTasks = getTasksForJob($scope.role, $scope.environment, $scope.job);
+      function buildGroupSummary($scope) {
+        var colors = [
+          'steelblue',
+          'indianred',
+          'darkseagreen',
+          'sandybrown',
+          'plum'
+        ];
 
-    function buildGroupSummary($scope) {
-      var colors = [
-        'steelblue',
-        'indianred',
-        'darkseagreen',
-        'sandybrown',
-        'plum'
-      ];
+        var total = _.reduce($scope.taskSummary, function (m, n) {
+          return m + ((n.range.end - n.range.start) + 1);
+        }, 0);
 
-      var total = _.reduce($scope.taskSummary, function(m, n) {
-        return m + ((n.range.end - n.range.start) + 1);
-      }, 0);
+        $scope.groupSummary = $scope.taskSummary.map(function (summary, i) {
+          var count = (summary.range.end - summary.range.start) + 1;
+          var percentage = (count / total) * 100;
 
-      $scope.groupSummary = $scope.taskSummary.map(function(summary, i) {
-        var count = (summary.range.end - summary.range.start) + 1;
-        var percentage = (count / total) * 100;
+          return {
+            label: summary.range.start + '-' + summary.range.end,
+            value: count,
+            percentage: percentage,
+            summary: summary,
+            color: colors[i % colors.length]
+          };
+        });
+      }
 
-        return {
-          label: summary.range.start + '-' + summary.range.end,
-          value: count,
-          percentage: percentage,
-          summary: summary,
-          color: colors[i % colors.length]
+      function getTasksForJob(role, environment, job) {
+        var response = auroraClient.getTasks(role, environment, job);
+
+        if (response.error) {
+          $scope.error = 'Error fetching tasks: ' + response.error;
+          return [];
         }
-      });
-    }
 
-    function getTasksForJob(role, environment, job) {
-      var response = auroraClient.getTasks(role, environment, job);
+        $scope.jobDashboardUrl = getJobDashboardUrl(response.statsUrlPrefix);
 
-      if (response.error) {
-        $scope.error = 'Error fetching tasks: ' + response.error;
-        return [];
-      }
+        $scope.taskSummary = taskUtil.summarizeActiveTaskConfigs(response.tasks);
+        buildGroupSummary($scope);
 
-      $scope.jobDashboardUrl = getJobDashboardUrl(response.statsUrlPrefix);
+        var tasks = _.map(response.tasks, function (task) {
+          return summarizeTask(task);
+        });
 
-      $scope.taskSummary = taskUtil.summarizeActiveTaskConfigs(response.tasks);
-      buildGroupSummary($scope);
+        var activeTaskPredicate = function (task) {
+          return task.isActive;
+        };
 
-      var tasks = _.map(response.tasks, function (task) {
-        return summarizeTask(task);
-      });
+        $scope.completedTasks = _.chain(tasks)
+          .reject(activeTaskPredicate)
+          .sortBy(function (task) {
+            return -task.latestActivity; //sort in descending order
+          })
+          .value();
+
+        return _.chain(tasks)
+          .filter(activeTaskPredicate)
+          .sortBy(function (task) {
+            return task.instanceId;
+          })
+          .value();
+      }
 
-      var activeTaskPredicate = function (task) {
-        return task.isActive;
-      };
+      function summarizeTask(task) {
+        var isActive = taskUtil.isActiveTask(task);
+        var sortedTaskEvents = _.sortBy(task.taskEvents, function (taskEvent) {
+          return taskEvent.timestamp;
+        });
 
-      $scope.completedTasks = _.chain(tasks)
-        .reject(activeTaskPredicate)
-        .sortBy(function (task) {
-          return -task.latestActivity; //sort in descending order
-        })
-        .value();
-
-      return _.chain(tasks)
-        .filter(activeTaskPredicate)
-        .sortBy(function (task) {
-          return task.instanceId;
-        })
-        .value();
-    }
+        // Since all task sandboxes are eventually garbage collected SANDBOX_DELETED doesn't
+        // indicate the state of the task, so use the previous task event to determine task status.
+        var latestTaskEvent = task.status === ScheduleStatus.SANDBOX_DELETED ?
+          _.chain(sortedTaskEvents).last(2).first().value() :
+          _.last(sortedTaskEvents);
 
-    function summarizeTask(task) {
-      var isActive = taskUtil.isActiveTask(task);
-      var sortedTaskEvents = _.sortBy(task.taskEvents, function (taskEvent) {
-        return taskEvent.timestamp;
-      });
-
-      // Since all task sandboxes are eventually garbage collected SANDBOX_DELETED doesn't indicate
-      // the state of the task, so use the previous task event to determine task status.
-      var latestTaskEvent = task.status === ScheduleStatus.SANDBOX_DELETED
-        ? _.chain(sortedTaskEvents).last(2).first().value()
-        : _.last(sortedTaskEvents);
-
-      return {
-        instanceId: task.assignedTask.instanceId,
-        status: _.invert(ScheduleStatus)[latestTaskEvent.status],
-        statusMessage: latestTaskEvent.message,
-        host: task.assignedTask.slaveHost || '',
-        latestActivity: _.isEmpty(sortedTaskEvents) ? 0 : latestTaskEvent.timestamp,
-        duration: getDuration(sortedTaskEvents),
-        isActive: isActive,
-        taskId: task.assignedTask.taskId,
-        taskEvents: summarizeTaskEvents(sortedTaskEvents),
-        showDetails: false,
-        sandboxExists: task.status !== ScheduleStatus.SANDBOX_DELETED
-      };
-    }
+        return {
+          instanceId: task.assignedTask.instanceId,
+          status: _.invert(ScheduleStatus)[latestTaskEvent.status],
+          statusMessage: latestTaskEvent.message,
+          host: task.assignedTask.slaveHost || '',
+          latestActivity: _.isEmpty(sortedTaskEvents) ? 0 : latestTaskEvent.timestamp,
+          duration: getDuration(sortedTaskEvents),
+          isActive: isActive,
+          taskId: task.assignedTask.taskId,
+          taskEvents: summarizeTaskEvents(sortedTaskEvents),
+          showDetails: false,
+          sandboxExists: task.status !== ScheduleStatus.SANDBOX_DELETED
+        };
+      }
 
-    function getDuration(sortedTaskEvents) {
-      var runningTaskEvent = _.find(sortedTaskEvents, function (taskEvent) {
-        return taskEvent.status === ScheduleStatus.RUNNING;
-      });
+      function getDuration(sortedTaskEvents) {
+        var runningTaskEvent = _.find(sortedTaskEvents, function (taskEvent) {
+          return taskEvent.status === ScheduleStatus.RUNNING;
+        });
 
-      if (runningTaskEvent) {
-        var nextEvent = sortedTaskEvents[_.indexOf(sortedTaskEvents, runningTaskEvent) + 1];
+        if (runningTaskEvent) {
+          var nextEvent = sortedTaskEvents[_.indexOf(sortedTaskEvents, runningTaskEvent) + 1];
 
-        return nextEvent
-          ? nextEvent.timestamp - runningTaskEvent.timestamp
-          : moment().valueOf() - runningTaskEvent.timestamp;
-      }
+          return nextEvent ?
+            nextEvent.timestamp - runningTaskEvent.timestamp :
+            moment().valueOf() - runningTaskEvent.timestamp;
+        }
 
-      return 0;
-    }
+        return 0;
+      }
 
-    function summarizeTaskEvents(taskEvents) {
-      return _.map(taskEvents, function (taskEvent) {
-        return {
-          date: moment(taskEvent.timestamp).format('MM/DD h:mm:ss'),
-          status: _.invert(ScheduleStatus)[taskEvent.status],
-          message: taskEvent.message
-        };
-      });
-    }
+      function summarizeTaskEvents(taskEvents) {
+        return _.map(taskEvents, function (taskEvent) {
+          return {
+            date: moment(taskEvent.timestamp).format('MM/DD h:mm:ss'),
+            status: _.invert(ScheduleStatus)[taskEvent.status],
+            message: taskEvent.message
+          };
+        });
+      }
 
-    function getJobDashboardUrl(statsUrlPrefix) {
-      return _.isEmpty(statsUrlPrefix)
-        ? ''
-        : statsUrlPrefix + $scope.role + '.' + $scope.environment + '.' + $scope.job;
+      function getJobDashboardUrl(statsUrlPrefix) {
+        return _.isEmpty(statsUrlPrefix) ?
+          '' :
+          statsUrlPrefix + $scope.role + '.' + $scope.environment + '.' + $scope.job;
+      }
     }
-  }
-);
+  );
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/9fd8b555/src/main/resources/org/apache/aurora/scheduler/http/ui/js/directives.js
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/directives.js b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/directives.js
index 890cb44..b186ae2 100644
--- a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/directives.js
+++ b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/directives.js
@@ -13,117 +13,121 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-'use strict';
+(function () {
+  /*global auroraUI:false */
+  'use strict';
 
-auroraUI.directive('roleLink', function () {
-  return {
-    restrict: 'C',
-    template: '<a ng-href="/scheduler/{{formatedValue}}">{{formatedValue}}</a>'
-  };
-});
+  auroraUI.directive('roleLink', function () {
+    return {
+      restrict: 'C',
+      template: '<a ng-href="/scheduler/{{formatedValue}}">{{formatedValue}}</a>'
+    };
+  });
 
-auroraUI.directive('roleEnvLink', function () {
-  return {
-    restrict: 'C',
-    template: '<a ng-href="/scheduler/{{dataRow.role}}/{{formatedValue}}">{{formatedValue}}</a>'
-  };
-});
+  auroraUI.directive('roleEnvLink', function () {
+    return {
+      restrict: 'C',
+      template: '<a ng-href="/scheduler/{{dataRow.role}}/{{formatedValue}}">{{formatedValue}}</a>'
+    };
+  });
 
-auroraUI.directive('jobLink', function () {
-  return {
-    restrict: 'C',
-    template: '<a ng-href="/scheduler/{{dataRow.role}}/{{dataRow.environment}}/{{formatedValue}}">'
-      + '{{formatedValue}}</a>'
-  };
-});
+  auroraUI.directive('jobLink', function () {
+    return {
+      restrict: 'C',
+      template:
+        '<a ng-href="/scheduler/{{dataRow.role}}/{{dataRow.environment}}/{{formatedValue}}">' +
+        '{{formatedValue}}</a>'
+    };
+  });
 
-auroraUI.directive('breadcrumb', function () {
-  return {
-    restrict: 'E',
-    templateUrl: '/breadcrumb.html'
-  };
-});
+  auroraUI.directive('breadcrumb', function () {
+    return {
+      restrict: 'E',
+      templateUrl: '/breadcrumb.html'
+    };
+  });
 
-auroraUI.directive('error', function () {
-  return {
-    restrict: 'E',
-    templateUrl: '/error.html'
-  };
-});
+  auroraUI.directive('error', function () {
+    return {
+      restrict: 'E',
+      templateUrl: '/error.html'
+    };
+  });
 
-auroraUI.directive('taskSandboxLink', function () {
-  return {
-    restrict: 'E',
-    templateUrl: '/taskSandbox.html'
-  };
-});
+  auroraUI.directive('taskSandboxLink', function () {
+    return {
+      restrict: 'E',
+      templateUrl: '/taskSandbox.html'
+    };
+  });
 
-auroraUI.directive('taskStatus', function () {
-  return {
-    restrict: 'E',
-    replace: true,
-    link: function (scope, element, attrs, ctrl) {
-      element.on('click', function (e) {
-        scope.showDetails = !scope.showDetails;
-      });
-    }
-  };
-});
+  auroraUI.directive('taskStatus', function () {
+    return {
+      restrict: 'E',
+      replace: true,
+      link: function (scope, element, attrs, ctrl) {
+        element.on('click', function (e) {
+          scope.showDetails = !scope.showDetails;
+        });
+      }
+    };
+  });
 
-auroraUI.directive('taskLink', function () {
-  return {
-    restrict: 'C',
-    template: '<a class="span4" ng-href="/structdump/task/{{formatedValue}}" target="_self">' +
-      '{{formatedValue}}</a>'
-  };
-});
+  auroraUI.directive('taskLink', function () {
+    return {
+      restrict: 'C',
+      template: '<a class="span4" ng-href="/structdump/task/{{formatedValue}}" target="_self">' +
+        '{{formatedValue}}</a>'
+    };
+  });
 
-auroraUI.directive('schedulingDetail', function () {
-  return {
-    restrict: 'C'
-  };
-});
+  auroraUI.directive('schedulingDetail', function () {
+    return {
+      restrict: 'C'
+    };
+  });
 
-auroraUI.directive('groupSummary', function() {
-  return {
-    restrict: 'E',
-    templateUrl: '/groupSummary.html',
-    scope: {
-      'groups': '=',
-      'visibleGroups': '=?'
-    },
-    replace: true,
-    link: function(scope) {
-      scope.visibleGroups = scope.visibleGroups || [];
+  auroraUI.directive('groupSummary', function () {
+    return {
+      restrict: 'E',
+      templateUrl: '/groupSummary.html',
+      scope: {
+        'groups': '=',
+        'visibleGroups': '=?'
+      },
+      replace: true,
+      link: function (scope) {
+        scope.visibleGroups = scope.visibleGroups || [];
 
-      scope.toggleVisibleGroup = function(index) {
-        var i = _.indexOf(scope.visibleGroups, index, true);
-        if (i > -1) {
-          scope.visibleGroups.splice(i, 1);
-        } else {
-          scope.visibleGroups.push(index);
-          scope.visibleGroups.sort();
-        }
-      }
+        scope.toggleVisibleGroup = function (index) {
+          var i = _.indexOf(scope.visibleGroups, index, true);
+          if (i > -1) {
+            scope.visibleGroups.splice(i, 1);
+          } else {
+            scope.visibleGroups.push(index);
+            scope.visibleGroups.sort();
+          }
+        };
 
-      scope.showAllGroups = function() {
-        scope.visibleGroups = _.range(scope.groups.length);
-      }
+        scope.showAllGroups = function () {
+          scope.visibleGroups = _.range(scope.groups.length);
+        };
 
-      scope.hideAllGroups = function() {
-        scope.visibleGroups = [];
+        scope.hideAllGroups = function () {
+          scope.visibleGroups = [];
+        };
       }
-    }
-  };
-});
+    };
+  });
 
-auroraUI.directive('configSummary', function() {
-  return {
-    restrict: 'E',
-    scope: {
-      'group': '='
-    },
-    templateUrl: '/configSummary.html',
-    replace: true
-  }
-});
\ No newline at end of file
+  auroraUI.directive('configSummary', function () {
+    return {
+      restrict: 'E',
+      scope: {
+        'group': '='
+      },
+      templateUrl: '/configSummary.html',
+      replace: true
+    };
+  });
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/9fd8b555/src/main/resources/org/apache/aurora/scheduler/http/ui/js/filters.js
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/filters.js b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/filters.js
index a2aea4d..4c45ce1 100644
--- a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/filters.js
+++ b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/filters.js
@@ -13,71 +13,74 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-'use strict';
+(function () {
+  /* global auroraUI:false */
+  'use strict';
 
-auroraUI.filter('scheduleStatusTooltip', function () {
-  var STATES = {
-    PENDING: 'The scheduler is searching for a machine that satisfies the resources and '
-      + 'constraints for this task.',
+  auroraUI.filter('scheduleStatusTooltip', function () {
+    var STATES = {
+      PENDING: 'The scheduler is searching for a machine that satisfies the resources and ' +
+        'constraints for this task.',
 
-    THROTTLED: 'The task will be rescheduled, but is being throttled for restarting too '
-      + 'frequently.',
+      THROTTLED: 'The task will be rescheduled, but is being throttled for restarting too ' +
+        'frequently.',
 
-    ASSIGNED: 'The scheduler has selected a machine to run the task and is instructing the '
-      + 'slave to launch it.',
+      ASSIGNED: 'The scheduler has selected a machine to run the task and is instructing the ' +
+        'slave to launch it.',
 
-    STARTING: 'The executor is preparing to launch the task.',
-    RUNNING: 'The user process(es) are running.',
-    FAILED: 'The task ran, but did not exit indicating success.',
-    FINISHED: 'The task ran and exited successfully.',
-    KILLED: 'A user or cron invocation terminated the task.',
-    PREEMPTING: 'This task is being killed to make resources available for a production task.',
-    KILLING: 'A user request or cron invocation has requested the task be killed.',
-    LOST: 'The task cannot be accounted for, usually a result of slave process or machine '
-      + 'failure.',
-    DRAINING: 'The task is being restarted since the host is undergoing scheduled maintenance.',
-    SANDBOX_DELETED: 'The task sandbox has been deleted by the executor.'
-  };
+      STARTING: 'The executor is preparing to launch the task.',
+      RUNNING: 'The user process(es) are running.',
+      FAILED: 'The task ran, but did not exit indicating success.',
+      FINISHED: 'The task ran and exited successfully.',
+      KILLED: 'A user or cron invocation terminated the task.',
+      PREEMPTING: 'This task is being killed to make resources available for a production task.',
+      KILLING: 'A user request or cron invocation has requested the task be killed.',
+      LOST: 'The task cannot be accounted for, usually a result of slave process or machine ' +
+        'failure.',
+      DRAINING: 'The task is being restarted since the host is undergoing scheduled maintenance.',
+      SANDBOX_DELETED: 'The task sandbox has been deleted by the executor.'
+    };
 
-  return function (value) {
-    return STATES[value] ? STATES[value] : value;
-  };
-});
+    return function (value) {
+      return STATES[value] ? STATES[value] : value;
+    };
+  });
 
-auroraUI.filter('scaleMb', function () {
-  var SCALE = ['MiB', 'GiB', 'TiB', 'PiB', 'EiB'];
+  auroraUI.filter('scaleMb', function () {
+    var SCALE = ['MiB', 'GiB', 'TiB', 'PiB', 'EiB'];
 
-  return function (sizeInMb) {
-    var size = sizeInMb;
-    var unit = 0;
-    while (size >= 1024 && unit < SCALE.length) {
-      size = size / 1024;
-      unit++;
-    }
-    return size.toFixed(2).toString() + ' ' + SCALE[unit];
-  };
-});
+    return function (sizeInMb) {
+      var size = sizeInMb;
+      var unit = 0;
+      while (size >= 1024 && unit < SCALE.length) {
+        size = size / 1024;
+        unit++;
+      }
+      return size.toFixed(2).toString() + ' ' + SCALE[unit];
+    };
+  });
 
-auroraUI.filter('toCores', function () {
-  return  function (count) {
-    return count + ' cores';
-  };
-});
+  auroraUI.filter('toCores', function () {
+    return  function (count) {
+      return count + ' cores';
+    };
+  });
 
-auroraUI.filter('toElapsedTime', function () {
-  return function (timestamp) {
-    return moment.duration(moment().valueOf() - timestamp).humanize();
-  };
-});
+  auroraUI.filter('toElapsedTime', function () {
+    return function (timestamp) {
+      return moment.duration(moment().valueOf() - timestamp).humanize();
+    };
+  });
 
-auroraUI.filter('toUtcTime', function () {
-  return function (timestamp, timezone) {
-    return moment(timestamp).utc().format('MM/DD h:mm:ss') + ' UTC';
-  };
-});
+  auroraUI.filter('toUtcTime', function () {
+    return function (timestamp, timezone) {
+      return moment(timestamp).utc().format('MM/DD h:mm:ss') + ' UTC';
+    };
+  });
 
-auroraUI.filter('toLocalTime', function () {
-  return function (timestamp, timezone) {
-    return moment(timestamp).format('MM/DD h:mm:ss') + ' LOCAL';
-  };
-});
\ No newline at end of file
+  auroraUI.filter('toLocalTime', function () {
+    return function (timestamp, timezone) {
+      return moment(timestamp).format('MM/DD h:mm:ss') + ' LOCAL';
+    };
+  });
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/9fd8b555/src/main/resources/org/apache/aurora/scheduler/http/ui/js/services.js
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/services.js b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/services.js
index f984956..360f134 100644
--- a/src/main/resources/org/apache/aurora/scheduler/http/ui/js/services.js
+++ b/src/main/resources/org/apache/aurora/scheduler/http/ui/js/services.js
@@ -13,252 +13,262 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-'use strict';
+(function () {
+  /* global auroraUI:false, Identity:false, TaskQuery:false, ReadOnlySchedulerClient:false,
+            ACTIVE_STATES:false, CronCollisionPolicy: false */
+  'use strict';
 
-auroraUI.factory(
-  'auroraClient',
-  ['$window',
-    function ($window) {
-      var auroraClient = {
-        // Each of the functions below wrap an API call on the scheduler.
-        getRoleSummary: function () {
-          var response = auroraClient.getSchedulerClient().getRoleSummary();
-          var result = auroraClient.processResponse(response);
-          result.summaries = response.result !== null
-            ? response.result.roleSummaryResult.summaries : [];
-          return result;
-        },
+  auroraUI.factory(
+    'auroraClient',
+    ['$window',
+      function ($window) {
+        var auroraClient = {
+          // Each of the functions below wrap an API call on the scheduler.
+          getRoleSummary: function () {
+            var response = auroraClient.getSchedulerClient().getRoleSummary();
+            var result = auroraClient.processResponse(response);
+            result.summaries = response.result !== null ?
+              response.result.roleSummaryResult.summaries : [];
+            return result;
+          },
 
-        getJobSummary: function (role) {
-          var response = auroraClient.getSchedulerClient().getJobSummary(role);
-          var result = auroraClient.processResponse(response);
-          result.jobs = response.result !== null ? response.result.jobSummaryResult.summaries : [];
-          return result;
-        },
+          getJobSummary: function (role) {
+            var response = auroraClient.getSchedulerClient().getJobSummary(role);
+            var result = auroraClient.processResponse(response);
+            result.jobs = response.result !== null ?
+              response.result.jobSummaryResult.summaries : [];
+            return result;
+          },
 
-        getQuota: function (role) {
-          var response = auroraClient.getSchedulerClient().getQuota(role);
-          var result = auroraClient.processResponse(response);
-          result.quota = response.result !== null ? response.result.getQuotaResult : [];
-          return result;
-        },
+          getQuota: function (role) {
+            var response = auroraClient.getSchedulerClient().getQuota(role);
+            var result = auroraClient.processResponse(response);
+            result.quota = response.result !== null ? response.result.getQuotaResult : [];
+            return result;
+          },
 
-        getTasks: function (role, environment, jobName) {
-          var id = new Identity();
-          id.role = role;
-          var taskQuery = new TaskQuery();
-          taskQuery.owner = id;
-          taskQuery.environment = environment;
-          taskQuery.jobName = jobName;
-          var response = auroraClient.getSchedulerClient().getTasksStatus(taskQuery);
-          var result = auroraClient.processResponse(response);
-          result.tasks = response.result !== null ? response.result.scheduleStatusResult.tasks : [];
-          return result;
-        },
+          getTasks: function (role, environment, jobName) {
+            var id = new Identity();
+            id.role = role;
+            var taskQuery = new TaskQuery();
+            taskQuery.owner = id;
+            taskQuery.environment = environment;
+            taskQuery.jobName = jobName;
+            var response = auroraClient.getSchedulerClient().getTasksStatus(taskQuery);
+            var result = auroraClient.processResponse(response);
+            result.tasks = response.result !== null ?
+              response.result.scheduleStatusResult.tasks : [];
+            return result;
+          },
 
-        // Utility functions
-        // TODO(Suman Karumuri): Make schedulerClient a service
-        schedulerClient: null,
+          // Utility functions
+          // TODO(Suman Karumuri): Make schedulerClient a service
+          schedulerClient: null,
 
-        getSchedulerClient: function () {
-          if (!auroraClient.schedulerClient) {
-            var transport = new Thrift.Transport("/api");
-            var protocol = new Thrift.Protocol(transport);
-            auroraClient.schedulerClient = new ReadOnlySchedulerClient(protocol);
-            return auroraClient.schedulerClient;
-          } else {
-            return auroraClient.schedulerClient;
+          getSchedulerClient: function () {
+            if (!auroraClient.schedulerClient) {
+              var transport = new Thrift.Transport('/api');
+              var protocol = new Thrift.Protocol(transport);
+              auroraClient.schedulerClient = new ReadOnlySchedulerClient(protocol);
+              return auroraClient.schedulerClient;
+            } else {
+              return auroraClient.schedulerClient;
+            }
+          },
+
+          processResponse: function (response) {
+            auroraClient.setPageTitle(response.serverInfo);
+            var error = response.responseCode !== 1 ?
+                (response.message || 'No error message returned by the scheduler') : '',
+              statsUrlPrefix = response.serverInfo && response.serverInfo.statsUrlPrefix ?
+                response.serverInfo.statsUrlPrefix : '';
+
+            return {
+              error: error,
+              statsUrlPrefix: statsUrlPrefix
+            };
+          },
+
+          getPageTitle: function (info) {
+            var title = 'Aurora UI';
+            if (_.isNull(info) || info.error || typeof info.clusterName === 'undefined') {
+              return title;
+            } else {
+              return '[' + info.clusterName + '] ' + title;
+            }
+          },
+
+          setPageTitle: function (serverInfo) {
+            $window.document.title = auroraClient.getPageTitle(serverInfo);
           }
+        };
+        return auroraClient;
+      }
+    ]);
+
+  auroraUI.factory(
+    'taskUtil',
+    function () {
+      var taskUtil = {
+        // Given a list of tasks, group tasks with identical task configs and belonging to
+        // contiguous instance ids together.
+        summarizeActiveTaskConfigs: function (tasks) {
+          return _.chain(tasks)
+            .filter(taskUtil.isActiveTask)
+            .map(function (task) {
+              return {
+                instanceId: task.assignedTask.instanceId,
+                schedulingDetail: taskUtil.configToDetails(task.assignedTask.task)
+              };
+            })
+            .groupBy(function (task) {
+              return JSON.stringify(task.schedulingDetail);
+            })
+            .map(function (tasks) {
+              // Given a list of tasks with the same task config, group the tasks into ranges where
+              // each range consists of consecutive task ids along with their task config.
+              var schedulingDetail = _.first(tasks).schedulingDetail;
+              var ranges = taskUtil.toRanges(_.pluck(tasks, 'instanceId'));
+              return _.map(ranges, function (range) {
+                return {
+                  range: range,
+                  schedulingDetail: schedulingDetail
+                };
+              });
+            })
+            .flatten(true)
+            .sortBy(function (scheduleDetail) {
+              return scheduleDetail.range.start;
+            })
+            .value();
         },
 
-        processResponse: function (response) {
-          auroraClient.setPageTitle(response.serverInfo);
+        configToDetails: function (task) {
+          var constraints = _.chain(task.constraints)
+            .sortBy(function (constraint) {
+              return constraint.name;
+            })
+            .map(taskUtil.formatConstraint)
+            .value()
+            .join(', ');
+
+          var metadata = _.chain(task.metadata)
+            .sortBy(function (metadata) {
+              return metadata.key;
+            })
+            .map(function (metadata) {
+              return metadata.key + ':' + metadata.value;
+            })
+            .value()
+            .join(', ');
+
           return {
-            error: response.responseCode !== 1
-              ? (response.message || 'No error message returned by the scheduler')
-              : '',
-            statsUrlPrefix: response.serverInfo && response.serverInfo.statsUrlPrefix
-              ? response.serverInfo.statsUrlPrefix
-              : ''
+            numCpus: task.numCpus,
+            ramMb: task.ramMb,
+            diskMb: task.diskMb,
+            isService: task.isService,
+            production: task.production,
+            contact: task.contactEmail || '',
+            ports: _.sortBy(task.requestedPorts).join(', '),
+            constraints: constraints,
+            metadata: metadata
           };
         },
 
-        getPageTitle: function (info) {
-          var title = "Aurora UI";
-          return _.isNull(info) || info.error || typeof info.clusterName === "undefined"
-            ? title
-            : info.clusterName + " " + title;
+        // Given a list of instanceIds, group them into contiguous ranges.
+        toRanges: function (instanceIds) {
+          instanceIds = _.sortBy(instanceIds);
+          var ranges = [];
+          var i = 0;
+          var start = instanceIds[i];
+          while (i < instanceIds.length) {
+            if ((i + 1 === instanceIds.length) || (instanceIds[i] + 1 !== instanceIds[i + 1])) {
+              ranges.push({start: start, end: instanceIds[i]});
+              i++;
+              start = instanceIds[i];
+            } else {
+              i++;
+            }
+          }
+          return ranges;
         },
 
-        setPageTitle: function (serverInfo) {
-          $window.document.title = auroraClient.getPageTitle(serverInfo);
-        }
-      };
-      return auroraClient;
-    }
-  ]);
+        // A function that converts a task constraint into a string
+        formatConstraint: function (constraint) {
+          var taskConstraint = constraint.constraint;
 
-auroraUI.factory(
-  'taskUtil',
-  function () {
-    var taskUtil = {
-      // Given a list of tasks, group tasks with identical task configs and belonging to contiguous
-      // instance ids together.
-      summarizeActiveTaskConfigs: function (tasks) {
-        return _.chain(tasks)
-          .filter(taskUtil.isActiveTask)
-          .map(function (task) {
-            return {
-              instanceId: task.assignedTask.instanceId,
-              schedulingDetail: taskUtil.configToDetails(task.assignedTask.task)
-            };
-          })
-          .groupBy(function (task) {
-            return JSON.stringify(task.schedulingDetail);
-          })
-          .map(function (tasks) {
-            // Given a list of tasks with the same task config, group the tasks into ranges where
-            // each range consists of consecutive task ids along with their task config.
-            var schedulingDetail = _.first(tasks).schedulingDetail;
-            var ranges = taskUtil.toRanges(_.pluck(tasks, 'instanceId'));
-            return _.map(ranges, function (range) {
-              return {
-                range: range,
-                schedulingDetail: schedulingDetail
-              }
-            });
-          })
-          .flatten(true)
-          .sortBy(function (scheduleDetail) {
-            return scheduleDetail.range.start;
-          })
-          .value();
-      },
-
-      configToDetails: function (task) {
-        var constraints = _.chain(task.constraints)
-          .sortBy(function (constraint) {
-            return constraint.name;
-          })
-          .map(taskUtil.formatConstraint)
-          .value()
-          .join(', ');
-
-        var metadata = _.chain(task.metadata)
-          .sortBy(function (metadata) {
-            return metadata.key;
-          })
-          .map(function (metadata) {
-            return metadata.key + ':' + metadata.value;
-          })
-          .value()
-          .join(', ');
+          var valueConstraintStr = '';
+          var valueConstraint = taskConstraint.value;
+          if (valueConstraint && valueConstraint.values && _.isArray(valueConstraint.values)) {
+            var values = valueConstraint.values.join(',');
+            valueConstraintStr = valueConstraint.negated ? 'not ' + values : values;
+          }
 
-        return {
-          numCpus: task.numCpus,
-          ramMb: task.ramMb,
-          diskMb: task.diskMb,
-          isService: task.isService,
-          production: task.production,
-          contact: task.contactEmail || '',
-          ports: _.sortBy(task.requestedPorts).join(', '),
-          constraints: constraints,
-          metadata: metadata
-        };
-      },
+          var limitConstraintStr = taskConstraint.limit ? JSON.stringify(taskConstraint.limit) : '';
 
-      // Given a list of instanceIds, group them into contiguous ranges.
-      toRanges: function (instanceIds) {
-        instanceIds = _.sortBy(instanceIds);
-        var ranges = [];
-        var i = 0;
-        var start = instanceIds[i];
-        var end = instanceIds[i];
-        while (i < instanceIds.length) {
-          if ((i + 1 === instanceIds.length) || (instanceIds[i] + 1 !== instanceIds[i + 1])) {
-            ranges.push({start: start, end: instanceIds[i]});
-            i++;
-            start = instanceIds[i];
+          if (_.isEmpty(limitConstraintStr) && _.isEmpty(valueConstraintStr)) {
+            return '';
           } else {
-            i++;
+            return constraint.name + ':' +
+              (_.isEmpty(limitConstraintStr) ? valueConstraintStr : limitConstraintStr);
           }
-        }
-        return ranges;
-      },
-
-      // A function that converts a task constraint into a string
-      formatConstraint: function (constraint) {
-        var taskConstraint = constraint.constraint;
-
-        var valueConstraintStr = '';
-        var valueConstraint = taskConstraint.value;
-        if (valueConstraint && valueConstraint.values && _.isArray(valueConstraint.values)) {
-          var values = valueConstraint.values.join(',');
-          valueConstraintStr = valueConstraint.negated ? "not " + values : values;
-        }
-
-        var limitConstraintStr = taskConstraint.limit ? JSON.stringify(taskConstraint.limit) : '';
+        },
 
-        if (_.isEmpty(limitConstraintStr) && _.isEmpty(valueConstraintStr)) {
-          return '';
-        } else {
-          return constraint.name + ':' +
-            (_.isEmpty(limitConstraintStr) ? valueConstraintStr : limitConstraintStr);
+        isActiveTask: function (task) {
+          return _.contains(ACTIVE_STATES, task.status);
         }
-      },
-
-      isActiveTask: function (task) {
-        return _.contains(ACTIVE_STATES, task.status);
-      }
-    };
-    return taskUtil;
-  });
+      };
+      return taskUtil;
+    });
 
-auroraUI.factory(
-  'cronJobSummaryService',
-  [ 'auroraClient',
-    function (auroraClient) {
-      var cronJobSmrySvc = {
-        getCronJobSummary: function (role, env, jobName) {
-          var summaries = auroraClient.getJobSummary(role);
+  auroraUI.factory(
+    'cronJobSummaryService',
+    [ 'auroraClient',
+      function (auroraClient) {
+        var cronJobSmrySvc = {
+          getCronJobSummary: function (role, env, jobName) {
+            var summaries = auroraClient.getJobSummary(role);
 
-          if (summaries.error) {
-            return {error: 'Failed to fetch cron schedule from scheduler.'};
-          }
+            if (summaries.error) {
+              return {error: 'Failed to fetch cron schedule from scheduler.'};
+            }
 
-          var cronJobSummary = _.chain(summaries.jobs)
-            .filter(function (summary) {
-              // fetch the cron job with a matching name and env.
-              var job = summary.job;
-              return job.cronSchedule !== null
-                && job.key.environment === env
-                && job.taskConfig.jobName === jobName;
-            })
-            .map(function (summary) {
-              // summarize the cron job.
-              return {
-                tasks: summary.job.instanceCount,
-                schedule: summary.job.cronSchedule,
-                nextCronRun: summary.nextCronRunMs,
-                collisionPolicy: cronJobSmrySvc.getCronCollisionPolicy(summary.job.cronCollisionPolicy),
-                metadata: cronJobSmrySvc.getMetadata(summary.job.taskConfig.metadata)
-              };
-            })
-            .last() // there will always be 1 job in this list.
-            .value();
+            var cronJobSummary = _.chain(summaries.jobs)
+              .filter(function (summary) {
+                // fetch the cron job with a matching name and env.
+                var job = summary.job;
+                return job.cronSchedule !== null &&
+                  job.key.environment === env &&
+                  job.taskConfig.jobName === jobName;
+              })
+              .map(function (summary) {
+                var collisionPolicy =
+                  cronJobSmrySvc.getCronCollisionPolicy(summary.job.cronCollisionPolicy);
+                // summarize the cron job.
+                return {
+                  tasks: summary.job.instanceCount,
+                  schedule: summary.job.cronSchedule,
+                  nextCronRun: summary.nextCronRunMs,
+                  collisionPolicy: collisionPolicy,
+                  metadata: cronJobSmrySvc.getMetadata(summary.job.taskConfig.metadata)
+                };
+              })
+              .last() // there will always be 1 job in this list.
+              .value();
 
-          return {error: '', cronJobSummary: cronJobSummary}
-        },
+            return {error: '', cronJobSummary: cronJobSummary};
+          },
 
-        getMetadata: function (attributes) {
-          return _.map(attributes,function (attribute) {
-            return attribute.key + ': ' + attribute.value;
-          }).join(', ');
-        },
+          getMetadata: function (attributes) {
+            return _.map(attributes, function (attribute) {
+              return attribute.key + ': ' + attribute.value;
+            }).join(', ');
+          },
 
-        getCronCollisionPolicy: function (cronCollisionPolicy) {
-          return _.keys(CronCollisionPolicy)[cronCollisionPolicy ? cronCollisionPolicy : 0];
-        }
-      };
-      return cronJobSmrySvc;
-    }]);
+          getCronCollisionPolicy: function (cronCollisionPolicy) {
+            return _.keys(CronCollisionPolicy)[cronCollisionPolicy ? cronCollisionPolicy : 0];
+          }
+        };
+        return cronJobSmrySvc;
+      }]);
+})();
\ No newline at end of file