azkaban-uncached
Details
diff --git a/src/java/azkaban/scheduler/ScheduleManager.java b/src/java/azkaban/scheduler/ScheduleManager.java
index 81c5c29..f0325af 100644
--- a/src/java/azkaban/scheduler/ScheduleManager.java
+++ b/src/java/azkaban/scheduler/ScheduleManager.java
@@ -104,7 +104,6 @@ public class ScheduleManager implements TriggerAgent {
// only do this when using external runner
public synchronized void updateLocal() throws ScheduleManagerException {
-
List<Schedule> updates = loader.loadUpdatedSchedules();
for(Schedule s : updates) {
if(s.getStatus().equals(TriggerStatus.EXPIRED.toString())) {
@@ -157,15 +156,15 @@ public class ScheduleManager implements TriggerAgent {
* @param id
* @return
* @throws ScheduleManagerException
- */
+ */
// public Set<Schedule> getSchedules(int projectId, String flowId) throws ScheduleManagerException {
// updateLocal();
// return scheduleIdentityPairMap.get(new Pair<Integer,String>(projectId, flowId));
// }
public Schedule getSchedule(int projectId, String flowId) throws ScheduleManagerException {
- updateLocal();
- return scheduleIdentityPairMap.get(new Pair<Integer,String>(projectId, flowId));
-}
+ updateLocal();
+ return scheduleIdentityPairMap.get(new Pair<Integer,String>(projectId, flowId));
+ }
/**
* Returns the scheduled flow for the scheduleId
diff --git a/src/java/azkaban/webapp/servlet/ScheduleServlet.java b/src/java/azkaban/webapp/servlet/ScheduleServlet.java
index b31b4ca..9a4ea4e 100644
--- a/src/java/azkaban/webapp/servlet/ScheduleServlet.java
+++ b/src/java/azkaban/webapp/servlet/ScheduleServlet.java
@@ -114,8 +114,8 @@ public class ScheduleServlet extends LoginAbstractAzkabanServlet {
else if (ajaxName.equals("scheduleFlow")) {
ajaxScheduleFlow(req, ret, session.getUser());
}
- else if (action.equals("fetchSchedules")) {
- ajaxFetchSchedules(req, ret, session.getUser());
+ else if (ajaxName.equals("fetchSchedule")) {
+ ajaxFetchSchedule(req, ret, session.getUser());
}
if (ret != null) {
@@ -232,15 +232,24 @@ public class ScheduleServlet extends LoginAbstractAzkabanServlet {
return Minutes.minutes(min+hour*60).toPeriod();
}
- private void ajaxFetchSchedules(HttpServletRequest req,
+ private void ajaxFetchSchedule(HttpServletRequest req,
HashMap<String, Object> ret, User user) throws ServletException {
+ int projectId = getIntParam(req, "projectId");
String flowId = getParam(req, "flowId");
try {
- List<Schedule> flowSchedules = scheduleManager.getSchedules(flowId);
- List<Object> schecules = new ArrayList<Object>();
-
- ret.put("schedules", schedules);
+ Schedule schedule = scheduleManager.getSchedule(
+ projectId, flowId);
+
+ if (schedule != null) {
+ Map<String, String> jsonObj = new HashMap<String, String>();
+ jsonObj.put("scheduleId", Integer.toString(schedule.getScheduleId()));
+ jsonObj.put("submitUser", schedule.getSubmitUser());
+ jsonObj.put("firstSchedTime", Long.toString(schedule.getFirstSchedTime()));
+ jsonObj.put("nextExecTime", Long.toString(schedule.getNextExecTime()));
+ jsonObj.put("period", schedule.getPeriod().toString());
+ ret.put("schedule", jsonObj);
+ }
}
catch (ScheduleManagerException e) {
ret.put("error", e);
diff --git a/src/java/azkaban/webapp/servlet/velocity/flowpage.vm b/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
index c20fd66..376d30c 100644
--- a/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
@@ -26,7 +26,6 @@
<script type="text/javascript" src="${context}/js/dust-core-2.2.2.min.js"></script>
<script type="text/javascript" src="${context}/js/flowsummary.js"></script>
- <script type="text/javascript" src="${context}/js/flowscheduling.js"></script>
<script type="text/javascript" src="${context}/js/azkaban.date.utils.js"></script>
<script type="text/javascript" src="${context}/js/azkaban.ajax.utils.js"></script>
@@ -111,7 +110,6 @@
<ul class="nav nav-tabs" id="headertabs">
<li id="graphViewLink"><a href="#graph">Graph</a></li>
<li id="executionsViewLink"><a href="#executions">Executions</a></li>
- <li id="schedulingViewLink"><a href="#scheduling">Scheduling</a></li>
<li id="summaryViewLink"><a href="#summary">Summary</a></li>
</ul>
@@ -150,11 +148,6 @@
</div>
</div>
- ## Scheduling view.
-
- <div class="row" id="schedulingView">
- </div>
-
## Summary view.
<div class="row" id="summaryView">
src/tl/flowsummary.tl 53(+52 -1)
diff --git a/src/tl/flowsummary.tl b/src/tl/flowsummary.tl
index d738b0e..b117f8a 100644
--- a/src/tl/flowsummary.tl
+++ b/src/tl/flowsummary.tl
@@ -15,10 +15,59 @@
</tr>
</tbody>
</table>
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ Scheduling
+ {?schedule}
+ <div class="pull-right">
+ <button type="button" id="removeSchedBtn" class="btn btn-xs btn-danger" onclick="removeSched({schedule.scheduleId})" >Remove Schedule</button>
+ </div>
+ {/schedule}
+ </div>
+ {?schedule}
+ <table class="table table-striped table-condensed table-bordered table-hover">
+ <tbody>
+ <tr>
+ <td class="flow-summary-key">Schedule ID</td>
+ <td class="flow-summary-value">{schedule.scheduleId}</td>
+ <td class="flow-summary-key">Submitted By</td>
+ <td class="flow-summary-value">{schedule.submitUser}</td>
+ </tr>
+ <tr>
+ <td class="flow-summary-key">First Scheduled to Run</td>
+ <td class="flow-summary-value">{schedule.firstSchedTime}</td>
+ <td class="flow-summary-key">Repeats Every</td>
+ <td class="flow-summary-value">{schedule.period}</td>
+ </tr>
+ <tr>
+ <td class="flow-summary-key">Next Execution Time</td>
+ <td class="flow-summary-value">{schedule.nextExecTime}</td>
+ <td class="flow-summary-key">SLA</td>
+ <td class="flow-summary-value">
+ {?schedule.slaOptions}
+ true
+ {:else}
+ false
+ {/schedule.slaOptions}
+ <button type="button" id="addSlaBtn" class="btn btn-xs btn-primary" onclick="slaView.initFromSched({schedule.scheduleId}, '{flowName}')" >Set SLA</button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ {:else}
+ <div class="panel-body">
+ <div class="alert alert-info">
+ <h4>No Schedule</h4>
+ <p>This flow has not been scheduled.</p>
+ </div>
+ </div>
+ {/schedule}
+ </div>
<div class="panel panel-default">
<div class="panel-heading">Last Run Stats</div>
- {^lastRun}
+ {?lastRun}
<table class="table table-striped table-bordered table-condensed table-hover">
<tbody>
<tr>
@@ -57,3 +106,5 @@
{/lastRun}
</div>
</div><!-- /.col-lg-12 -->
+
+
src/web/js/azkaban.flow.view.js 117(+43 -74)
diff --git a/src/web/js/azkaban.flow.view.js b/src/web/js/azkaban.flow.view.js
index 9bb3d12..897f09b 100644
--- a/src/web/js/azkaban.flow.view.js
+++ b/src/web/js/azkaban.flow.view.js
@@ -46,7 +46,6 @@ azkaban.FlowTabView = Backbone.View.extend({
events: {
"click #graphViewLink": "handleGraphLinkClick",
"click #executionsViewLink": "handleExecutionLinkClick",
- "click #schedulingViewLink": "handleSchedulingLinkClick",
"click #summaryViewLink": "handleSummaryLinkClick"
},
@@ -67,49 +66,31 @@ azkaban.FlowTabView = Backbone.View.extend({
handleGraphLinkClick: function(){
$("#executionsViewLink").removeClass("active");
$("#graphViewLink").addClass("active");
- $('#schedulingViewLink').removeClass('active');
$('#summaryViewLink').removeClass('active');
$("#executionsView").hide();
$("#graphView").show();
- $('#schedulingView').hide();
$('#summaryView').hide();
},
handleExecutionLinkClick: function() {
$("#graphViewLink").removeClass("active");
$("#executionsViewLink").addClass("active");
- $('#schedulingViewLink').removeClass('active');
$('#summaryViewLink').removeClass('active');
$("#graphView").hide();
$("#executionsView").show();
- $('#schedulingView').hide();
$('#summaryView').hide();
executionModel.trigger("change:view");
},
- handleSchedulingLinkClick: function() {
- $('#graphViewLink').removeClass('active');
- $('#executionsViewLink').removeClass('active');
- $('#schedulingViewLink').addClass('active');
- $('#summaryViewLink').removeClass('active');
-
- $('#graphView').hide();
- $('#executionsView').hide();
- $('#schedulingView').show();
- $('#summaryView').hide();
- },
-
handleSummaryLinkClick: function() {
$('#graphViewLink').removeClass('active');
$('#executionsViewLink').removeClass('active');
- $('#schedulingViewLink').removeClass('active');
$('#summaryViewLink').addClass('active');
$('#graphView').hide();
$('#executionsView').hide();
- $('#schedulingView').hide();
$('#summaryView').show();
},
});
@@ -311,47 +292,6 @@ azkaban.ExecutionsView = Backbone.View.extend({
}
});
-var schedulingView;
-azkaban.SchedulingView = Backbone.View.extend({
- events: {
- },
-
- initialize: function(settings) {
- console.log("schedulingView initialize");
- this.model.bind('change:view', this.handleChangeView, this);
- this.model.bind('render', this.render, this);
- var schedules = [
- {
- scheduleId: "0",
- submitUser: "azkaban",
- firstSchedTime: "1",
- nextExecTime: "2",
- period: "3",
- }
- ];
-
- this.model.set({
- 'schedules': schedules
- });
- this.model.trigger('render');
- },
-
- handleChangeView: function(evt) {
- console.log("schedulingView handleChangeView");
- },
-
- render: function(evt) {
- console.log("schedulingView render");
- var data = {
- schedules: this.model.get('schedules')
- };
- dust.render("flowscheduling", data, function(err, out) {
- console.log(err);
- $('#schedulingView').html(out);
- });
- },
-});
-
var summaryView;
azkaban.SummaryView = Backbone.View.extend({
events: {
@@ -363,17 +303,53 @@ azkaban.SummaryView = Backbone.View.extend({
projectName: projectName,
flowId: flowId
};
- var lastRun = {};
+ /*var schedule = {
+ scheduleId: "0",
+ submitUser: "azkaban",
+ firstSchedTime: "1",
+ nextExecTime: "2",
+ period: "3",
+ };
+ var lastRun = {
+ maxMapSlots: 3,
+ maxReduceSlots: 9999,
+ totalMapSlots: 3,
+ totalReduceSlots: 9999,
+ numJobs: 3,
+ longestTaskTime: 1111
+ };*/
+ var lastRun = null;
this.model.bind('change:view', this.handleChangeView, this);
this.model.bind('render', this.render, this);
- this.model.set({
- 'general': general,
- 'lastRun': lastRun
- });
+
+ this.model.set({'general': general});
+ this.fetchSchedule();
+ this.fetchLastRun();
this.model.trigger('render');
},
+ fetchSchedule: function() {
+ var requestURL = contextURL + "/schedule"
+ var requestData = {
+ 'ajax': 'fetchSchedule',
+ 'projectId': projectId,
+ 'flowId': flowId
+ };
+ var model = this.model;
+ var successHandler = function(data) {
+ if (data.schedule != null) {
+ model.set({'schedule': data.schedule});
+ model.trigger('render');
+ }
+ };
+ $.get(requestURL, requestData, successHandler, 'json');
+ },
+
+ fetchLastRun: function() {
+
+ },
+
handleChangeView: function(evt) {
console.log("summaryView handleChangeView");
},
@@ -381,7 +357,9 @@ azkaban.SummaryView = Backbone.View.extend({
render: function(evt) {
console.log("summaryView render");
var data = {
+ flowName: flowId,
general: this.model.get('general'),
+ schedule: this.model.get('schedule'),
lastRun: this.model.get('lastRun')
};
dust.render("flowsummary", data, function(err, out) {
@@ -442,9 +420,6 @@ azkaban.GraphModel = Backbone.Model.extend({});
var executionModel;
azkaban.ExecutionModel = Backbone.Model.extend({});
-var schedulingModel;
-azkaban.SchedulingModel = Backbone.Model.extend({});
-
var summaryModel;
azkaban.SummaryModel = Backbone.Model.extend({});
@@ -459,12 +434,6 @@ $(function() {
model: executionModel
});
- schedulingModel = new azkaban.SchedulingModel();
- schedulingView = new azkaban.SchedulingView({
- el: $('#schedulingView'),
- model: schedulingModel
- });
-
summaryModel = new azkaban.SummaryModel();
summaryView = new azkaban.SummaryView({
el: $('#summaryView'),