|
@@ -36,6 +36,10 @@ App.Router.map(function() {
|
|
|
|
|
|
var RANGER_SITE = 'ranger-yarn-plugin-properties';
|
|
|
var RANGER_YARN_ENABLED = 'ranger-yarn-plugin-enabled';
|
|
|
+
|
|
|
+var YARN_SITE = 'yarn-site';
|
|
|
+var PREEMPTION_YARN_ENABLE = 'yarn.resourcemanager.scheduler.monitor.enable';
|
|
|
+var NODE_LABELS_YARN_ENABLED = 'yarn.node-labels.enabled';
|
|
|
/**
|
|
|
* The queues route.
|
|
|
*
|
|
@@ -204,10 +208,22 @@ App.CapschedRoute = Ember.Route.extend({
|
|
|
item.set(prop, attributes[prop][0]);
|
|
|
}
|
|
|
},
|
|
|
- saveCapSchedConfigs: function(saveMode) {
|
|
|
+ saveCapSchedConfigs: function(saveMode, forceRefresh) {
|
|
|
var store = this.get('store'),
|
|
|
that = this,
|
|
|
- capschedCtrl = this.controllerFor("capsched");
|
|
|
+ capschedCtrl = this.controllerFor("capsched"),
|
|
|
+ schedulerCtrl = this.controllerFor("capsched.scheduler"),
|
|
|
+ queuesconfCtrl = this.controllerFor("capsched.queuesconf"),
|
|
|
+ advancedCtrl = this.controllerFor("capsched.advanced"),
|
|
|
+ restartOrRefreshMap = {
|
|
|
+ schedulerTab: schedulerCtrl.get('isRefreshOrRestartNeeded') || false,
|
|
|
+ queuesTab: queuesconfCtrl.get('isRefreshOrRestartNeeded') || false,
|
|
|
+ advancedTab: advancedCtrl.get('isRefreshOrRestartNeeded') || false
|
|
|
+ };
|
|
|
+
|
|
|
+ if (forceRefresh) {
|
|
|
+ return this.forceRefreshOrRestartCapSched(saveMode);
|
|
|
+ }
|
|
|
|
|
|
var collectedLabels = capschedCtrl.get('queues').reduce(function (prev,q) {
|
|
|
return prev.pushObjects(q.get('labels.content'));
|
|
@@ -224,21 +240,37 @@ App.CapschedRoute = Ember.Route.extend({
|
|
|
opt = 'saveAndRefresh';
|
|
|
}
|
|
|
|
|
|
- capschedCtrl.startSpinner();
|
|
|
+ capschedCtrl.startSpinner(saveMode);
|
|
|
Em.RSVP.Promise.all([labels, queues, scheduler]).then(
|
|
|
Em.run.bind(that,'saveConfigsSuccess'),
|
|
|
Em.run.bind(that,'saveConfigsError', 'save')
|
|
|
).then(function () {
|
|
|
+ schedulerCtrl.set('isRefreshOrRestartNeeded', restartOrRefreshMap.schedulerTab);
|
|
|
+ queuesconfCtrl.set('isRefreshOrRestartNeeded', restartOrRefreshMap.queuesTab);
|
|
|
+ advancedCtrl.set('isRefreshOrRestartNeeded', restartOrRefreshMap.advancedTab);
|
|
|
if (opt) {
|
|
|
return store.relaunchCapSched(opt);
|
|
|
}
|
|
|
}).then(function(){
|
|
|
+ if (opt) {
|
|
|
+ schedulerCtrl.set('isRefreshOrRestartNeeded', false);
|
|
|
+ queuesconfCtrl.set('isRefreshOrRestartNeeded', false);
|
|
|
+ advancedCtrl.set('isRefreshOrRestartNeeded', false);
|
|
|
+ }
|
|
|
return store.getRmSchedulerConfigInfo();
|
|
|
}).catch(
|
|
|
Em.run.bind(this,'saveConfigsError', opt)
|
|
|
).finally(function(){
|
|
|
capschedCtrl.stopSpinner();
|
|
|
+ store.setLastSavedConfigXML();
|
|
|
});
|
|
|
+ },
|
|
|
+ viewConfigXmlDiff: function() {
|
|
|
+ var store = this.get('store'),
|
|
|
+ controller = this.controllerFor("capsched"),
|
|
|
+ lastSavedXML = store.get('lastSavedConfigXML'),
|
|
|
+ currentXmlConfigs = store.buildConfig('xml'),
|
|
|
+ diffConfigs = {baseXML: lastSavedXML, newXML: currentXmlConfigs};
|
|
|
}
|
|
|
},
|
|
|
beforeModel: function(transition) {
|
|
@@ -265,14 +297,29 @@ App.CapschedRoute = Ember.Route.extend({
|
|
|
});
|
|
|
return store.get('nodeLabels');
|
|
|
}).then(function() {
|
|
|
- return store.findQuery('config', {
|
|
|
+ var rangerEnabled = store.findQuery('config', {
|
|
|
siteName: RANGER_SITE,
|
|
|
configName: RANGER_YARN_ENABLED
|
|
|
- }).then(function() {
|
|
|
- return store.find('config', "siteName_" + RANGER_SITE + "_configName_" + RANGER_YARN_ENABLED)
|
|
|
- .then(function(data) {
|
|
|
- controller.set('isRangerEnabledForYarn', data.get('configValue'));
|
|
|
- });
|
|
|
+ });
|
|
|
+ var nodeLabelsEnabled = store.findQuery('config', {
|
|
|
+ siteName: YARN_SITE,
|
|
|
+ configName: NODE_LABELS_YARN_ENABLED
|
|
|
+ });
|
|
|
+ var preemptionEnabled = store.findQuery('config', {
|
|
|
+ siteName: YARN_SITE,
|
|
|
+ configName: PREEMPTION_YARN_ENABLE
|
|
|
+ });
|
|
|
+ Ember.RSVP.Promise.all([rangerEnabled, nodeLabelsEnabled, preemptionEnabled]).then(function() {
|
|
|
+ var rangerConfig = store.getById('config', "siteName_" + RANGER_SITE + "_configName_" + RANGER_YARN_ENABLED),
|
|
|
+ nodeLabelConfig = store.getById('config', "siteName_" + YARN_SITE + "_configName_" + NODE_LABELS_YARN_ENABLED),
|
|
|
+ preemptionConfig = store.getById('config', "siteName_" + YARN_SITE + "_configName_" + PREEMPTION_YARN_ENABLE),
|
|
|
+ rangerValue = rangerConfig.get('configValue'),
|
|
|
+ nodeLabelValue = nodeLabelConfig.get('configValue'),
|
|
|
+ preemptionValue = preemptionConfig.get('configValue');
|
|
|
+
|
|
|
+ controller.set('isRangerEnabledForYarn', rangerValue);
|
|
|
+ store.set('isNodeLabelsEnabledByRM', nodeLabelValue === "true");
|
|
|
+ controller.set('isPreemptionEnabledByYarn', preemptionValue);
|
|
|
});
|
|
|
}).then(function() {
|
|
|
loadingController.set('model', {
|
|
@@ -288,6 +335,7 @@ App.CapschedRoute = Ember.Route.extend({
|
|
|
}).then(function() {
|
|
|
return store.find('scheduler', 'scheduler');
|
|
|
}).then(function(scheduler){
|
|
|
+ store.setLastSavedConfigXML();
|
|
|
resolve(scheduler);
|
|
|
}).catch(function(e) {
|
|
|
reject(e);
|
|
@@ -295,7 +343,7 @@ App.CapschedRoute = Ember.Route.extend({
|
|
|
}, 'App: CapschedRoute#model');
|
|
|
},
|
|
|
loadingError: function (transition, error) {
|
|
|
- var refuseController = this.container.lookup('controller:capsched.refuse') || this.generateController('capsched.refuse'),
|
|
|
+ var refuseController = this.container.lookup('controller:refuse') || this.generateController('refuse'),
|
|
|
message = error.responseJSON || {'message': 'Something went wrong.'};
|
|
|
|
|
|
transition.abort();
|
|
@@ -306,10 +354,41 @@ App.CapschedRoute = Ember.Route.extend({
|
|
|
this.set('store.deletedQueues', []);
|
|
|
},
|
|
|
saveConfigsError: function(operation, err) {
|
|
|
- var response = error.responseJSON || {};
|
|
|
+ this.controllerFor("capsched").stopSpinner();
|
|
|
+ var response = {};
|
|
|
+ if (err && err.responseJSON) {
|
|
|
+ response = err.responseJSON;
|
|
|
+ }
|
|
|
response.simpleMessage = operation.capitalize() + ' failed!';
|
|
|
this.controllerFor("capsched").set('alertMessage', response);
|
|
|
- throw Error(err);
|
|
|
+ throw Error("Configs Error: ", err);
|
|
|
+ },
|
|
|
+ forceRefreshOrRestartCapSched: function(saveMode) {
|
|
|
+ var opt = '',
|
|
|
+ that = this,
|
|
|
+ store = this.get('store'),
|
|
|
+ capschedCtrl = this.controllerFor("capsched"),
|
|
|
+ schedulerCtrl = this.controllerFor("capsched.scheduler"),
|
|
|
+ queuesconfCtrl = this.controllerFor("capsched.queuesconf"),
|
|
|
+ advancedCtrl = this.controllerFor("capsched.advanced");
|
|
|
+
|
|
|
+ if (saveMode == 'restart') {
|
|
|
+ opt = 'saveAndRestart';
|
|
|
+ } else {
|
|
|
+ opt = 'saveAndRefresh';
|
|
|
+ }
|
|
|
+
|
|
|
+ capschedCtrl.startSpinner(saveMode);
|
|
|
+ store.relaunchCapSched(opt).then(function() {
|
|
|
+ schedulerCtrl.set('isRefreshOrRestartNeeded', false);
|
|
|
+ advancedCtrl.set('isRefreshOrRestartNeeded', false);
|
|
|
+ queuesconfCtrl.set('isRefreshOrRestartNeeded', false);
|
|
|
+ }).catch(
|
|
|
+ Em.run.bind(that, 'saveConfigsError', opt)
|
|
|
+ ).finally(function() {
|
|
|
+ capschedCtrl.stopSpinner();
|
|
|
+ store.setLastSavedConfigXML();
|
|
|
+ });
|
|
|
}
|
|
|
});
|
|
|
|
|
@@ -327,6 +406,13 @@ App.CapschedQueuesconfIndexRoute = Ember.Route.extend({
|
|
|
});
|
|
|
|
|
|
App.CapschedQueuesconfEditqueueRoute = Ember.Route.extend({
|
|
|
+ model: function(params, transition) {
|
|
|
+ var queue = this.store.getById('queue', params.queue_id);
|
|
|
+ if (queue) {
|
|
|
+ return queue;
|
|
|
+ }
|
|
|
+ this.transitionTo('capsched.queuesconf.editqueue', this.store.getById('queue', 'root'));
|
|
|
+ },
|
|
|
setupController: function(controller, model) {
|
|
|
controller.set('model', model);
|
|
|
this.controllerFor('capsched.queuesconf').set('selectedQueue', model);
|