You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2017/02/13 22:13:21 UTC
[13/50] [abbrv] ambari git commit: AMBARI-19418. Support setup queue
priority in Ambari - Capacity scheduler view. (Akhil PB via gauravn7)
AMBARI-19418. Support setup queue priority in Ambari - Capacity scheduler view. (Akhil PB via gauravn7)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/97994e23
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/97994e23
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/97994e23
Branch: refs/heads/branch-feature-AMBARI-12556
Commit: 97994e23f3b6ec71ff9911e43d9c4b135487acba
Parents: 92cf561
Author: Gaurav Nagar <gr...@gmail.com>
Authored: Fri Feb 10 15:46:59 2017 +0530
Committer: Gaurav Nagar <gr...@gmail.com>
Committed: Fri Feb 10 15:46:59 2017 +0530
----------------------------------------------------------------------
.../main/resources/ui/app/controllers/queue.js | 103 ++++++++++++++++++-
.../main/resources/ui/app/controllers/queues.js | 2 +-
.../src/main/resources/ui/app/models/queue.js | 11 ++
.../src/main/resources/ui/app/serializers.js | 5 +
.../src/main/resources/ui/app/store.js | 9 ++
.../main/resources/ui/app/templates/queue.hbs | 55 +++++++---
6 files changed, 171 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/97994e23/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queue.js
----------------------------------------------------------------------
diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queue.js b/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queue.js
index 589dcd0..d3adeb4 100644
--- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queue.js
+++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queue.js
@@ -23,9 +23,9 @@ var _stopState = 'STOPPED';
App.QueueController = Ember.ObjectController.extend({
needs:['queues','configs'],
+ isPriorityUtilizationSupported: Ember.computed.alias('store.isPriorityUtilizationSupported'),
isRangerEnabledForYarn : function() {
var isRanger = this.get('controllers.configs.isRangerEnabledForYarn');
- console.log("controllers.queue : isRanger : ", isRanger);
if (isRanger == null || typeof isRanger == 'undefined') {
return false;
}
@@ -159,6 +159,16 @@ App.QueueController = Ember.ObjectController.extend({
*/
orderingPolicyValues: [null,'fifo', 'fair'],
+ /**
+ * Possible array of options for ordering policy
+ * @type {Array}
+ */
+ orderingPolicyOptions: [
+ {label: '', value: null},
+ {label: 'FIFO', value: 'fifo'},
+ {label: 'Fair', value: 'fair'}
+ ],
+
// COMPUTED PROPERTIES
@@ -344,6 +354,16 @@ App.QueueController = Ember.ObjectController.extend({
return this.get('content.ordering_policy');
}.property('content.ordering_policy'),
+ currentLeafQueueOP: function(key, val) {
+ if (arguments.length > 1 && this.get('content.isLeafQ')) {
+ if (!this.get('isFairOP')) {
+ this.send('rollbackProp', 'enable_size_based_weight', this.get('content'));
+ }
+ this.set('content.ordering_policy', val || null);
+ }
+ return this.get('content.ordering_policy');
+ }.property('content.ordering_policy'),
+
/**
* Does ordering policy is equal to 'fair'
* @type {Boolean}
@@ -372,6 +392,87 @@ App.QueueController = Ember.ObjectController.extend({
}.bind(this));
}.observes('content'),
+ /**
+ * Add observer for queue priority.
+ * Sets ordering_policy=priority-utilization to parent queue if children queues have different priorities
+ * Also reset back t0 original ordering_policy if children have same zero priorities
+ * @method priorityObserver
+ */
+ priorityObserver: function() {
+ if (!this.get('isPriorityUtilizationSupported')) {
+ return;
+ }
+ var parentQueue = this.get('parentQueue');
+ if (parentQueue) {
+ var hasDifferent = this.isChildrenPrioritiesDifferent(parentQueue);
+ if (hasDifferent) {
+ this.setOrderingPolicyConfigs(parentQueue);
+ } else {
+ this.rollbackOrderingPolicyConfigs(parentQueue);
+ }
+ }
+ }.observes('content.priority'),
+
+ /**
+ * Returns boolean if children queues have different priorities for a given queue
+ * @method isChildrenPrioritiesDifferent
+ */
+ isChildrenPrioritiesDifferent: function(queue) {
+ var hasDifferent = false;
+ var children = queue.get('childrenQueues');
+ var priorities = children.map(function(que) {
+ return que.get('priority');
+ });
+ hasDifferent = priorities.some(function(prio) {
+ return prio > 0;
+ });
+ return hasDifferent;
+ },
+
+ /**
+ * Sets queue ordering_policy=priority-utilization when children queues have different priorities
+ * @method setOrderingPolicyConfigs
+ */
+ setOrderingPolicyConfigs: function(queue) {
+ queue.set('ordering_policy', 'priority-utilization');
+ },
+
+ /**
+ * Rollback queue ordering_policy
+ * @method rollbackOrderingPolicyConfigs
+ */
+ rollbackOrderingPolicyConfigs: function(queue) {
+ var changedAttrs = queue.changedAttributes();
+ if (changedAttrs.hasOwnProperty('ordering_policy') && changedAttrs['ordering_policy'][0] !== 'priority-utilization') {
+ this.send('rollbackProp', 'ordering_policy', queue);
+ } else {
+ queue.set('ordering_policy', null);
+ }
+ },
+
+ /**
+ * Add observer to watch queues ordering_policy
+ * In case, if leaf queue has ordering_policy=priority-utilization, set ordering_policy to default fifo, since leaf can not have priority-utilization ordering_policy
+ * Observed when all leaf queues are deleted and parent become leaf with ordering_policy=priority-utilization
+ * Deleting child queues would change parent ordering_policy based on the other children priorities
+ * @method watchQueueOrderingPolicy
+ */
+ watchQueueOrderingPolicy: function() {
+ if (!this.get('isPriorityUtilizationSupported')) {
+ return;
+ }
+ if (this.get('content.isLeafQ') && this.get('content.ordering_policy') == 'priority-utilization') {
+ this.set('content.ordering_policy', 'fifo');
+ }
+ if (!this.get('content.isLeafQ')) {
+ var queue = this.get('content');
+ if (this.isChildrenPrioritiesDifferent(queue)) {
+ this.setOrderingPolicyConfigs(queue);
+ } else {
+ this.rollbackOrderingPolicyConfigs(queue);
+ }
+ }
+ }.observes('content.isLeafQ', 'content', 'content.queuesArray.length'),
// METHODS
http://git-wip-us.apache.org/repos/asf/ambari/blob/97994e23/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queues.js
----------------------------------------------------------------------
diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queues.js b/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queues.js
index 2f9f2fe..ed2f60e 100644
--- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queues.js
+++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/controllers/queues.js
@@ -202,7 +202,7 @@ App.QueuesController = Ember.ArrayController.extend({
},
saveConfigError:function (operation, error) {
- var response = error.responseJSON;
+ var response = error.responseJSON || {};
response.simpleMessage = operation.capitalize() + ' failed!';
this.set('alertMessage',response);
},
http://git-wip-us.apache.org/repos/asf/ambari/blob/97994e23/contrib/views/capacity-scheduler/src/main/resources/ui/app/models/queue.js
----------------------------------------------------------------------
diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/models/queue.js b/contrib/views/capacity-scheduler/src/main/resources/ui/app/models/queue.js
index 9198aa5..e574159 100644
--- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/models/queue.js
+++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/models/queue.js
@@ -255,6 +255,7 @@ App.Queue = DS.Model.extend({
minimum_user_limit_percent: DS.attr('number', { defaultValue: 100 }),
maximum_applications: DS.attr('number', { defaultValue: null }),
maximum_am_resource_percent: DS.attr('number', { defaultValue: null }),
+ priority: DS.attr('number', {defaultValue: 0}),
disable_preemption: DS.attr('string', {defaultValue: ''}),
isPreemptionInherited: DS.attr('boolean', {defaultValue: true}),
@@ -283,6 +284,16 @@ App.Queue = DS.Model.extend({
return this.get('_overCapacity') || !Em.isEmpty(this.get('labels').filterBy('overCapacity'));
}.property('_overCapacity','labels.@each.overCapacity'),
+ childrenQueues: function() {
+ var queuesArray = this.get('queuesArray');
+ return this.store.all('queue')
+ .filterBy('depth', this.get('depth') + 1)
+ .filterBy('parentPath', this.get('path'))
+ .filter(function(queue) {
+ return queuesArray.contains(queue.get('name'));
+ });
+ }.property('queues'),
+
isInvalidMaxCapacity: false,
isInvalidLabelMaxCapacity: false,
http://git-wip-us.apache.org/repos/asf/ambari/blob/97994e23/contrib/views/capacity-scheduler/src/main/resources/ui/app/serializers.js
----------------------------------------------------------------------
diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/serializers.js b/contrib/views/capacity-scheduler/src/main/resources/ui/app/serializers.js
index 940d0f8..43d087d 100644
--- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/serializers.js
+++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/serializers.js
@@ -104,6 +104,7 @@ App.SerializerMixin = Em.Mixin.create({
ordering_policy: props[base_path + ".ordering-policy"] || null,
enable_size_based_weight: props[base_path + ".ordering-policy.fair.enable-size-based-weight"] || null,
default_node_label_expression: props[base_path + ".default-node-label-expression"] || null,
+ priority: (props[base_path + ".priority"])? +props[base_path + ".priority"] : 0,
labelsEnabled: props.hasOwnProperty(labelsPath),
disable_preemption: props[base_path + '.disable_preemption'] || '',
isPreemptionInherited: (props[base_path + '.disable_preemption'] !== undefined)?false:true
@@ -233,6 +234,10 @@ App.QueueSerializer = DS.RESTSerializer.extend(App.SerializerMixin,{
json[this.PREFIX + "." + record.get('path') + ".ordering-policy.fair.enable-size-based-weight"] = record.get('enable_size_based_weight');
}
+ if (this.get('store.isPriorityUtilizationSupported')) {
+ json[this.PREFIX + "." + record.get('path') + ".priority"] = record.get('priority') || 0;
+ }
+
// do not set property if not set
var ma = record.get('maximum_applications')||'';
if (ma) {
http://git-wip-us.apache.org/repos/asf/ambari/blob/97994e23/contrib/views/capacity-scheduler/src/main/resources/ui/app/store.js
----------------------------------------------------------------------
diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/store.js b/contrib/views/capacity-scheduler/src/main/resources/ui/app/store.js
index dce00c1..c9e9432 100644
--- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/store.js
+++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/store.js
@@ -168,6 +168,15 @@ App.ApplicationStore = DS.Store.extend({
return false;
}.property('stackId'),
+ isPriorityUtilizationSupported: function() {
+ var stackId = this.get('stackId');
+ var stackVersion = stackId.substr(stackId.indexOf('-') + 1);
+ if (stackVersion >= 2.6) {
+ return true;
+ }
+ return false;
+ }.property('stackId'),
+
hasDeletedQueues:Em.computed.notEmpty('deletedQueues.[]'),
deletedQueues:[],
http://git-wip-us.apache.org/repos/asf/ambari/blob/97994e23/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queue.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queue.hbs b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queue.hbs
index 87f00d9..69f5b3b 100644
--- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queue.hbs
+++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queue.hbs
@@ -363,28 +363,59 @@
</div>
{{/if}}
</div>
- <div class="form-group">
+ {{#if isPriorityUtilizationSupported}}
+ <div class="form-group">
+ {{tooltip-label
+ class="col-xs-6 control-label"
+ label='Priority'
+ message='The priority of queue, higher means more important. It should be a valid integer value, 0 is default value.'
+ }}
+ {{#if isOperator}}
+ <div class="col-xs-6 control-value">
+ {{int-input value=content.priority maxlength=10 class="input-sm input-int"}}
+ {{#if queueDirtyFilelds.priority}}
+ <div class="btn-group btn-group-xs" >
+ <a {{action 'rollbackProp' 'priority' content}} href="#" class="btn btn-default btn-warning"><i class="fa fa-undo"></i></a>
+ </div>
+ {{/if}}
+ </div>
+ {{else}}
+ <div class="col-xs-6">
+ <p class="form-control-static">{{content.priority}}</p>
+ </div>
+ {{/if}}
+ </div>
+ {{/if}}
+ {{#if content.isLeafQ}}
+ <div class="form-group">
{{tooltip-label
class="col-xs-6 control-label"
- label='Ordering policy'
+ label='Ordering Policy'
message='The ordering policy to use for applications scheduled to this queue. <br/> FIFO: Applications get available capacity based on order they are submitted <br/> Fair: Applications will get fair share of capacity, regardless of order submitted'}}
{{#if isOperator}}
- <div class="col-xs-6 control-value input-percent-wrap">
- <div>
- {{view Ember.Select class="form-control input-sm" content=orderingPolicyValues value=currentOP }}
- </div>
- {{#if queueDirtyFilelds.ordering_policy}}
+ <div class="col-xs-6 control-value input-percent-wrap">
+ <div>
+ {{view Ember.Select
+ class="form-control input-sm"
+ contentBinding="orderingPolicyOptions"
+ optionValuePath="content.value"
+ optionLabelPath="content.label"
+ value=currentLeafQueueOP
+ }}
+ </div>
+ {{#if queueDirtyFilelds.ordering_policy}}
<div class="btn-group btn-group-xs" >
<a {{action 'rollbackProp' 'ordering_policy' content}} href="#" class="btn btn-default btn-warning"><i class="fa fa-undo"></i></a>
</div>
- {{/if}}
- </div>
+ {{/if}}
+ </div>
{{else}}
- <div class="col-xs-6">
+ <div class="col-xs-6">
<p class="form-control-static">{{content.ordering_policy}}</p>
- </div>
+ </div>
{{/if}}
- </div>
+ </div>
+ {{/if}}
{{#if isFairOP}}
<div class="form-group">
{{tooltip-label