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/15 23:12:56 UTC
git commit: Removed cron jobs table from role and env page. Added
cron job summary to job page.
Repository: incubator-aurora
Updated Branches:
refs/heads/master e50ba7df1 -> 301617852
Removed cron jobs table from role and env page. Added cron job summary to job page.
Updated getTasksQuery to not throw an exception when requesting a cron job with no tasks.
Testing Done:
Tested on local laptop.
./gradlew clean build.
./pants src/test/python:all -vxs
Bugs closed: AURORA-384
Reviewed at https://reviews.apache.org/r/21250/
Project: http://git-wip-us.apache.org/repos/asf/incubator-aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-aurora/commit/30161785
Tree: http://git-wip-us.apache.org/repos/asf/incubator-aurora/tree/30161785
Diff: http://git-wip-us.apache.org/repos/asf/incubator-aurora/diff/30161785
Branch: refs/heads/master
Commit: 301617852e0fffbad5bdd2b9c3a3a00314779cd0
Parents: e50ba7d
Author: Suman Karumuri <ma...@apache.org>
Authored: Thu May 15 14:11:58 2014 -0700
Committer: Suman Karumuri <sk...@twitter.com>
Committed: Thu May 15 14:11:58 2014 -0700
----------------------------------------------------------------------
.../thrift/SchedulerThriftInterface.java | 19 +--
.../apache/aurora/scheduler/http/ui/job.html | 22 ++++
.../aurora/scheduler/http/ui/js/controllers.js | 122 ++++++-------------
.../aurora/scheduler/http/ui/js/filters.js | 16 ++-
.../aurora/scheduler/http/ui/js/services.js | 49 ++++++++
.../apache/aurora/scheduler/http/ui/role.html | 11 +-
6 files changed, 125 insertions(+), 114 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/30161785/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java b/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java
index f101143..4386a86 100644
--- a/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java
+++ b/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java
@@ -337,18 +337,9 @@ class SchedulerThriftInterface implements AuroraAdmin.Iface {
Set<IScheduledTask> tasks =
Storage.Util.weaklyConsistentFetchTasks(storage, Query.arbitrary(query));
- Response response = new Response();
-
- if (tasks.isEmpty()) {
- response.setResponseCode(INVALID_REQUEST)
- .setMessage("No tasks found for query: " + query);
- } else {
- response.setResponseCode(OK)
- .setResult(Result.scheduleStatusResult(
- new ScheduleStatusResult().setTasks(IScheduledTask.toBuildersList(tasks))));
- }
-
- return response;
+ return new Response().setResponseCode(OK)
+ .setResult(Result.scheduleStatusResult(
+ new ScheduleStatusResult().setTasks(IScheduledTask.toBuildersList(tasks))));
}
@Override
@@ -403,8 +394,8 @@ class SchedulerThriftInterface implements AuroraAdmin.Iface {
private Query.Builder maybeRoleScoped(Optional<String> ownerRole) {
return ownerRole.isPresent()
- ? Query.roleScoped(ownerRole.get())
- : Query.unscoped();
+ ? Query.roleScoped(ownerRole.get())
+ : Query.unscoped();
}
private Map<IJobKey, IJobConfiguration> getJobs(
http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/30161785/src/main/resources/org/apache/aurora/scheduler/http/ui/job.html
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/http/ui/job.html b/src/main/resources/org/apache/aurora/scheduler/http/ui/job.html
index cd78c20..284c2bc 100644
--- a/src/main/resources/org/apache/aurora/scheduler/http/ui/job.html
+++ b/src/main/resources/org/apache/aurora/scheduler/http/ui/job.html
@@ -22,6 +22,28 @@
</div>
</div>
+ <div ng-controller="CronJobSummaryController">
+ <div ng-show='error'>
+ <error/>
+ </div>
+
+ <div ng-hide='error'>
+ <div class='container-fluid'>
+ <div ng-if='cronJobSummary'>
+ <h3>Cron Job Summary</h3>
+
+ <div>
+ <smart-table config='cronJobSummaryTableConfig'
+ columns='cronJobSummaryTableColumns'
+ rows='cronJobSummary'
+ class='table table-striped table-hover table-bordered table-condensed'>
+ </smart-table>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
<div class='container-fluid'>
<button class="btn summaryButton" ng-click='toggleSummaryVisibility()'>
{{summaryButtonText}}
http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/30161785/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 4a83e1d..c13a88f 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
@@ -88,27 +88,8 @@ auroraUIControllers.controller('JobSummaryController',
{label: 'Failed Tasks', map: 'failedTasks'}
];
- $scope.cronJobsTableColumns = [
- {label: 'Environment', map: 'environment', cellTemplateUrl: '/roleEnvLink.html'},
- {label: 'Job Name', map: 'jobName'},
- {label: 'Tasks', map: 'tasks'},
- {label: 'Schedule', map: 'schedule'},
- {label: 'Next Run',
- map: 'nextCronRun',
- formatFunction: function (value, format) {
- return printDate(value);
- }
- },
- {label: 'Collision Policy', map: 'collisionPolicy'},
- {label: 'Metadata', map: 'metadata'}
- ];
-
$scope.jobsTableConfig = infoTableConfig;
- $scope.cronJobsTableConfig = infoTableConfig;
-
- $scope.cronJobs = [];
-
$scope.jobs = getJobs();
function getJobs() {
@@ -131,27 +112,7 @@ auroraUIControllers.controller('JobSummaryController',
return summary.jobName;
};
- $scope.cronJobs = _.chain(jobSummaries)
- .filter(function (summary) {
- return isCronJob(summary.job);
- })
- .map(function (summary) {
- return {
- role: $scope.role, // required for roleEnvLink directive
- environment: summary.job.key.environment,
- jobName: summary.job.taskConfig.jobName,
- tasks: summary.job.instanceCount,
- schedule: summary.job.cronSchedule,
- nextCronRun: summary.nextCronRunMs,
- collisionPolicy: getCronCollisionPolicy(summary.job.cronCollisionPolicy),
- metadata: getMetadata(summary.job.taskConfig.metadata)
- };
- })
- .sortBy(byJobName)
- .value();
-
return _.chain(jobSummaries)
- .reject(isCronJobWithNoTasks)
.map(function (summary) {
return {
role: $scope.role, // required for roleEnvLink directive
@@ -174,60 +135,12 @@ auroraUIControllers.controller('JobSummaryController',
return 'service';
}
- if (isCronJob(job)) {
+ if (job.cronSchedule !== null) {
return 'cron';
}
return 'adhoc';
}
-
- function isCronJob(job) {
- return job.cronSchedule !== null;
- }
-
- function isCronJobWithNoTasks(summary) {
- var stats = summary.stats;
- var taskCount = stats.pendingTaskCount
- + stats.activeTaskCount
- + stats.finishedTaskCount
- + stats.failedTaskCount;
- return isCronJob(summary.job) && taskCount === 0;
- }
-
- function getMetadata(attributes) {
- return _.map(attributes,function (attribute) {
- return attribute.key + ': ' + attribute.value;
- }).join(', ');
- }
-
- function getCronCollisionPolicy(cronCollisionPolicy) {
- return _.keys(CronCollisionPolicy)[cronCollisionPolicy ? cronCollisionPolicy : 0];
- }
-
- // TODO(Suman Karumuri): Replace printDate with a more user friendly directive.
- function printDate(timestamp) {
- function pad(number) {
- number = '' + number;
- if (number.length < 2) {
- return '0' + number;
- }
- return number;
- }
-
- var d = new Date(timestamp);
- return pad(d.getUTCMonth() + 1) + '/'
- + pad(d.getUTCDate()) + ' '
- + pad(d.getUTCHours()) + ':'
- + pad(d.getUTCMinutes()) + ':'
- + pad(d.getUTCSeconds())
- + ' UTC ('
- + pad(d.getMonth() + 1) + '/'
- + pad(d.getDate()) + ' '
- + pad(d.getHours()) + ':'
- + pad(d.getMinutes()) + ':'
- + pad(d.getSeconds())
- + ' local)';
- }
});
auroraUIControllers.controller('QuotaController',
@@ -278,6 +191,39 @@ auroraUIControllers.controller('QuotaController',
}
);
+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);
+
+ $scope.cronJobSummary = [cronJobSummary.cronJobSummary];
+ }
+ }
+);
+
auroraUIControllers.controller('JobController',
function ($scope, $routeParams, auroraClient, taskUtil) {
$scope.error = '';
http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/30161785/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 2e8b73b..a2aea4d 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
@@ -61,11 +61,23 @@ auroraUI.filter('scaleMb', function () {
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('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
http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/30161785/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 7722900..f984956 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
@@ -213,3 +213,52 @@ auroraUI.factory(
};
return taskUtil;
});
+
+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.'};
+ }
+
+ 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();
+
+ return {error: '', cronJobSummary: cronJobSummary}
+ },
+
+ 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;
+ }]);
http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/30161785/src/main/resources/org/apache/aurora/scheduler/http/ui/role.html
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/http/ui/role.html b/src/main/resources/org/apache/aurora/scheduler/http/ui/role.html
index 94fda63..8b829bb 100644
--- a/src/main/resources/org/apache/aurora/scheduler/http/ui/role.html
+++ b/src/main/resources/org/apache/aurora/scheduler/http/ui/role.html
@@ -18,7 +18,7 @@
</div>
<div class='container-fluid'>
- <div ng-show='!environment'>
+ <div ng-show='!environment'>
<div class='row'>
<div class='span8'>
<div ng-controller="QuotaController">
@@ -47,15 +47,6 @@
class='table table-striped table-hover table-bordered table-condensed'>
</smart-table>
</div>
-
- <div class='container-fluid'>
- <h2 class='text-center'>Cron jobs for role <em>{{role}}</em></h2>
- <smart-table config='cronJobsTableConfig'
- columns='cronJobsTableColumns'
- rows='cronJobs'
- class='table table-striped table-hover table-bordered table-condensed'>
- </smart-table>
- </div>
</div>
</div>
</div>