You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by dm...@apache.org on 2017/10/25 17:15:31 UTC

[02/36] aurora git commit: Remove the old UI and serve the new UI instead

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/js/controllers.js
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/js/controllers.js b/src/main/resources/scheduler/assets/js/controllers.js
deleted file mode 100644
index f7ebe6c..0000000
--- a/src/main/resources/scheduler/assets/js/controllers.js
+++ /dev/null
@@ -1,495 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-(function () {
-  /* global JobUpdateKey:false, JobUpdateQuery:false, JobKey: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'
-  };
-
-  var REFRESH_RATES = {
-    IN_PROGRESS_UPDATE_MS: 15000,
-    COMPLETED_UPDATES_MS: 60000
-  };
-
-  auroraUIControllers.controller('RoleSummaryController',
-    function ($scope, auroraClient) {
-      $scope.error = '';
-
-      auroraClient.getRoleSummary().then(function (roleSummaries) {
-        $scope.roleSummaries = parseResponse(roleSummaries);
-
-        $scope.roleSummaryColumns = [
-          {label: 'Role', map: 'role', cellTemplateUrl: '/assets/roleLink.html'},
-          {label: 'Jobs', map: 'jobCount'},
-          {label: 'Cron Jobs', map: 'cronJobCount'}
-        ];
-
-        function parseResponse(response) {
-          $scope.error = response.error ? 'Error requesting role summary: ' + response.error : '';
-
-          if ($scope.error) {
-            return [];
-          }
-
-          // 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.roleSummaryTableConfig = infoTableConfig;
-        $scope.roleSummaryTableConfig.columnSpan = $scope.roleSummaryColumns.length;
-      });
-    });
-
-  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: '/assets/roleEnvLink.html'},
-        {label: 'Job', map: 'jobName', cellTemplateUrl: '/assets/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.jobsTableConfig = infoTableConfig;
-      $scope.jobsTableConfig.columnSpan = $scope.jobsTableColumns.length;
-
-      function getJobType(job) {
-        if (job.taskConfig.isService) {
-          return 'service';
-        }
-
-        if (job.cronSchedule !== null) {
-          return 'cron';
-        }
-
-        return 'adhoc';
-      }
-
-      function getJobs(summaries) {
-        $scope.error = summaries.error ? 'Error fetching job summaries: ' + summaries.error : '';
-
-        if ($scope.error) {
-          return [];
-        }
-
-        var jobSummaries = summaries.jobs;
-
-        if ($scope.environment) {
-          jobSummaries = _.filter(jobSummaries, function (summary) {
-            return summary.job.key.environment === $scope.environment;
-          });
-        }
-
-        var byJobName = function (summary) {
-          return summary.jobName;
-        };
-
-        return _.chain(jobSummaries)
-          .map(function (summary) {
-            return {
-              role: $scope.role, // required for roleEnvLink directive
-              environment: summary.job.key.environment,
-              jobName: summary.job.key.name,
-              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();
-      }
-
-      auroraClient.getJobSummary($scope.role).then(function (summaries) {
-        $scope.jobs = getJobs(summaries);
-      });
-
-    });
-
-  auroraUIControllers.controller('QuotaController',
-    function ($scope, $filter, auroraClient) {
-      $scope.error = '';
-
-      $scope.resourcesTableConfig = summaryTableConfig;
-
-
-      auroraClient.getQuota($scope.role).then(function (quotaResponse) {
-        $scope.resources = getQuota(quotaResponse);
-        $scope.resourcesTableColumns = [
-          {label: '', map: 'resource'},
-          {label: 'CPU', map: 'cpus'},
-          {label: 'RAM', map: 'ram'},
-          {label: 'Disk', map: 'disk'}
-        ];
-      });
-
-      function getQuota(quotaResponse) {
-        $scope.error = quotaResponse.error ? 'Error fetching quota: ' + quotaResponse.error : '';
-
-        if ($scope.error) {
-          return [];
-        }
-
-        function addResourceVector(name, vector) {
-          var consumption = quotaResponse.quota;
-          return {
-            resource: name,
-            cpus: $filter('toResourceValue')(consumption[vector].resources, 'CPUS'),
-            ram: $filter('toResourceValue')(consumption[vector].resources, 'RAM_MB'),
-            disk: $filter('toResourceValue')(consumption[vector].resources, 'DISK_MB')
-          };
-        }
-
-        return [
-          addResourceVector('Quota', 'quota'),
-          addResourceVector('Quota Consumption', 'prodSharedConsumption'),
-          addResourceVector('Production Dedicated Consumption', 'prodDedicatedConsumption'),
-          addResourceVector('Non-Production Consumption', 'nonProdSharedConsumption'),
-          addResourceVector('Non-Production Dedicated Consumption', 'nonProdDedicatedConsumption')
-        ];
-      }
-    }
-  );
-
-  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 = [];
-
-      cronJobSummaryService.getCronJobSummary($scope.role, $scope.environment,
-       $scope.job).then(function (cronJobSummary) {
-        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);
-
-          $scope.cronJobSummary = [cronJobSummary.cronJobSummary];
-        }
-      });
-    }
-  );
-
-  auroraUIControllers.controller('AllUpdatesController',
-    function ($scope, $timeout, auroraClient, updateUtil) {
-
-      function inProgressUpdates() {
-        // fetch any in progress updates
-        auroraClient.getJobUpdateSummaries(updateUtil.getInProgressQuery())
-          .then(function (response) {
-            $scope.inProgressUpdates = response.summaries;
-            $timeout(function () { inProgressUpdates(); }, REFRESH_RATES.IN_PROGRESS_UPDATE_MS);
-          });
-      }
-
-      function completedUpdates() {
-        // fetch the latest 20 finished updates
-        var finishedQuery = updateUtil.getTerminalQuery();
-        finishedQuery.limit = 20;
-
-        auroraClient.getJobUpdateSummaries(finishedQuery).then(function (response) {
-          $scope.completedUpdates = response.summaries;
-          $timeout(function () { completedUpdates(); }, REFRESH_RATES.COMPLETED_UPDATES_MS);
-        });
-      }
-
-      inProgressUpdates();
-      completedUpdates();
-    }
-  );
-
-  auroraUIControllers.controller('UpdateController',
-    function ($scope, $routeParams, $timeout, auroraClient, updateUtil) {
-      var updateKey = new JobUpdateKey();
-      updateKey.job = new JobKey();
-      updateKey.job.role = $routeParams.role;
-      updateKey.job.environment = $routeParams.environment;
-      updateKey.job.name = $routeParams.job;
-      updateKey.id = $routeParams.update;
-
-      $scope.role = $routeParams.role;
-      $scope.environment = $routeParams.environment;
-      $scope.job = $routeParams.job;
-
-      $scope.instanceSummary = [];
-
-      var getUpdateProgress = function () {
-        auroraClient.getJobUpdateDetails(updateKey).then(function (response) {
-          $scope.update = response.details;
-          $scope.inProgress = updateUtil.isInProgress($scope.update.update.summary.state.status);
-
-          var duration = $scope.update.update.summary.state.lastModifiedTimestampMs -
-            $scope.update.update.summary.state.createdTimestampMs;
-
-          $scope.duration = moment.duration(duration).humanize();
-
-          $scope.stats = updateUtil.getUpdateStats($scope.update);
-          $scope.configJson = JSON
-            .stringify($scope.update.update.instructions.desiredState.task, undefined, 2);
-
-          // pagination for instance events
-          var instanceEvents = $scope.instanceEvents = $scope.update.instanceEvents;
-          $scope.eventsPerPage = 10;
-          $scope.changeInstancePage = function () {
-            var start = ($scope.currentPage - 1) * $scope.eventsPerPage;
-            var end   = start + $scope.eventsPerPage;
-            $scope.instanceEvents = instanceEvents.slice(start, end);
-          };
-          $scope.totalEvents = instanceEvents.length;
-          $scope.currentPage = 1;
-          $scope.changeInstancePage();
-
-          // Instance summary display.
-          $scope.instanceSummary = updateUtil.fillInstanceSummary($scope.update, $scope.stats);
-
-          if ($scope.instanceSummary.length <= 20) {
-            $scope.instanceGridSize = 'big';
-          } else if ($scope.instanceSummary.length <= 1000) {
-            $scope.instanceGridSize = 'medium';
-          } else {
-            $scope.instanceGridSize = 'small';
-          }
-
-          // Poll for updates while this update is in progress.
-          if ($scope.inProgress) {
-            $timeout(function () {
-              getUpdateProgress();
-            }, REFRESH_RATES.IN_PROGRESS_UPDATE_MS);
-          }
-        });
-      };
-
-      getUpdateProgress();
-    }
-  );
-
-  function initializeJobController($scope, $routeParams) {
-    $scope.error = '';
-
-    $scope.role = $routeParams.role;
-    $scope.environment = $routeParams.environment;
-    $scope.job = $routeParams.job;
-    $scope.instance = $routeParams.instance;
-
-    // These two task arrays need to be initialized due to a quirk in SmartTable's behavior.
-    $scope.activeTasks = [];
-    $scope.completedTasks = [];
-    $scope.tasksReady = false;
-  }
-
-  function JobController(
-      $scope,
-      $routeParams,
-      $timeout,
-      $q,
-      $location,
-      auroraClient,
-      taskUtil,
-      updateUtil,
-      jobTasksService) {
-
-    initializeJobController($scope, $routeParams);
-
-    $scope.showTaskInfoLink = false;
-    $scope.jobDashboardUrl = '';
-
-    function setTabState(tab) {
-      $scope.isActive = tab === 'active';
-      $scope.isCompleted = tab === 'completed';
-      $scope.isAll = tab === 'all';
-    }
-
-    setTabState($location.search().tab || 'active');
-
-    $scope.toggleTaskInfoLinkVisibility = function () {
-      $scope.showTaskInfoLink = !$scope.showTaskInfoLink;
-
-      $scope.activeTasksTableColumns = $scope.showTaskInfoLink ?
-        jobTasksService.addColumn(
-          'Status',
-          jobTasksService.taskColumns,
-          jobTasksService.taskIdColumn) :
-        jobTasksService.taskColumns;
-
-      $scope.completedTasksTableColumns = $scope.showTaskInfoLink ?
-        jobTasksService.addColumn(
-          'Running duration',
-          jobTasksService.completedTaskColumns,
-          jobTasksService.taskIdColumn) :
-        jobTasksService.completedTaskColumns;
-    };
-
-    $scope.switchTab = function (tab) {
-      $location.search('tab', tab);
-      setTabState(tab);
-    };
-
-    jobTasksService.getTasksForJob($scope);
-
-    function buildGroupSummary(response) {
-      if (response.error) {
-        $scope.error = 'Error fetching configuration summary: ' + response.error;
-        return [];
-      }
-
-      var colors = [
-        'steelblue',
-        'darkseagreen',
-        'sandybrown',
-        'plum',
-        'khaki'
-      ];
-
-      var total = _.reduce(response.groups, function (m, n) {
-        return m + updateUtil.instanceCountFromRanges(n.instances);
-      }, 0);
-
-      $scope.groupSummary = response.groups.map(function (group, i) {
-        var count = updateUtil.instanceCountFromRanges(group.instances);
-        var percentage = (count / total) * 100;
-
-        var ranges = group.instances.map(function (r) {
-          return (r.first === r.last) ? r.first : r.first + '-' + r.last;
-        });
-
-        return {
-          label: ranges.join(', '),
-          value: count,
-          percentage: percentage,
-          summary: { schedulingDetail: taskUtil.configToDetails(group.config)},
-          color: colors[i % colors.length]
-        };
-      });
-    }
-
-    auroraClient.getConfigSummary($scope.role, $scope.environment, $scope.job)
-      .then(buildGroupSummary);
-
-    var query = new JobUpdateQuery();
-    query.jobKey = new JobKey({
-        role: $scope.role,
-        environment: $scope.environment,
-        name: $scope.job
-      });
-
-    auroraClient.getJobUpdateSummaries(query).then(getUpdatesForJob);
-
-    function getUpdatesForJob(response) {
-      $scope.updates = response.summaries;
-
-      function getUpdateInProgress() {
-        auroraClient.getJobUpdateDetails($scope.updates[0].key).then(function (response) {
-          $scope.updateInProgress = response.details;
-
-          $scope.updateStats = updateUtil.getUpdateStats($scope.updateInProgress);
-
-          if (updateUtil.isInProgress($scope.updateInProgress.update.summary.state.status)) {
-            // Poll for updates as long as this update is in progress.
-            $timeout(function () {
-              getUpdateInProgress();
-            }, REFRESH_RATES.IN_PROGRESS_UPDATE_MS);
-          }
-        });
-      }
-
-      if ($scope.updates.length > 0 && updateUtil.isInProgress($scope.updates[0].state.status)) {
-        getUpdateInProgress();
-      }
-    }
-
-  }
-
-  auroraUIControllers.controller('JobController', JobController);
-
-  var guidPattern = new RegExp(
-      /^[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}$/);
-
-  function JobInstanceController($scope, $routeParams, $location, jobTasksService) {
-    if (guidPattern.test($routeParams.instance)) {
-      $location.path(
-        [
-          'scheduler',
-          $routeParams.role,
-          $routeParams.environment,
-          $routeParams.job,
-          'update',
-          $routeParams.instance
-        ].join('/'));
-      return;
-    }
-
-    initializeJobController($scope, $routeParams);
-    jobTasksService.getTasksForJob($scope);
-
-    $scope.completedTasksTableColumns = $scope.completedTasksTableColumns.filter(function (column) {
-      return column.label !== 'Instance';
-    });
-
-    $scope.completedTasksTableColumns = jobTasksService.addColumn(
-        'Status',
-        $scope.completedTasksTableColumns,
-        jobTasksService.taskIdColumn);
-  }
-
-  auroraUIControllers.controller('JobInstanceController', JobInstanceController);
-})();

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/js/directives.js
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/js/directives.js b/src/main/resources/scheduler/assets/js/directives.js
deleted file mode 100644
index ef94ade..0000000
--- a/src/main/resources/scheduler/assets/js/directives.js
+++ /dev/null
@@ -1,225 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-(function () {
-  /*global auroraUI:false,JobUpdateStatus:false */
-  'use strict';
-
-  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('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: '/assets/breadcrumb.html'
-    };
-  });
-
-  auroraUI.directive('error', function () {
-    return {
-      restrict: 'E',
-      templateUrl: '/assets/error.html'
-    };
-  });
-
-  auroraUI.directive('taskSandboxLink', function () {
-    return {
-      restrict: 'E',
-      templateUrl: '/assets/taskSandbox.html'
-    };
-  });
-
-  auroraUI.directive('taskStatus', function () {
-    return {
-      restrict: 'E',
-      replace: true,
-      link: function (scope) {
-        scope.toggleShowDetails = function () {
-          scope.showDetails = !scope.showDetails;
-        };
-      }
-    };
-  });
-
-  auroraUI.directive('taskLink', function () {
-    return {
-      restrict: 'C',
-      template: '<a class="col-md-8" ng-href="/structdump/task/{{formatedValue}}" ' +
-        'target="_self">{{formatedValue}}</a>'
-    };
-  });
-
-  auroraUI.directive('schedulingDetail', function () {
-    return {
-      restrict: 'C'
-    };
-  });
-
-  auroraUI.directive('groupSummary', function () {
-    return {
-      restrict: 'E',
-      templateUrl: '/assets/groupSummary.html',
-      scope: {
-        'groups': '=',
-        'visibleGroups': '=?'
-      },
-      replace: true,
-      link: function (scope) {
-        scope.$watch('visibleGroups', function () {
-          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.showAllGroups = function () {
-            scope.visibleGroups = _.range(scope.groups.length);
-          };
-
-          scope.hideAllGroups = function () {
-            scope.visibleGroups = [];
-          };
-        });
-      }
-    };
-  });
-
-  auroraUI.directive('configSummary', function () {
-    return {
-      restrict: 'E',
-      scope: {
-        'group': '='
-      },
-      templateUrl: '/assets/configSummary.html',
-      replace: true
-    };
-  });
-
-  auroraUI.directive('timeDisplay', function () {
-    return {
-      restrict: 'E',
-      scope: {
-        'timestamp': '='
-      },
-      templateUrl: '/assets/timeDisplay.html'
-    };
-  });
-
-  auroraUI.directive('updateSettings', function () {
-    return {
-      restrict: 'E',
-      scope: {
-        'update': '='
-      },
-      templateUrl: '/assets/updateSettings.html'
-    };
-  });
-
-  auroraUI.directive('instanceSummary', function ($compile) {
-    var ABORTED = 'ABORTED';
-    var UPDATING = 'UPDATING';
-
-    return {
-      restrict: 'E',
-      scope: {
-        'instances': '=',
-        'size': '=',
-        'stats': '=',
-        'status': '='
-      },
-      link: function (scope, element, attrs) {
-        scope.$watch('instances', function () {
-          if (!scope.instances || scope.instances.length === 0) {
-            return;
-          }
-
-          var cssClasses = [ 'instance-grid', scope.size ];
-          var aborted = scope.status === JobUpdateStatus.ABORTED;
-          if (aborted) {
-            cssClasses.push(ABORTED.toLowerCase());
-          }
-
-          var parent = angular.element('<div></div>');
-          var list = angular.element('<ul class="instance-grid ' + scope.size + '"></ul>');
-
-          scope.instances.forEach(function (i) {
-            var n = i.instanceId;
-            var statuses = [ i.className.toUpperCase().replace(/^INSTANCE\-/, '') ];
-            if (aborted && statuses[0] === UPDATING) {
-              statuses.push(ABORTED);
-            }
-
-            list.append('<li class="' + i.className + '" tooltip="INSTANCE ' + n +
-              ': ' + statuses.join(', ') + '"><span class="instance-id">' + n +
-              '</span></li>');
-          });
-
-          var title = angular.element('<div class="instance-summary-title"></div>');
-          title.append('<span class="instance-title">Instance Status</span>');
-          title.append('<span class="instance-progress">' + scope.stats.instancesUpdatedSoFar +
-            ' / ' + scope.stats.totalInstancesToBeUpdated + ' (' + scope.stats.progress +
-            '%)<div>');
-
-          parent.append(title);
-          parent.append(list);
-          element.html(parent.html());
-          $compile(element)(scope);
-        }, true);
-      }
-    };
-  });
-
-  auroraUI.directive('latestUpdates', function () {
-    return {
-      restrict: 'E',
-      scope: {
-        'updates': '=',
-        'message': '@'
-      },
-      templateUrl: '/assets/latestUpdates.html'
-    };
-  });
-
-  auroraUI.directive('loadingFooter', function () {
-    return {
-      restrict: 'A',
-      templateUrl: '/assets/loadingFooter.html'
-    };
-  });
-})();

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/js/filters.js
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/js/filters.js b/src/main/resources/scheduler/assets/js/filters.js
deleted file mode 100644
index d372269..0000000
--- a/src/main/resources/scheduler/assets/js/filters.js
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-(function () {
-  /* global auroraUI:false, JobUpdateStatus: false, JobUpdateAction: 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.',
-
-      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 ' +
-        'agent 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 agent process or machine ' +
-        'failure.',
-      DRAINING: 'The task is being restarted since the host is undergoing scheduled maintenance.'
-    };
-
-    return function (value) {
-      return STATES[value] ? STATES[value] : value;
-    };
-  });
-
-  auroraUI.filter('toNiceStatus', function () {
-    var updateStatusLookup = _.invert(JobUpdateStatus);
-
-    var STATUS_MAP = {
-      'ROLLED_FORWARD': 'SUCCESS',
-      'ROLLING_FORWARD': 'IN PROGRESS',
-      'ROLLING_BACK': 'ROLLING BACK',
-      'ROLL_BACK_PAUSED': 'ROLL BACK PAUSED',
-      'ROLL_FORWARD_PAUSED': 'PAUSED',
-      'ROLLED_BACK': 'ROLLED BACK'
-    };
-
-    return function (status) {
-      status = updateStatusLookup[status] || 'UNKNOWN';
-      return STATUS_MAP.hasOwnProperty(status) ? STATUS_MAP[status] : status;
-    };
-  });
-
-  auroraUI.filter('toNiceAction', function () {
-    var instanceActionLookup = _.invert(JobUpdateAction);
-
-    return function (action) {
-      return (instanceActionLookup[action] || 'UNKNOWN')
-        .replace(/INSTANCE_/, '')
-        .replace(/_/g, ' ');
-    };
-  });
-
-  auroraUI.filter('toNiceRanges', function () {
-    return function (ranges) {
-      return ranges.sort(function (a, b) { return a.first - b.first; }).map(function (range) {
-        return range.first === range.last ? '' + range.first : range.first + '-' + range.last;
-      }).join(', ');
-    };
-  });
-
-  auroraUI.filter('toResourceValue', function () {
-    var SCALE = ['MiB', 'GiB', 'TiB', 'PiB', 'EiB'];
-
-    function formatMem(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 (resources, type) {
-      var RESOURCE_MAP = {
-        'CPUS': {
-          field: 'numCpus',
-          format: function (v) { return _.first(v)[this.field] + ' core(s)'; }
-        },
-        'RAM_MB': {
-          field: 'ramMb',
-          format: function (v) { return formatMem(_.first(v)[this.field]); }
-        },
-        'DISK_MB': {
-          field: 'diskMb',
-          format: function (v) { return formatMem(_.first(v)[this.field]); }
-        },
-        'PORTS': {
-          field: 'namedPort',
-          format: function (v) {
-            var field = this.field;
-            return _.chain(v)
-                .map(function (r) { return r[field]; })
-                .sortBy()
-                .value()
-                .join(', ');
-          }
-        },
-        'GPUS': {
-          field: 'numGpus',
-          format: function (v) { return _.first(v)[this.field] + ' core(s)'; }
-        }
-      };
-
-      if (!type) {
-        return _.chain(resources)
-            .groupBy(function (r) {
-              for (var key in RESOURCE_MAP) {
-                var field = RESOURCE_MAP[key].field;
-                if (r.hasOwnProperty(field) && r[field] !== null) {
-                  return field;
-                }
-              }
-              return null;
-            })
-            .size()
-            .value();
-      } else if (RESOURCE_MAP.hasOwnProperty(type)) {
-        var field = RESOURCE_MAP[type].field;
-        var match = _.filter(resources, function (r) { return r[field] !== null; });
-        if (match && !_.isEmpty(match)) {
-          return RESOURCE_MAP[type].format(match);
-        }
-      }
-
-      return '';
-    };
-  });
-
-  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 HH:mm:ss') + ' UTC';
-    };
-  });
-
-  auroraUI.filter('toLocalTime', function () {
-    return function (timestamp, timezone) {
-      return moment(timestamp).format('MM/DD HH:mm:ss') + ' LOCAL';
-    };
-  });
-
-  auroraUI.filter('toLocalDay', function () {
-    return function (timestamp) {
-      return moment(timestamp).format('ddd, MMM Do');
-    };
-  });
-
-  auroraUI.filter('toLocalTimeOnly', function () {
-    return function (timestamp) {
-      return moment(timestamp).format('HH:mm');
-    };
-  });
-
-})();

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/js/services.js
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/js/services.js b/src/main/resources/scheduler/assets/js/services.js
deleted file mode 100644
index 0818fc2..0000000
--- a/src/main/resources/scheduler/assets/js/services.js
+++ /dev/null
@@ -1,705 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-(function () {
-  /* global
-    auroraUI:false,
-    ACTIVE_STATES:false,
-    ACTIVE_JOB_UPDATE_STATES: false,
-    CronCollisionPolicy: false,
-    JobKey: false,
-    JobUpdateQuery:false,
-    JobUpdateAction:false,
-    JobUpdateStatus: false,
-    ReadOnlySchedulerClient:false,
-    ScheduleStatus: false,
-    TaskQuery:false
-  */
-  'use strict';
-
-  function makeJobTaskQuery(role, environment, jobName, instance) {
-    var taskQuery = new TaskQuery();
-    taskQuery.role = role;
-    taskQuery.environment = environment;
-    taskQuery.jobName = jobName;
-
-    if (instance) {
-      taskQuery.instanceIds = [ instance ];
-    }
-
-    return taskQuery;
-  }
-
-  auroraUI.factory(
-    'auroraClient',
-    ['$window', '$q', '$rootScope',
-      function ($window, $q, $rootScope) {
-
-        function async(fn) {
-          var deferred = $q.defer();
-          fn(deferred);
-          return deferred.promise;
-        }
-
-        var auroraClient = {
-          // Each of the functions below wrap an API call on the scheduler.
-          getRoleSummary: function () {
-            return async(function (deferred) {
-              auroraClient.getSchedulerClient().getRoleSummary(function (response) {
-                var result = auroraClient.processResponse(response);
-                result.summaries = response.result !== null ?
-                  response.result.roleSummaryResult.summaries : [];
-                deferred.resolve(result);
-              });
-            });
-          },
-
-          getJobSummary: function (role) {
-            return async(function (deferred) {
-              auroraClient.getSchedulerClient().getJobSummary(role, function (response) {
-                var result = auroraClient.processResponse(response);
-                result.jobs = response.result !== null ?
-                  response.result.jobSummaryResult.summaries : [];
-                deferred.resolve(result);
-              });
-            });
-          },
-
-          getQuota: function (role) {
-            return async(function (deferred) {
-              auroraClient.getSchedulerClient().getQuota(role, function (response) {
-                var result = auroraClient.processResponse(response);
-                result.quota = response.result !== null ? response.result.getQuotaResult : [];
-                deferred.resolve(result);
-              });
-            });
-          },
-
-          getTasksWithoutConfigs: function (role, environment, jobName, instance) {
-            var query = makeJobTaskQuery(role, environment, jobName, instance);
-
-            return async(function (deferred) {
-              var tasksPromise = async(function (d1) {
-                auroraClient.getSchedulerClient().getTasksWithoutConfigs(query, function (rsp) {
-                  var result = auroraClient.processResponse(rsp);
-                  result.tasks = rsp.result !== null ?
-                    rsp.result.scheduleStatusResult.tasks : [];
-                  d1.resolve(result);
-                });
-              });
-
-              var pendingPromise = async(function (d2) {
-                auroraClient.getSchedulerClient().getPendingReason(query, function (response) {
-                  var reasons = response.result !== null ?
-                    response.result.getPendingReasonResult.reasons : [];
-                  d2.resolve(reasons);
-                });
-              });
-
-              $q.all([tasksPromise, pendingPromise]).then(function (responses) {
-                var result = responses[0], reasons = responses[1];
-                // Attach current pending reasons to any pending tasks we might have
-                var pendingTasks = _.filter(result.tasks, function (t) {
-                  return t.status === ScheduleStatus.PENDING;
-                });
-
-                if (pendingTasks.length > 0) {
-                  reasons = _.indexBy(reasons, 'taskId');
-                  pendingTasks.forEach(function (t) {
-                    if (reasons.hasOwnProperty(t.assignedTask.taskId)) {
-                      // find the latest task event (that is pending)
-                      // and set the message to be this reason
-                      var latestPending = _.chain(t.taskEvents)
-                        .filter(function (e) {
-                          return e.status === ScheduleStatus.PENDING;
-                        })
-                        .sortBy(function (e) {
-                          return e.timestamp;
-                        })
-                        .last().value();
-
-                      latestPending.message = reasons[t.assignedTask.taskId].reason;
-                    }
-                  });
-                }
-
-                deferred.resolve(result);
-              });
-            });
-          },
-
-          getConfigSummary: function (role, environment, jobName) {
-            return async(function (deferred) {
-              var key = new JobKey();
-              key.role = role;
-              key.environment = environment;
-              key.name = jobName;
-              auroraClient.getSchedulerClient().getConfigSummary(key, function (response) {
-                var result = auroraClient.processResponse(response);
-                result.groups = response.result !== null ?
-                  response.result.configSummaryResult.summary.groups : [];
-                deferred.resolve(result);
-              });
-            });
-          },
-
-          getJobUpdateSummaries: function (query) {
-            return async(function (deferred) {
-              query = query || new JobUpdateQuery();
-              auroraClient.getSchedulerClient().getJobUpdateSummaries(query, function (response) {
-                var result = auroraClient.processResponse(response);
-                result.summaries = response.result !== null ?
-                  response.result.getJobUpdateSummariesResult.updateSummaries : [];
-                deferred.resolve(result);
-              });
-            });
-          },
-
-          getJobUpdateDetails: function (updateKey) {
-            return async(function (deferred) {
-              var schedulerClient = auroraClient.getSchedulerClient();
-              var query = new JobUpdateQuery();
-              query.key = updateKey;
-              schedulerClient.getJobUpdateDetails(null, query, function (response) {
-                var result = auroraClient.processResponse(response);
-                result.details = response.result !== null ?
-                  response.result.getJobUpdateDetailsResult.detailsList[0] : {};
-                deferred.resolve(result);
-              });
-            });
-          },
-
-          // 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;
-            }
-          },
-
-          processResponse: function (response) {
-            if (response.serverInfo && response.serverInfo.clusterName) {
-              $rootScope.clusterName = response.serverInfo.clusterName;
-            }
-
-            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';
-            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(
-    'updateUtil',
-    function () {
-      function toSet(values) {
-        var tmp = {};
-        values.forEach(function (key) {
-          tmp[key] = true;
-        });
-        return tmp;
-      }
-
-      // TODO(dmclaughlin): Make these constants in api.thrift.
-      var UPDATE_TERMINAL_STATUSES = [
-        JobUpdateStatus.ROLLED_FORWARD,
-        JobUpdateStatus.ROLLED_BACK,
-        JobUpdateStatus.ABORTED,
-        JobUpdateStatus.ERROR,
-        JobUpdateStatus.FAILED
-      ];
-
-      var UPDATE_TERMINAL = toSet(UPDATE_TERMINAL_STATUSES);
-
-      var INSTANCE_SUCCESSFUL = toSet([
-        JobUpdateAction.INSTANCE_UPDATED
-      ]);
-
-      var instanceActionLookup = _.invert(JobUpdateAction);
-
-      var updateUtil = {
-        isTerminal: function (status) {
-          return UPDATE_TERMINAL.hasOwnProperty(status);
-        },
-        isInProgress: function (status) {
-          return ! updateUtil.isTerminal(status);
-        },
-        isInstanceSuccessful: function (action) {
-          return INSTANCE_SUCCESSFUL.hasOwnProperty(action);
-        },
-        instanceCountFromRanges: function (ranges) {
-          // add the deltas of remaining ranges
-          // note - we don't check for overlapping ranges here
-          // because that would be a bug in the scheduler
-          var instanceCount = 0;
-
-          ranges.forEach(function (r) {
-            instanceCount += (r.last - r.first + 1);
-          });
-
-          return instanceCount;
-        },
-        getStatusQuery: function (statuses) {
-          var query = new JobUpdateQuery();
-          query.updateStatuses = statuses;
-          return query;
-        },
-        getTerminalQuery: function () {
-          return updateUtil.getStatusQuery(UPDATE_TERMINAL_STATUSES);
-        },
-        getInProgressQuery: function () {
-          return updateUtil.getStatusQuery(ACTIVE_JOB_UPDATE_STATES);
-        },
-        progressFromEvents: function (instanceEvents) {
-          var successful = updateUtil.getLatestInstanceEvents(instanceEvents, function (e) {
-            return updateUtil.isInstanceSuccessful(e.action);
-          });
-          return Object.keys(successful).length;
-        },
-        displayClassForInstanceStatus: function (action) {
-          return instanceActionLookup[action].toLowerCase().replace(/_/g, '-');
-        },
-        processInstanceIdsFromRanges: function (ranges, cb) {
-          ranges.forEach(function (r) {
-            for (var i = r.first; i <= r.last; i++) {
-              cb(i);
-            }
-          });
-        },
-        getAllInstanceIds: function (update) {
-          var allIds = {}, newIds = {}, oldIds = {};
-
-          updateUtil.processInstanceIdsFromRanges(update.instructions.desiredState.instances,
-            function (instanceId) {
-              newIds[instanceId] = true;
-              allIds[instanceId] = true;
-            });
-
-          update.instructions.initialState.forEach(function (iTaskConfig) {
-            updateUtil.processInstanceIdsFromRanges(iTaskConfig.instances, function (instanceId) {
-              oldIds[instanceId] = true;
-              allIds[instanceId] = true;
-            });
-          });
-
-          return {
-            allIds: allIds,
-            newIds: newIds,
-            oldIds: oldIds
-          };
-        },
-        getLatestInstanceEvents: function (instanceEvents, condition) {
-          var events = _.sortBy(instanceEvents, 'timestampMs');
-          var instanceMap = {};
-          condition = condition || function () { return true; };
-
-          for (var i = events.length - 1; i >= 0; i--) {
-            if (!instanceMap.hasOwnProperty(events[i].instanceId) && condition(events[i])) {
-              instanceMap[events[i].instanceId] = events[i];
-            }
-          }
-
-          return instanceMap;
-        },
-        fillInstanceSummary: function (details, stats) {
-          // get latest event for each instance
-          var instanceMap = updateUtil.getLatestInstanceEvents(details.instanceEvents);
-
-          // instances to show is the union of old instances and new instances.
-          var allInstances = updateUtil.getAllInstanceIds(details.update);
-
-          var allIds = Object.keys(allInstances.allIds);
-
-          return allIds.map(function (i) {
-            if (instanceMap.hasOwnProperty(i)) {
-              var event = instanceMap[i];
-
-              // If instance id is in initialState but not desiredState, and last
-              // action is a successful update - it means that this instance was removed.
-              if (updateUtil.isInstanceSuccessful(event.action) &&
-                  allInstances.oldIds.hasOwnProperty(i) &&
-                  !allInstances.newIds.hasOwnProperty(i)) {
-                return {
-                  instanceId: i,
-                  className: 'instance-removed'
-                };
-              }
-
-              // Normal case - just use the latest action from the instance events.
-              var className = updateUtil.displayClassForInstanceStatus(event.action);
-              return {
-                instanceId: i,
-                className: className,
-                event: event
-              };
-            } else {
-              // Otherwise it is pending an update.
-              return {
-                instanceId: i,
-                className: 'pending'
-              };
-            }
-          });
-        },
-        getUpdateStats: function (details) {
-          if (!details || !details.update) {
-            return {};
-          }
-
-          var allInstances = Object.keys(updateUtil.getAllInstanceIds(details.update).allIds);
-          var totalInstancesToBeUpdated = allInstances.length;
-
-          var instancesUpdated = updateUtil.progressFromEvents(details.instanceEvents);
-
-          // calculate the percentage of work done so far
-          var progress = Math.round((instancesUpdated / totalInstancesToBeUpdated) * 100);
-
-          return {
-            totalInstancesToBeUpdated: totalInstancesToBeUpdated,
-            instancesUpdatedSoFar: instancesUpdated,
-            progress: progress
-          };
-        }
-      };
-
-      return updateUtil;
-    });
-
-  auroraUI.factory(
-    'taskUtil',
-    function () {
-      var taskUtil = {
-        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 container;
-          if (task.container && task.container.docker) {
-            container = {};
-            container.image = task.container.docker.image;
-          }
-
-          return {
-            resources: task.resources,
-            isService: task.isService,
-            production: task.production,
-            tier: task.tier,
-            contact: task.contactEmail || '',
-            constraints: constraints,
-            metadata: metadata,
-            container: container
-          };
-        },
-
-        // 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);
-        }
-      };
-      return taskUtil;
-    });
-
-  auroraUI.factory(
-    'cronJobSummaryService',
-    [ '$q', 'auroraClient',
-      function ($q, auroraClient) {
-        var cronJobSmrySvc = {
-          getCronJobSummary: function (role, env, jobName) {
-            var deferred = $q.defer();
-            auroraClient.getJobSummary(role).then(function (summaries) {
-              if (summaries.error) {
-                deferred.resolve({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.key.name === 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();
-
-              deferred.resolve({error: '', cronJobSummary: cronJobSummary});
-            });
-            return deferred.promise;
-          },
-
-          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;
-      }]);
-
-  auroraUI.factory(
-    'jobTasksService',
-    ['auroraClient', 'taskUtil', function jobTasksServiceFactory(auroraClient, taskUtil) {
-      var baseTableConfig = {
-        isGlobalSearchActivated: false,
-        isPaginationEnabled: true,
-        itemsByPage: 50,
-        maxSize: 8,
-        selectionMode: 'single'
-      };
-
-      function addColumn(afterLabel, currentColumns, newColumn) {
-        var idxPosition = -1;
-        currentColumns.some(function (column, index) {
-          if (column.label === afterLabel) {
-            idxPosition = index + 1;
-            return true;
-          }
-
-          return false;
-        });
-
-        if (idxPosition === -1) {
-          return;
-        }
-
-        return _.union(
-          _.first(currentColumns, idxPosition),
-          [newColumn],
-          _.last(currentColumns, currentColumns.length - idxPosition));
-      }
-
-      var baseColumns = [
-        {label: 'Instance', map: 'instanceId', cellTemplateUrl: '/assets/taskInstance.html'},
-        {label: 'Status', map: 'status', cellTemplateUrl: '/assets/taskStatus.html'},
-        {label: 'Host', map: 'host', cellTemplateUrl: '/assets/taskSandbox.html'}
-      ];
-
-      var completedTaskColumns = addColumn(
-        'Status',
-        baseColumns,
-        {
-          label: 'Running duration',
-          map: 'duration',
-          formatFunction: function (duration) {
-            return moment.duration(duration).humanize();
-          }
-        });
-
-      function summarizeTask(task) {
-        var isActive = taskUtil.isActiveTask(task);
-        var sortedTaskEvents = _.sortBy(task.taskEvents, function (taskEvent) {
-          return taskEvent.timestamp;
-        });
-
-        var latestTaskEvent = _.last(sortedTaskEvents);
-
-        return {
-          instanceId: task.assignedTask.instanceId,
-          jobKey: task.assignedTask.task.job,
-          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,
-          // TODO(maxim): Revisit this approach when the UI fix in AURORA-715 is finalized.
-          sandboxExists: true
-        };
-      }
-
-      function getDuration(sortedTaskEvents) {
-        var runningTaskEvent = _.find(sortedTaskEvents, function (taskEvent) {
-          return taskEvent.status === ScheduleStatus.RUNNING;
-        });
-
-        if (runningTaskEvent) {
-          var nextEvent = sortedTaskEvents[_.indexOf(sortedTaskEvents, runningTaskEvent) + 1];
-
-          return nextEvent ?
-            nextEvent.timestamp - runningTaskEvent.timestamp :
-            moment().valueOf() - runningTaskEvent.timestamp;
-        }
-
-        return 0;
-      }
-
-      function summarizeTaskEvents(taskEvents) {
-        return _.map(taskEvents, function (taskEvent) {
-          return {
-            timestamp: taskEvent.timestamp,
-            status: _.invert(ScheduleStatus)[taskEvent.status],
-            message: taskEvent.message
-          };
-        });
-      }
-
-      function getJobDashboardUrl(statsUrlPrefix, role, environment, job) {
-        return _.isEmpty(statsUrlPrefix) ?
-          '' :
-          statsUrlPrefix + role + '.' + environment + '.' + job;
-      }
-
-      function clone(obj) {
-        return JSON.parse(JSON.stringify(obj));
-      }
-
-      return {
-        taskIdColumn:  {
-          label: 'Task ID',
-          map: 'taskId',
-          cellTemplateUrl: '/assets/taskLink.html'
-        },
-
-        taskColumns: baseColumns,
-        completedTaskColumns: completedTaskColumns,
-        addColumn: addColumn,
-
-        getTasksForJob: function getTasksForJob($scope) {
-          $scope.activeTasksTableColumns = baseColumns;
-          $scope.completedTasksTableColumns = completedTaskColumns;
-
-          $scope.activeTasksTableConfig = clone(baseTableConfig);
-          $scope.completedTasksTableConfig = clone(baseTableConfig);
-
-          auroraClient.getTasksWithoutConfigs(
-              $scope.role,
-              $scope.environment,
-              $scope.job,
-              $scope.instance)
-            .then(function (response) {
-              if (response.error) {
-                $scope.error = 'Error fetching tasks: ' + response.error;
-                return [];
-              }
-
-              $scope.jobDashboardUrl = getJobDashboardUrl(
-                response.statsUrlPrefix,
-                $scope.role,
-                $scope.environment,
-                $scope.job);
-
-              var tasks = _.map(response.tasks, function (task) {
-                return summarizeTask(task);
-              });
-
-              var activeTaskPredicate = function (task) {
-                return task.isActive;
-              };
-
-              $scope.activeTasks = _.chain(tasks)
-                .filter(activeTaskPredicate)
-                .sortBy('instanceId')
-                .value();
-
-              $scope.completedTasks = _.chain(tasks)
-                .reject(activeTaskPredicate)
-                .sortBy(function (task) {
-                  return -task.latestActivity; //sort in descending order
-                })
-                .value();
-
-              $scope.activeTasksTableConfig.isPaginationEnabled =
-                  $scope.activeTasks.length > $scope.activeTasksTableConfig.itemsByPage;
-              $scope.completedTasksTableConfig.isPaginationEnabled =
-                  $scope.completedTasks.length > $scope.completedTasksTableConfig.itemsByPage;
-
-              $scope.tasksReady = true;
-            });
-        }
-      };
-    }]);
-})();

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/latestUpdates.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/latestUpdates.html b/src/main/resources/scheduler/assets/latestUpdates.html
deleted file mode 100644
index f396315..0000000
--- a/src/main/resources/scheduler/assets/latestUpdates.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<div ng-if="!updates.length">
-  <em ng-if="message">{{message}}</em>
-  <em ng-if="!message">No updates to show.</em>
-</div>
-
-<table class="table table-bordered table-striped table-hover" ng-if="updates.length">
-  <tr>
-    <th>job</th>
-    <th>user</th>
-    <th>started</th>
-    <th>last modified</th>
-    <th>status</th>
-  </tr>
-  <tr ng-repeat="update in updates">
-    <td>
-      <a href="/scheduler/{{update.key.job.role}}/{{update.key.job.environment}}/{{update.key.job.name}}/update/{{update.key.id}}">
-        {{update.key.job.role}}/{{update.key.job.environment}}/{{update.key.job.name}}
-      </a>
-    </td>
-    <td>
-      {{update.user}}
-    </td>
-    <td>
-      {{update.state.createdTimestampMs | toElapsedTime}} ago
-    </td>
-    <td>
-      {{update.state.lastModifiedTimestampMs | toElapsedTime}} ago
-    </td>
-    <td>
-      {{update.state.status | toNiceStatus}}
-    </td>
-  </tr>
-</table>

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/loadingFooter.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/loadingFooter.html b/src/main/resources/scheduler/assets/loadingFooter.html
deleted file mode 100644
index 910271a..0000000
--- a/src/main/resources/scheduler/assets/loadingFooter.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!--
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<tr>
-  <td colspan="4" class="loading">
-    <span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>
-  </td>
-</tr>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/role.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/role.html b/src/main/resources/scheduler/assets/role.html
deleted file mode 100644
index 21580e6..0000000
--- a/src/main/resources/scheduler/assets/role.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<div class='container-fluid'>
-  <!--
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-  <div ng-show='error'>
-    <error></error>
-  </div>
-
-  <div ng-hide='error'>
-    <breadcrumb></breadcrumb>
-
-    <div class='row' ng-show='!environment'>
-      <div ng-controller="QuotaController">
-        <div class='col-md-5'>
-          <div>
-            <h4>Resource consumption</h4>
-            <smart-table config='resourcesTableConfig'
-                         columns='resourcesTableColumns'
-                         rows='resources'
-                         class='table table-striped table-hover table-condensed'>
-            </smart-table>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <div class='row'>
-      <div class='col-md-12'>
-        <smart-table config='jobsTableConfig'
-                     columns='jobsTableColumns'
-                     rows='jobs'
-                     class='table table-striped table-hover table-bordered table-condensed'>
-        </smart-table>
-      </div>
-    </div>
-  </div>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/roleEnvLink.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/roleEnvLink.html b/src/main/resources/scheduler/assets/roleEnvLink.html
deleted file mode 100644
index ff36612..0000000
--- a/src/main/resources/scheduler/assets/roleEnvLink.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<div class='role-env-link'>
-  <!--
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/roleLink.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/roleLink.html b/src/main/resources/scheduler/assets/roleLink.html
deleted file mode 100644
index 995348b..0000000
--- a/src/main/resources/scheduler/assets/roleLink.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<div class='role-link'>
-  <!--
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-</div>

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/scheduler/index.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/scheduler/index.html b/src/main/resources/scheduler/assets/scheduler/index.html
index 417f8f8..af84236 100644
--- a/src/main/resources/scheduler/assets/scheduler/index.html
+++ b/src/main/resources/scheduler/assets/scheduler/index.html
@@ -3,101 +3,27 @@
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
-
       http://www.apache.org/licenses/LICENSE-2.0
-
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
  -->
-<html lang='en' ng-app='auroraUI'>
-<head>
-  <meta charset='utf-8'>
-  <meta name='google' value='notranslate'>
-  <link rel='icon' href='/assets/images/aurora.png' type='image/png'/>
-  <title>Aurora</title>
-
-  <!-- Load our css at the end so we can override bootstrap css properties as needed -->
-  <link href='/assets/bower_components/bootstrap/dist/css/bootstrap.min.css' rel='stylesheet'>
-  <link rel='stylesheet' href='/assets/css/app.css'/>
-
-</head>
-<body class='ng-cloak'>
-
-<nav class="navbar navbar-static-top header" role="navigation">
-  <div class="container-fluid">
-    <div class="navbar-header">
-      <a href="/scheduler"><img class="logo" src="/assets/images/aurora_logo.png"/></a>
-    </div>
-
-    <div class="collapse navbar-collapse">
-      <ul class="nav navbar-nav">
-        <li><a href="/updates">updates</a></li>
-      </ul>
-    </div>
-  </div>
-</nav>
-<div class='beta-banner'>
-  <div class='container-fluid'>
-    <div class='row'>
-      <!--
-       Licensed under the Apache License, Version 2.0 (the "License");
-       you may not use this file except in compliance with the License.
-       You may obtain a copy of the License at
-
-            http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing, software
-       distributed under the License is distributed on an "AS IS" BASIS,
-       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-       See the License for the specific language governing permissions and
-       limitations under the License.
-       -->
-      <div class='col-md-12'>
-        <a id='beta-link' href='/beta/scheduler'> <span class='glyphicon glyphicon-hand-right' ></span> Try the Beta of the new Scheduler UI</a>
-      </div>
-    </div>
-  </div>
-</div>
-
-<div class='container-fluid'>
-  <ng-view></ng-view>
-</div>
-
-<!-- Thrift -->
-<script src='/assets/js/thrift.js'></script>
-<script src='/apiclient/api_types.js'></script>
-<script src='/apiclient/ReadOnlyScheduler.js'></script>
-
-<!-- Angular -->
-<script src='/assets/bower_components/angular/angular.js'></script>
-<script src='/assets/bower_components/angular-route/angular-route.js'></script>
-<script src='/assets/js/app.js'></script>
-<script src='/assets/js/controllers.js'></script>
-<script src='/assets/js/directives.js'></script>
-<script src='/assets/js/services.js'></script>
-<script src='/assets/js/filters.js'></script>
-
-<!-- Bootstrap -->
-<script src='/assets/bower_components/jquery/dist/jquery.js'></script>
-<script src='/assets/bower_components/bootstrap/dist/js/bootstrap.min.js'></script>
-
-<!-- Angular bootstrap -->
-<script src='/assets/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js'></script>
-
-<!-- smart table -->
-<script src='/assets/bower_components/smart-table/Smart-Table.debug.js'></script>
-
-<!-- underscore -->
-<script src='/assets/bower_components/underscore/underscore.js'></script>
-
-<!-- moment.js -->
-<script src='/assets/bower_components/momentjs/moment.js'></script>
-
-<script type='text/javascript'>
-  document.getElementById('beta-link').href = window.location.href.replace('/scheduler', '/beta/scheduler');
-</script>
-</body>
-</html>
+<html lang='en'>
+  <head>
+    <meta charset='utf-8'>
+    <meta name='google' value='notranslate'>
+    <link rel='icon' href='/assets/images/aurora.png' type='image/png'/>
+    <title>Aurora</title>
+  </head>
+  <body>
+    <div id="root"></div>
+    <script src='/assets/bower_components/jquery/dist/jquery.js'></script>
+    <!-- Thrift -->
+    <script src='/assets/js/thrift.js'></script>
+    <script src='/apiclient/api_types.js'></script>
+    <script src='/apiclient/ReadOnlyScheduler.js'></script>
+    <script src="/assets/js/bundle.js"></script>
+  </body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/scheduler/new-index.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/scheduler/new-index.html b/src/main/resources/scheduler/assets/scheduler/new-index.html
deleted file mode 100644
index af84236..0000000
--- a/src/main/resources/scheduler/assets/scheduler/new-index.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype html>
-<!--
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-      http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<html lang='en'>
-  <head>
-    <meta charset='utf-8'>
-    <meta name='google' value='notranslate'>
-    <link rel='icon' href='/assets/images/aurora.png' type='image/png'/>
-    <title>Aurora</title>
-  </head>
-  <body>
-    <div id="root"></div>
-    <script src='/assets/bower_components/jquery/dist/jquery.js'></script>
-    <!-- Thrift -->
-    <script src='/assets/js/thrift.js'></script>
-    <script src='/apiclient/api_types.js'></script>
-    <script src='/apiclient/ReadOnlyScheduler.js'></script>
-    <script src="/assets/js/bundle.js"></script>
-  </body>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/taskInstance.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/taskInstance.html b/src/main/resources/scheduler/assets/taskInstance.html
deleted file mode 100644
index 0ab63ee..0000000
--- a/src/main/resources/scheduler/assets/taskInstance.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<a ng-href="/scheduler/{{dataRow.jobKey.role}}/{{dataRow.jobKey.environment}}/{{dataRow.jobKey.name}}/{{dataRow.instanceId}}">{{dataRow.instanceId}}</a>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/taskLink.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/taskLink.html b/src/main/resources/scheduler/assets/taskLink.html
deleted file mode 100644
index 7ad2959..0000000
--- a/src/main/resources/scheduler/assets/taskLink.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<div class='task-link'>
-  <!--
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/taskSandbox.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/taskSandbox.html b/src/main/resources/scheduler/assets/taskSandbox.html
deleted file mode 100644
index 5368838..0000000
--- a/src/main/resources/scheduler/assets/taskSandbox.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<div>
-  <!--
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-  -->
-  <span ng-if='dataRow.sandboxExists'>
-    <a ng-href='http://{{formatedValue}}:1338/task/{{dataRow.taskId}}'>
-      {{formatedValue}}
-    </a>
-  </span>
-
-  <span ng-if='!dataRow.sandboxExists'>
-    <abbr title='This sandbox link is disabled because the sandbox disk space has been reclaimed.'>
-      {{formatedValue}}
-    </abbr>
-  </span>
-</div>

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/taskStatus.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/taskStatus.html b/src/main/resources/scheduler/assets/taskStatus.html
deleted file mode 100644
index d2729a9..0000000
--- a/src/main/resources/scheduler/assets/taskStatus.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<task-status>
-  <!--
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-  -->
-  <div>
-    <span title='{{formatedValue | scheduleStatusTooltip}}'>
-      <span ng-if='!showDetails'>
-        <i class='glyphicon glyphicon-plus clickable' ng-click="toggleShowDetails()"></i>
-      </span>
-      <span ng-if='showDetails'>
-        <i class='glyphicon glyphicon-minus clickable' ng-click="toggleShowDetails()"></i>
-      </span>
-      <span>
-        {{dataRow.latestActivity | toElapsedTime}} ago -
-        <span class='schedulingStatus'>{{formatedValue}}</span>
-        <span ng-if='dataRow.statusMessage'>: {{dataRow.statusMessage}}</span>
-      </span>
-    </span>
-
-    <ul ng-if='showDetails'>
-      <li ng-repeat='taskEvent in dataRow.taskEvents'>
-        {{taskEvent.timestamp | toLocalTime}} &bull;
-        <span title='{{taskEvent.status | scheduleStatusTooltip}}'>
-          <span class='schedulingStatus'>{{taskEvent.status}}</span>
-        </span>
-        <span ng-if='taskEvent.message'> &bull; {{taskEvent.message}}</span>
-      </li>
-    </ul>
-  </div>
-</task-status>

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/timeDisplay.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/timeDisplay.html b/src/main/resources/scheduler/assets/timeDisplay.html
deleted file mode 100644
index 08574cc..0000000
--- a/src/main/resources/scheduler/assets/timeDisplay.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<div class="update-time">
-  <span>{{timestamp | toLocalDay}}</span>
-  <h4 tooltip="{{timestamp | toUtcTime}}">{{timestamp | toLocalTimeOnly}}</h4>
-
-  <span class="time-ago">{{timestamp | toElapsedTime}} ago</span>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/update.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/update.html b/src/main/resources/scheduler/assets/update.html
deleted file mode 100644
index 88ccb7a..0000000
--- a/src/main/resources/scheduler/assets/update.html
+++ /dev/null
@@ -1,147 +0,0 @@
-<!--
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<div class="container-fluid">
-  <div ng-show='error'>
-    <error></error>
-  </div>
-
-  <div ng-hide='error'>
-    <breadcrumb></breadcrumb>
-
-    <div class="content-box">
-      <div class="row">
-        <!-- begin finished update box -->
-        <div ng-if="!inProgress" class="col-md-6 finished-update">
-
-          <div class="text-center"><h3>Update Summary</h3></div>
-
-          <div class="row">
-            <div class="col-md-12 text-center">
-              <span>started by <strong>{{update.update.summary.user}}</strong></span><br/>
-              <span>final status <strong>{{update.update.summary.state.status | toNiceStatus}}</strong></span>
-            </div>
-          </div>
-
-          <div class="row">
-            <div class="col-md-3 col-md-offset-2">
-              <time-display timestamp="update.update.summary.state.createdTimestampMs"></time-display>
-            </div>
-            <div class="col-md-2 time-divider">
-              <span>~</span>
-            </div>
-            <div class="col-md-3">
-              <time-display timestamp="update.update.summary.state.lastModifiedTimestampMs"></time-display>
-            </div>
-          </div>
-          <div class="row">
-            <div class="col-md-12">
-              <div class="time-display-duration">
-                 Duration: {{duration}}
-              </div>
-            </div>
-          </div>
-
-          <instance-summary
-              instances="instanceSummary"
-              stats="stats"
-              size="instanceGridSize"
-              status="update.update.summary.state.status">
-          </instance-summary>
-        </div>
-        <!-- end finished update box -->
-
-        <!-- begin update in progress box -->
-        <div ng-if="inProgress" class="col-md-6 update-settings">
-
-          <h3 ng-if="inProgress">Update Status</h3>
-
-          <div class="progress-details">
-          <span>started by <strong>{{update.update.summary.user}}</strong>, <span tooltip="{{update.update.summary.state.createdTimestampMs | toLocalTime}}">{{update.update.summary.state.createdTimestampMs | toElapsedTime}} ago</span></span><br/>
-          <span>current status <strong>{{update.update.summary.state.status | toNiceStatus}}</strong></span>
-          </div>
-
-          <instance-summary instances="instanceSummary" stats="stats" size="instanceGridSize"></instance-summary>
-
-        </div>
-        <!-- end update in progress box -->
-
-        <div class="col-md-6 update-settings">
-          <h3>Update Settings</h3>
-
-          <update-settings update="update"></update-settings>
-        </div>
-      </div>
-
-      <hr/>
-
-      <div class="row">
-        <div class="col-md-6">
-          <h4>Update Events</h4>
-          <table class="table table-bordered table-striped">
-            <thead>
-              <tr>
-                <th>event</th>
-                <th>time</th>
-                <th>user</th>
-                <th>message</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr ng-repeat="e in update.updateEvents">
-                <td>{{e.status | toNiceStatus}}</td>
-                <td><span tooltip="{{e.timestampMs | toUtcTime}}">{{e.timestampMs | toElapsedTime }} ago</span></td>
-                <td>{{e.user}}</td>
-                <td>{{e.message}}</td>
-              </tr>
-            </tbody>
-            <tfoot loading-footer ng-if="inProgress"></tfoot>
-          </table>
-        </div>
-
-        <div class="col-md-6">
-          <h4>Instance Events</h4>
-          <table class="table table-bordered table-striped">
-            <thead>
-              <tr>
-                <th>instance</th>
-                <th>event</th>
-                <th>time</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr ng-repeat="e in instanceEvents">
-                <td><a href="/scheduler/{{role}}/{{environment}}/{{job}}/{{e.instanceId}}">{{e.instanceId}}</a></td>
-                <td>{{e.action | toNiceAction}}</td>
-                <td><span tooltip="{{e.timestampMs | toUtcTime}}">{{e.timestampMs | toElapsedTime}} ago</span></td>
-              </tr>
-            </tbody>
-            <tfoot loading-footer ng-if="inProgress"></tfoot>
-          </table>
-
-          <pagination ng-change="changeInstancePage()" max-size="5" total-items="totalEvents" ng-model="currentPage" items-per-page="eventsPerPage"></pagination>
-        </div>
-      </div>
-    </div>
-
-    <div class="content-box">
-      <div class="row">
-        <div class="col-md-12">
-          <h3>Job Configuration</h3>
-          <pre>{{configJson}}</pre>
-        </div>
-      </div>
-    </div>
-
-  </div>
-</div>

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/updateList.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/updateList.html b/src/main/resources/scheduler/assets/updateList.html
deleted file mode 100644
index 0b9f1b9..0000000
--- a/src/main/resources/scheduler/assets/updateList.html
+++ /dev/null
@@ -1,32 +0,0 @@
-  <!--
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   -->
-<div class="container-fluid">
-  <breadcrumb></breadcrumb>
-
-  <div class="row">
-    <div class="col-md-12">
-        <h3>Updates In Progress</h3>
-
-        <latest-updates updates="inProgressUpdates" message="No updates currently in progress."></latest-updates>
-    </div>
-  </div>
-
-  <div class="row">
-    <div class="col-md-12">
-        <h3>Recently Completed Updates</h3>
-
-        <latest-updates updates="completedUpdates"></latest-updates>
-    </div>
-  </div>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/main/resources/scheduler/assets/updateSettings.html
----------------------------------------------------------------------
diff --git a/src/main/resources/scheduler/assets/updateSettings.html b/src/main/resources/scheduler/assets/updateSettings.html
deleted file mode 100644
index 96e478c..0000000
--- a/src/main/resources/scheduler/assets/updateSettings.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!--
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<table class="table">
-  <tr>
-    <th>setting</th>
-    <th>value</th>
-  </tr>
-  <tr>
-    <td>
-      <span class="setting-label" tooltip="Max number of instances being updated at any given moment.">
-        Update Group Size
-      </span>
-    </td>
-    <td>
-      <strong>{{update.update.instructions.settings.updateGroupSize}}</strong>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <span class="setting-label" tooltip="Max number of instance failures to tolerate before marking instance as FAILED.">
-        Max Failures Per Instance
-      </span>
-    </td>
-    <td>
-      <strong>{{update.update.instructions.settings.maxPerInstanceFailures}}</strong>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <span class="setting-label" tooltip="Max number of FAILED instances to tolerate before terminating the update.">
-        Max Failed Instances
-      </span>
-    </td>
-    <td>
-      <strong>{{update.update.instructions.settings.maxFailedInstances}}</strong>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <span class="setting-label" tooltip="Min time to watch a RUNNING instance.">
-        Min Waiting Time In Running
-      </span>
-    </td>
-    <td>
-      <strong>{{update.update.instructions.settings.minWaitInInstanceRunningMs}}</strong>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <span class="setting-label" tooltip="If true, enables failed update rollback.">
-        Rollback on Failure
-      </span>
-    </td>
-    <td>
-      <strong>{{update.update.instructions.settings.rollbackOnFailure}}</strong>
-    </td>
-  </tr>
-  <tr ng-if="update.update.instructions.settings.updateOnlyTheseInstances">
-    <td>
-      <span class="setting-label" tooltip="A subset of instance IDs to act on. All instances will be affected if this is not set.">
-        Instance IDs
-      </span>
-    </td>
-    <td>
-      <strong>{{update.update.instructions.settings.updateOnlyTheseInstances | toNiceRanges}}</strong>
-    </td>
-  </tr>
-  <tr ng-if="update.update.instructions.settings.blockIfNoPulsesAfterMs">
-    <td>
-      <span class="setting-label" tooltip="Time in ms to wait for a pulse before blocking update progress.">
-        Pulse Timeout
-      </span>
-    </td>
-    <td>
-      <strong>{{update.update.instructions.settings.blockIfNoPulsesAfterMs}}</strong>
-    </td>
-  </tr>
-</table>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aurora/blob/96c834a2/src/test/java/org/apache/aurora/scheduler/http/ServletFilterTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/http/ServletFilterTest.java b/src/test/java/org/apache/aurora/scheduler/http/ServletFilterTest.java
index f57ddd0..62f5695 100644
--- a/src/test/java/org/apache/aurora/scheduler/http/ServletFilterTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/http/ServletFilterTest.java
@@ -68,9 +68,6 @@ public class ServletFilterTest extends AbstractJettyTest {
 
     assertGzipEncodedGet("/updates");
     assertGzipEncodedGet("/updates/");
-
-    assertGzipEncodedGet("/assets/bower_components/angular/angular.js");
-
   }
 
   private void assertResponseStatus(