Repository: ambari Updated Branches: refs/heads/trunk fdc2d7798 -> 7f491baea
AMBARI-9111: Various cleanup for CS view Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7f491bae Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7f491bae Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7f491bae Branch: refs/heads/trunk Commit: 7f491baea39b57c2645de0aa216adf0f4324ced9 Parents: fdc2d77 Author: sposetti <[email protected]> Authored: Wed Jan 14 10:20:40 2015 -0500 Committer: sposetti <[email protected]> Committed: Wed Jan 14 10:20:40 2015 -0500 ---------------------------------------------------------------------- .../property-validator-view/docs/index.md | 2 +- contrib/views/capacity-scheduler/cs-view.jpg | Bin 0 -> 273865 bytes contrib/views/capacity-scheduler/pom.xml | 2 +- contrib/views/capacity-scheduler/readme.md | 31 ++- .../src/main/resources/ui/app/adapters.js | 57 ++++-- .../ui/app/assets/data/capacity-scheduler.json | 90 --------- .../resources/ui/app/assets/data/privilege.json | 1 + .../assets/data/scheduler-configuration.json | 16 +- .../ui/app/components/capacityInput.js | 12 +- .../ui/app/components/totalCapacity.js | 6 +- .../main/resources/ui/app/controllers/queue.js | 18 -- .../main/resources/ui/app/controllers/queues.js | 6 +- .../src/main/resources/ui/app/models/queue.js | 21 +- .../resources/ui/app/styles/application.less | 197 +++++++++++++++++-- .../ui/app/templates/capacityEditForm.hbs | 27 ++- .../ui/app/templates/components/capacityBar.hbs | 2 +- .../app/templates/components/totalCapacity.hbs | 43 ++-- .../app/templates/components/userGroupInput.hbs | 8 +- .../main/resources/ui/app/templates/queue.hbs | 142 ++++++------- .../main/resources/ui/app/templates/queues.hbs | 2 +- .../ui/app/templates/schedulerPanel.hbs | 60 ++++-- .../src/main/resources/ui/config.coffee | 2 +- .../src/main/resources/view.xml | 15 +- contrib/views/tez/readme.md | 2 +- 24 files changed, 460 insertions(+), 302 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/ambari-views/examples/property-validator-view/docs/index.md ---------------------------------------------------------------------- diff --git a/ambari-views/examples/property-validator-view/docs/index.md b/ambari-views/examples/property-validator-view/docs/index.md index ae00c06..09d3224 100644 --- a/ambari-views/examples/property-validator-view/docs/index.md +++ b/ambari-views/examples/property-validator-view/docs/index.md @@ -48,7 +48,7 @@ The view can be built as a maven project. The build will produce the view archive. - ambari-views/examples/property-view/target/property-validator-view-0.1.0.jar + target/property-validator-view-0.1.0.jar Place the view archive on the Ambari Server and restart to deploy. http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/cs-view.jpg ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/cs-view.jpg b/contrib/views/capacity-scheduler/cs-view.jpg new file mode 100644 index 0000000..8c345c37 Binary files /dev/null and b/contrib/views/capacity-scheduler/cs-view.jpg differ http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/pom.xml ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/pom.xml b/contrib/views/capacity-scheduler/pom.xml index 7b0eb41..c06cfb1 100644 --- a/contrib/views/capacity-scheduler/pom.xml +++ b/contrib/views/capacity-scheduler/pom.xml @@ -19,7 +19,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.apache.ambari.view</groupId> <artifactId>capacity-scheduler</artifactId> - <version>0.2.0-SNAPSHOT</version> + <version>0.3.0-SNAPSHOT</version> <name>Capacity Scheduler</name> <parent> http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/readme.md ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/readme.md b/contrib/views/capacity-scheduler/readme.md index 6428d21..adfd2d2 100644 --- a/contrib/views/capacity-scheduler/readme.md +++ b/contrib/views/capacity-scheduler/readme.md @@ -35,11 +35,11 @@ The view can be built as a maven project. The build will produce the view archive. - target/capacity-scheduler-0.2.0-SNAPSHOT.jar + target/capacity-scheduler-0.3.0-SNAPSHOT.jar Place the view archive on the Ambari Server and restart to deploy. - cp capacity-scheduler-0.2.0-SNAPSHOT /var/lib/ambari-server/resources/views/ + cp capacity-scheduler-0.3.0-SNAPSHOT /var/lib/ambari-server/resources/views/ ambari-server restart Deploying the View @@ -49,7 +49,7 @@ Use the [Ambari Vagrant](https://cwiki.apache.org/confluence/display/AMBARI/Quic Deploy the Capacity Scheduler view into Ambari. - cp capacity-scheduler-0.2.0-SNAPSHOT /var/lib/ambari-server/resources/views/ + cp capacity-scheduler-0.3.0-SNAPSHOT /var/lib/ambari-server/resources/views/ ambari-server restart From the Ambari Administration interface, create a view instance. @@ -65,4 +65,27 @@ From the Ambari Administration interface, create a view instance. Login to Ambari and browse to the view instance. - http://c6401.ambari.apache.org:8080/#/main/views/CAPACITY-SCHEDULER/0.2.0/CS_1 + http://c6401.ambari.apache.org:8080/#/main/views/CAPACITY-SCHEDULER/0.3.0/CS_1 + +Local Development +----- +If you want to perform UI development without having to build and redeploy the view package, +you can mount the build target output as a symlink to your vagrant instance. +UI changes will be picked-up with a browser refresh. + +After building and deploying the View, delete the view work directory on the Ambari Server. + + cd /var/lib/ambari-server/resources/views/work + rm -rf CAPACITY-SCHEDULER\{0.3.0\}/ + +Create a symlink from the vagrant machine running your Ambari Server to your local machine. + + ln -s /vagrant/ambari/contrib/views/capacity-scheduler/target/classes/ CAPACITY-SCHEDULER\{0.3.0\} + +Restart Ambari Server, login and browse to the view. + + ambari-server restart + http://c6401.ambari.apache.org:8080/#/main/views/CAPACITY-SCHEDULER/0.3.0/CS_1 + +If you modify the view UI code on your machine and re-build, the UI will pickup +the changes on browser refresh. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/adapters.js ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/adapters.js b/contrib/views/capacity-scheduler/src/main/resources/ui/app/adapters.js index cee4ac1..3c47a90 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/adapters.js +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/adapters.js @@ -97,6 +97,8 @@ App.QueueAdapter = DS.Adapter.extend({ findAll: function(store, type) { var adapter = this; var uri = _getCapacitySchedulerUri(adapter.clusterName, adapter.tag); + if (App.testMode) + uri = uri + "/scheduler-configuration.json"; return new Ember.RSVP.Promise(function(resolve, reject) { adapter.ajax(uri).then(function(data) { Ember.run(null, resolve, data); @@ -110,8 +112,11 @@ App.QueueAdapter = DS.Adapter.extend({ getPrivilege:function () { var uri = _getCapacitySchedulerUri(this.clusterName, this.tag); + uri = [uri,'privilege'].join('/'); + if (App.testMode) + uri = uri + ".json"; return new Ember.RSVP.Promise(function(resolve, reject) { - this.ajax([uri,'privilege'].join('/'),'GET').then(function(data) { + this.ajax(uri,'GET').then(function(data) { Ember.run(null, resolve, data); }, function(jqXHR) { jqXHR.then = null; @@ -238,13 +243,13 @@ App.ApplicationSerializer = DS.RESTSerializer.extend({ prefix = this.PREFIX; records.forEach(function (record) { if (record.id == 'scheduler') { - config[prefix + ".maximum-am-resource-percent"] = record.get('maximum_am_resource_percent'); + config[prefix + ".maximum-am-resource-percent"] = record.get('maximum_am_resource_percent')/100; // convert back to decimal config[prefix + ".maximum-applications"] = record.get('maximum_applications'); config[prefix + ".node-locality-delay"] = record.get('node_locality_delay'); + config[prefix + ".resource-calculator"] = record.get('resource_calculator'); } else { config[prefix + "." + record.get('path') + ".unfunded.capacity"] = record.get('unfunded_capacity'); config[prefix + "." + record.get('path') + ".acl_administer_queue"] = record.get('acl_administer_queue'); - config[prefix + "." + record.get('path') + ".acl_administer_jobs"] = record.get('acl_administer_jobs'); config[prefix + "." + record.get('path') + ".acl_submit_applications"] = record.get('acl_submit_applications'); config[prefix + "." + record.get('path') + ".minimum-user-limit-percent"] = record.get('minimum_user_limit_percent'); config[prefix + "." + record.get('path') + ".maximum-capacity"] = record.get('maximum_capacity'); @@ -252,6 +257,19 @@ App.ApplicationSerializer = DS.RESTSerializer.extend({ config[prefix + "." + record.get('path') + ".state"] = record.get('state'); config[prefix + "." + record.get('path') + ".capacity"] = record.get('capacity'); config[prefix + "." + record.get('path') + ".queues"] = record.get('queueNames')||''; + + // do not set property if not set + var ma = record.get('maximum_applications')||''; + if (ma) { + config[prefix + "." + record.get('path') + ".maximum-applications"] = ma; + } + + // do not set property if not set + var marp = record.get('maximum_am_resource_percent')||''; + if (marp) { + marp = marp/100; // convert back to decimal + config[prefix + "." + record.get('path') + ".maximum-am-resource-percent"] = marp; + } }; }); @@ -272,9 +290,10 @@ App.ApplicationSerializer = DS.RESTSerializer.extend({ var scheduler = [{ id:'scheduler', - maximum_am_resource_percent:props[this.PREFIX + ".maximum-am-resource-percent"], + maximum_am_resource_percent:props[this.PREFIX + ".maximum-am-resource-percent"]*100, // convert to percent maximum_applications:props[this.PREFIX + ".maximum-applications"], - node_locality_delay:props[this.PREFIX + ".node-locality-delay"] + node_locality_delay:props[this.PREFIX + ".node-locality-delay"], + resource_calculator:props[this.PREFIX + ".resource-calculator"] }]; queues = _recurseQueues(null, "root", 0, props, queues, store); @@ -287,9 +306,10 @@ App.ApplicationSerializer = DS.RESTSerializer.extend({ var scheduler = { id:'scheduler', - maximum_am_resource_percent:props[this.PREFIX + ".maximum-am-resource-percent"], + maximum_am_resource_percent:props[this.PREFIX + ".maximum-am-resource-percent"]*100, // convert to percent maximum_applications:props[this.PREFIX + ".maximum-applications"], - node_locality_delay:props[this.PREFIX + ".node-locality-delay"] + node_locality_delay:props[this.PREFIX + ".node-locality-delay"], + resource_calculator:props[this.PREFIX + ".resource-calculator"] }; queues = _recurseQueues(null, "root", 0, props, queues, store); @@ -304,9 +324,10 @@ App.ApplicationSerializer = DS.RESTSerializer.extend({ var scheduler = { id:'scheduler', - maximum_am_resource_percent:props[this.PREFIX + ".maximum-am-resource-percent"], + maximum_am_resource_percent:props[this.PREFIX + ".maximum-am-resource-percent"]*100, // convert to percent maximum_applications:props[this.PREFIX + ".maximum-applications"], - node_locality_delay:props[this.PREFIX + ".node-locality-delay"] + node_locality_delay:props[this.PREFIX + ".node-locality-delay"], + resource_calculator:props[this.PREFIX + ".resource-calculator"] }; queues = _recurseQueues(null, "root", 0, props, queues, store); @@ -362,15 +383,22 @@ App.ApplicationSerializer = DS.RESTSerializer.extend({ q.id = q.path.dasherize(); q.unfunded_capacity = props[prefix + "." + q.path + ".unfunded.capacity"]; + + q.state = props[prefix + "." + q.path + ".state"]; q.acl_administer_queue = props[prefix + "." + q.path + ".acl_administer_queue"]; - q.acl_administer_jobs = props[prefix + "." + q.path + ".acl_administer_jobs"]; q.acl_submit_applications = props[prefix + "." + q.path + ".acl_submit_applications"]; - q.minimum_user_limit_percent = props[prefix + "." + q.path + ".minimum-user-limit-percent"]; + + q.capacity = props[prefix + "." + q.path + ".capacity"]; q.maximum_capacity = props[prefix + "." + q.path + ".maximum-capacity"]; + q.user_limit_factor = props[prefix + "." + q.path + ".user-limit-factor"]; - q.state = props[prefix + "." + q.path + ".state"]; + q.minimum_user_limit_percent = props[prefix + "." + q.path + ".minimum-user-limit-percent"]; + q.maximum_applications = props[prefix + "." + q.path + ".maximum-applications"]; + q.maximum_am_resource_percent = props[prefix + "." + q.path + ".maximum-am-resource-percent"] + + if (q.maximum_am_resource_percent) + q.maximum_am_resource_percent = q.maximum_am_resource_percent*100; // convert to percent - q.capacity = props[prefix + "." + q.path + ".capacity"]; q.queueNames = props[prefix + "." + q.path + ".queues"]; return q; @@ -410,6 +438,9 @@ function _recurseQueues(parentQueue, queueName, depth, props, queues, store) { * @return cluster name URI */ function _getCapacitySchedulerUri() { + if (App.testMode) + return "/data"; + var parts = window.location.pathname.match(/\/[^\/]*/g); var view = parts[1]; var version = '/versions' + parts[2]; http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/capacity-scheduler.json ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/capacity-scheduler.json b/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/capacity-scheduler.json deleted file mode 100644 index bee7fa2..0000000 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/capacity-scheduler.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "href" : "http://c6403.ambari.apache.org:8080/api/v1/clusters/MyCluster/configurations?type=capacity-scheduler&tag=version1400218672484", - "items" : [ - { - "href" : "http://c6403.ambari.apache.org:8080/api/v1/clusters/MyCluster/configurations?type=capacity-scheduler&tag=version1400218672484", - "tag" : "version1400218672484", - "type" : "capacity-scheduler", - "Config" : { - "cluster_name" : "MyCluster" - }, - "properties" : { - "yarn.scheduler.capacity.maximum-am-resource-percent" : "0.2", - "yarn.scheduler.capacity.maximum-applications" : "10000", - "yarn.scheduler.capacity.node-locality-delay" : "40", - "yarn.scheduler.capacity.root.Engineering.Development.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Engineering.Development.acl_administer_queue" : "*", - "yarn.scheduler.capacity.root.Engineering.Development.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Engineering.Development.capacity" : "20", - "yarn.scheduler.capacity.root.Engineering.Development.maximum-capacity" : "100", - "yarn.scheduler.capacity.root.Engineering.Development.state" : "RUNNING", - "yarn.scheduler.capacity.root.Engineering.Development.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Engineering.QE.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Engineering.QE.acl_administer_queue" : " ", - "yarn.scheduler.capacity.root.Engineering.QE.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Engineering.QE.capacity" : "80", - "yarn.scheduler.capacity.root.Engineering.QE.maximum-capacity" : "90", - "yarn.scheduler.capacity.root.Engineering.QE.state" : "RUNNING", - "yarn.scheduler.capacity.root.Engineering.QE.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Engineering.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Engineering.acl_administer_queue" : "user1,user2 group2", - "yarn.scheduler.capacity.root.Engineering.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Engineering.capacity" : "60", - "yarn.scheduler.capacity.root.Engineering.maximum-capacity" : "100", - "yarn.scheduler.capacity.root.Engineering.queues" : "Development,QE", - "yarn.scheduler.capacity.root.Engineering.state" : "RUNNING", - "yarn.scheduler.capacity.root.Engineering.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Marketing.Advertising.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Marketing.Advertising.acl_administer_queue" : " ", - "yarn.scheduler.capacity.root.Marketing.Advertising.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Marketing.Advertising.capacity" : "30", - "yarn.scheduler.capacity.root.Marketing.Advertising.maximum-capacity" : "40", - "yarn.scheduler.capacity.root.Marketing.Advertising.state" : "STOPPED", - "yarn.scheduler.capacity.root.Marketing.Advertising.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Marketing.Sales.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Marketing.Sales.acl_administer_queue" : " group5", - "yarn.scheduler.capacity.root.Marketing.Sales.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Marketing.Sales.capacity" : "70", - "yarn.scheduler.capacity.root.Marketing.Sales.maximum-capacity" : "80", - "yarn.scheduler.capacity.root.Marketing.Sales.minimum-user-limit-percent" : "20", - "yarn.scheduler.capacity.root.Marketing.Sales.state" : "RUNNING", - "yarn.scheduler.capacity.root.Marketing.Sales.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Marketing.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Marketing.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Marketing.acl_administer_queue" : " group5", - "yarn.scheduler.capacity.root.Marketing.capacity" : "10", - "yarn.scheduler.capacity.root.Marketing.maximum-capacity" : "40", - "yarn.scheduler.capacity.root.Marketing.queues" : "Sales,Advertising", - "yarn.scheduler.capacity.root.Marketing.state" : "RUNNING", - "yarn.scheduler.capacity.root.Marketing.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Support.Services.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Support.Services.acl_administer_queue" : "*", - "yarn.scheduler.capacity.root.Support.Services.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Support.Services.capacity" : "80", - "yarn.scheduler.capacity.root.Support.Services.maximum-capacity" : "100", - "yarn.scheduler.capacity.root.Support.Services.minimum-user-limit-percent" : "20", - "yarn.scheduler.capacity.root.Support.Services.state" : "RUNNING", - "yarn.scheduler.capacity.root.Support.Services.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Support.Training.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Support.Training.acl_administer_queue" : "user2", - "yarn.scheduler.capacity.root.Support.Training.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Support.Training.capacity" : "20", - "yarn.scheduler.capacity.root.Support.Training.maximum-capacity" : "60", - "yarn.scheduler.capacity.root.Support.Training.state" : "RUNNING", - "yarn.scheduler.capacity.root.Support.Training.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Support.acl_administer_jobs" : "*", - "yarn.scheduler.capacity.root.Support.acl_administer_queue" : " ", - "yarn.scheduler.capacity.root.Support.acl_submit_applications" : "*", - "yarn.scheduler.capacity.root.Support.capacity" : "30", - "yarn.scheduler.capacity.root.Support.maximum-capacity" : "100", - "yarn.scheduler.capacity.root.Support.queues" : "Training,Services", - "yarn.scheduler.capacity.root.Support.state" : "RUNNING", - "yarn.scheduler.capacity.root.Support.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.acl_administer_queue" : "*", - "yarn.scheduler.capacity.root.capacity" : "100", - "yarn.scheduler.capacity.root.queues" : "Support,Marketing,Engineering", - "yarn.scheduler.capacity.root.unfunded.capacity" : "50" - } - } - ] -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/privilege.json ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/privilege.json b/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/privilege.json new file mode 100644 index 0000000..f32a580 --- /dev/null +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/privilege.json @@ -0,0 +1 @@ +true \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/scheduler-configuration.json ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/scheduler-configuration.json b/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/scheduler-configuration.json index bee7fa2..b3f70ad 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/scheduler-configuration.json +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/assets/data/scheduler-configuration.json @@ -9,39 +9,34 @@ "cluster_name" : "MyCluster" }, "properties" : { - "yarn.scheduler.capacity.maximum-am-resource-percent" : "0.2", + "yarn.scheduler.capacity.maximum-am-resource-percent" : "0.35", "yarn.scheduler.capacity.maximum-applications" : "10000", "yarn.scheduler.capacity.node-locality-delay" : "40", - "yarn.scheduler.capacity.root.Engineering.Development.acl_administer_jobs" : "*", + "yarn.scheduler.capacity.resource-calculator" : "org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator", "yarn.scheduler.capacity.root.Engineering.Development.acl_administer_queue" : "*", "yarn.scheduler.capacity.root.Engineering.Development.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Engineering.Development.capacity" : "20", "yarn.scheduler.capacity.root.Engineering.Development.maximum-capacity" : "100", "yarn.scheduler.capacity.root.Engineering.Development.state" : "RUNNING", "yarn.scheduler.capacity.root.Engineering.Development.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Engineering.QE.acl_administer_jobs" : "*", "yarn.scheduler.capacity.root.Engineering.QE.acl_administer_queue" : " ", "yarn.scheduler.capacity.root.Engineering.QE.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Engineering.QE.capacity" : "80", "yarn.scheduler.capacity.root.Engineering.QE.maximum-capacity" : "90", "yarn.scheduler.capacity.root.Engineering.QE.state" : "RUNNING", "yarn.scheduler.capacity.root.Engineering.QE.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Engineering.acl_administer_jobs" : "*", "yarn.scheduler.capacity.root.Engineering.acl_administer_queue" : "user1,user2 group2", "yarn.scheduler.capacity.root.Engineering.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Engineering.capacity" : "60", "yarn.scheduler.capacity.root.Engineering.maximum-capacity" : "100", "yarn.scheduler.capacity.root.Engineering.queues" : "Development,QE", - "yarn.scheduler.capacity.root.Engineering.state" : "RUNNING", "yarn.scheduler.capacity.root.Engineering.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Marketing.Advertising.acl_administer_jobs" : "*", "yarn.scheduler.capacity.root.Marketing.Advertising.acl_administer_queue" : " ", "yarn.scheduler.capacity.root.Marketing.Advertising.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Marketing.Advertising.capacity" : "30", "yarn.scheduler.capacity.root.Marketing.Advertising.maximum-capacity" : "40", "yarn.scheduler.capacity.root.Marketing.Advertising.state" : "STOPPED", "yarn.scheduler.capacity.root.Marketing.Advertising.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Marketing.Sales.acl_administer_jobs" : "*", "yarn.scheduler.capacity.root.Marketing.Sales.acl_administer_queue" : " group5", "yarn.scheduler.capacity.root.Marketing.Sales.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Marketing.Sales.capacity" : "70", @@ -49,7 +44,6 @@ "yarn.scheduler.capacity.root.Marketing.Sales.minimum-user-limit-percent" : "20", "yarn.scheduler.capacity.root.Marketing.Sales.state" : "RUNNING", "yarn.scheduler.capacity.root.Marketing.Sales.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Marketing.acl_administer_jobs" : "*", "yarn.scheduler.capacity.root.Marketing.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Marketing.acl_administer_queue" : " group5", "yarn.scheduler.capacity.root.Marketing.capacity" : "10", @@ -57,7 +51,6 @@ "yarn.scheduler.capacity.root.Marketing.queues" : "Sales,Advertising", "yarn.scheduler.capacity.root.Marketing.state" : "RUNNING", "yarn.scheduler.capacity.root.Marketing.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Support.Services.acl_administer_jobs" : "*", "yarn.scheduler.capacity.root.Support.Services.acl_administer_queue" : "*", "yarn.scheduler.capacity.root.Support.Services.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Support.Services.capacity" : "80", @@ -65,14 +58,15 @@ "yarn.scheduler.capacity.root.Support.Services.minimum-user-limit-percent" : "20", "yarn.scheduler.capacity.root.Support.Services.state" : "RUNNING", "yarn.scheduler.capacity.root.Support.Services.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Support.Training.acl_administer_jobs" : "*", "yarn.scheduler.capacity.root.Support.Training.acl_administer_queue" : "user2", "yarn.scheduler.capacity.root.Support.Training.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Support.Training.capacity" : "20", "yarn.scheduler.capacity.root.Support.Training.maximum-capacity" : "60", "yarn.scheduler.capacity.root.Support.Training.state" : "RUNNING", "yarn.scheduler.capacity.root.Support.Training.user-limit-factor" : "1", - "yarn.scheduler.capacity.root.Support.acl_administer_jobs" : "*", + "yarn.scheduler.capacity.root.Support.Training.minimum-user-limit-percent" : "100", + "yarn.scheduler.capacity.root.Support.Training.maximum-applications" : "4500", + "yarn.scheduler.capacity.root.Support.Training.maximum-am-resource-percent" : ".25", "yarn.scheduler.capacity.root.Support.acl_administer_queue" : " ", "yarn.scheduler.capacity.root.Support.acl_submit_applications" : "*", "yarn.scheduler.capacity.root.Support.capacity" : "30", http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/capacityInput.js ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/capacityInput.js b/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/capacityInput.js index b46933a..0bf4b85 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/capacityInput.js +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/capacityInput.js @@ -18,6 +18,16 @@ var App = require('app'); +App.InputRangeComponent = Em.TextField.extend({ + type: 'range', + + action: 'mouseUp', + + mouseUp: function () { + var value = this.get('value'); + this.sendAction('action', value); + } +}); App.FocusInputComponent = Ember.TextField.extend({ becomeFocused: function() { @@ -86,7 +96,7 @@ App.MaxCapacityInputComponent = App.CapacityInputComponent.extend({ return queue.set('maximum_capacity',capacity); }; if (max_capacity < capacity && queue.get('isDirty')) { - queue.get('errors').add('maximum_capacity', 'Maximum capacity must be greater then capacity'); + queue.get('errors').add('maximum_capacity', 'Maximum must be equal or greater than capacity'); } else { queue.get('errors').remove('maximum_capacity'); } http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/totalCapacity.js ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/totalCapacity.js b/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/totalCapacity.js index 5e35b30..806cf3b 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/totalCapacity.js +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/components/totalCapacity.js @@ -43,8 +43,8 @@ App.TotalCapacityComponent = Ember.Component.extend({ allQueues:[], allQueuesArranged:[], - isEdit:false, - + isEdit: true, + disableEdit:function () { this.set('isEdit',false); }.observes('allQueues'), @@ -56,7 +56,7 @@ App.TotalCapacityComponent = Ember.Component.extend({ }), totalCapacity: Ember.computed.sum('leafQueuesCapacity'), - + leafQueues:function () { return this.allQueuesArranged.filterBy('parentPath',this.get('currentPrPath')).filterBy('isNew',false); }.property('allQueuesArranged.length','currentPrPath'), http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/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 a0db1f1..1bffbea 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 @@ -67,12 +67,6 @@ App.QueueController = Ember.ObjectController.extend({ } }, - toggleEditRA:function () { - this.toggleProperty('isEditRA'); - }, - toggleEditACL:function () { - this.toggleProperty('isEditACL'); - }, rollbackProp:function(prop){ attributes = this.content.changedAttributes(); if (attributes.hasOwnProperty(prop)) { @@ -106,9 +100,6 @@ App.QueueController = Ember.ObjectController.extend({ allQueues:Em.computed.alias('controllers.queues.content'), allQueuesArranged:Em.computed.alias('controllers.queues.arrangedContent'), - isEditRA:false, - isEditACL:false, - handleAcl:function (key,value) { if (value) { this.set(key,(value == '*')?'*':' '); @@ -125,15 +116,6 @@ App.QueueController = Ember.ObjectController.extend({ return attributes.hasOwnProperty('acl_administer_queue'); }.property('content.acl_administer_queue'), - acl_administer_jobs: function (key, value, previousValue) { - return this.handleAcl('content.acl_administer_jobs',value); - }.property('content.acl_administer_jobs'), - aaj_anyone:Ember.computed.equal('acl_administer_jobs', '*'), - aaj_dirty:function () { - var attributes = this.content.changedAttributes(); - return attributes.hasOwnProperty('acl_administer_jobs'); - }.property('content.acl_administer_jobs'), - acl_submit_applications: function (key, value, previousValue) { return this.handleAcl('content.acl_submit_applications',value); }.property('content.acl_submit_applications'), http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/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 cc20706..b03e633 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 @@ -80,9 +80,6 @@ App.QueuesController = Ember.ArrayController.extend({ this.set('hasDeletedQueues',false); }, - toggleEditScheduler:function () { - this.toggleProperty('isEditScheduler'); - }, clearAlert:function () { this.set('alertMessage',null); } @@ -98,9 +95,8 @@ App.QueuesController = Ember.ArrayController.extend({ isOperator:false, isNotOperator:cmp.not('isOperator'), - isEditScheduler:false, - isWaitingPath:false, + /** * check if RM needs refresh * @type {bool} http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/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 3219660..cf22437 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 @@ -21,7 +21,8 @@ var App = require('app'); App.Scheduler = DS.Model.extend({ maximum_am_resource_percent: DS.attr('number', { defaultValue: 0 }), maximum_applications: DS.attr('number', { defaultValue: 0 }), - node_locality_delay: DS.attr('number', { defaultValue: 0 }) + node_locality_delay: DS.attr('number', { defaultValue: 0 }), + resource_calculator: DS.attr('string', { defaultValue: '' }), }); /** @@ -34,29 +35,25 @@ App.Queue = DS.Model.extend({ depth: DS.attr('number'), path: DS.attr('string'), - // cs props - // queue props state: DS.attr('string', { defaultValue: 'RUNNING' }), + acl_administer_queue: DS.attr('string', { defaultValue: '*' }), + acl_submit_applications: DS.attr('string', { defaultValue: '*' }), capacity: DS.attr('number', { defaultValue: 0 }), maximum_capacity: DS.attr('number', { defaultValue: 0 }), unfunded_capacity: DS.attr('number', { defaultValue: 0 }), - - acl_administer_queue: DS.attr('string', { defaultValue: '*' }), - acl_administer_jobs: DS.attr('string', { defaultValue: '*' }), - acl_submit_applications: DS.attr('string', { defaultValue: '*' }), - - minimum_user_limit_percent: DS.attr('number', { defaultValue: 100 }), + user_limit_factor: DS.attr('number', { defaultValue: 1 }), - + minimum_user_limit_percent: DS.attr('number', { defaultValue: 100 }), + maximum_applications: DS.attr('number', { defaultValue: '' }), + maximum_am_resource_percent: DS.attr('number', { defaultValue: '' }), + queueNames: DS.attr('string'), queueNamesArray:function () { return (this.get('queueNames.length')>0)?this.get('queueNames').split(','):[]; }.property('queueNames'), - - overCapacity:false, //new queue flag http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/styles/application.less ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/styles/application.less b/contrib/views/capacity-scheduler/src/main/resources/ui/app/styles/application.less index 8f394b8..df8148e 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/styles/application.less +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/styles/application.less @@ -16,8 +16,31 @@ * limitations under the License. */ +.queue-capacity .peer-toggle { + width: 100%; + // background: #f7f7f7; + //border: 1px solid #e4e4e4; + text-align: left; + padding: 3px; +} + +a .peer-toggle { + color: #555; + text-decoration: none; + font-size: .8em; + } + +.row.queue-acl-row { + padding-left:15px; +} + +.row .queue-resources { + padding-left: 0px; + padding-right: 30px; +} + .wrap { - padding: 15px; + padding: 0px; } .add-queue { @@ -29,14 +52,44 @@ } } +.input-int { + width: 110px; +} + +.input-percent { + width: 65px; +} + +.form-horizontal { + padding-top: 10px; +} + +.form-horizontal .capacity-edit-form { + padding-top: 0px; +} + +.form-horizontal .control-value { + padding-top: 0px; +} + +.form-horizontal .form-control-static { + padding-top: 5px; +} + .queue-label { - float: left; padding-right: 10px; min-width: 80px; + font-weight: bold; + font-size: 1.1em; + padding-top: 5px; +} + +.control-label.queue-label { + padding-top: 7px; } .capacity-edit { - padding-left: 80px; + font-weight: normal; } .max-capacity-edit { @@ -62,7 +115,11 @@ .control-label { font-size: .9em; } - + +.input-group-addon { + padding: 3px; +} + .well-queue { background-color: #ffffff; border: 1px solid #e3e3e3; @@ -70,10 +127,14 @@ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) inset; margin-bottom: 20px; min-height: 20px; - padding: 19px; - padding-top: 5px; + padding: 15px; + padding-top: 0px; } +.col-md-8.queue-area { + padding-left:0px; +} + .btn { padding: 6px 10px; transition: background-color .08s linear 0s; @@ -250,12 +311,23 @@ } } .panel-title { + font-weight: 500; position: relative; a { position: absolute; right: 0; color: #428bca; } + .total { + float: right; + width: 400px; + .level-total-label { + float: left; + padding-right: 10px; + font-size:.9em; + font-weight: normal; + } + } } .panel-body.total{ .progress { @@ -263,13 +335,22 @@ } } .panel-body.queues { - border-top: 1px solid #dddddd; + padding-left: 0; + padding-right: 0; + } + .panel-body { + padding-top: 0px; + } + + .queues { + padding-top: 0px; } - .queue-capacity{ - border-bottom: 1px solid #dddddd; - padding-bottom: 8px; - padding-top: 8px; + .queue-capacity-peer { + } + + .queue-capacity { + padding-bottom: 4px; &.active { .progress { -webkit-box-shadow: 0px 0px 0px #888888; @@ -290,6 +371,7 @@ } .help-block { display: inline; + font-size: .8em; } /*input { width: auto; @@ -297,6 +379,14 @@ } } +.control-label.capacity-edit { + width: 75px; +} + +.capacity-input { + float: left !important; +} + .queue-heading-row { h3 { margin:10px; @@ -313,3 +403,88 @@ .modal-backdrop.in { opacity: 0; } + + + +input[type=range] { + -webkit-appearance: none; + width: 100%; + margin: 7.3px 0; +} +input[type=range]:focus { + outline: none; +} +input[type=range]::-webkit-slider-runnable-track { + width: 100%; + height: 2px; + cursor: pointer; + background: #555; + border-radius: 1.3px; + border: 0.2px solid #010101; +} +input[type=range]::-webkit-slider-thumb { + border: 1.8px solid #00001e; + height: 15px; + width: 20px; + border-radius: 15px; + background: #ffffff; + cursor: pointer; + -webkit-appearance: none; + margin-top: -7px; +} +input[type=range]:focus::-webkit-slider-runnable-track { + background: #555; +} +input[type=range]::-moz-range-track { + width: 100%; + height: 2px; + cursor: pointer; + background: #555; + border-radius: 1.3px; + border: 0.2px solid #010101; +} +input[type=range]::-ms-fill-lower { + background: red; + border-radius: 10px; +} +input[type=range]::-moz-range-thumb { + border: 1.8px solid #00001e; + height: 15px; + width: 20px; + border-radius: 15px; + background: #ffffff; + cursor: pointer; +} +input[type=range]::-ms-track { + width: 100%; + height: 2px; + cursor: pointer; + background: transparent; + border-color: transparent; + color: transparent; +} +input[type=range]::-ms-fill-lower { + background: rgba(42, 100, 149, 0.78); + border: 0.2px solid #010101; + border-radius: 2.6px; +} +input[type=range]::-ms-fill-upper { + background: #555; + border: 0.2px solid #010101; + border-radius: 2.6px; +} +input[type=range]::-ms-thumb { + border: 1.8px solid #00001e; + height: 15px; + width: 20px; + border-radius: 15px; + background: #ffffff; + cursor: pointer; + height: 11.4px; +} +input[type=range]:focus::-ms-fill-lower { + background: #555; +} +input[type=range]:focus::-ms-fill-upper { + background: #555; +} http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/capacityEditForm.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/capacityEditForm.hbs b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/capacityEditForm.hbs index 51e2bb4..535a18f 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/capacityEditForm.hbs +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/capacityEditForm.hbs @@ -16,19 +16,30 @@ * limitations under the License. }} -<form {{bind-attr class=":form-inline :capacity-edit-form " }} role="form"> +<form {{bind-attr class=":form-horizontal :capacity-edit-form " }} role="form"> <div {{bind-attr class=":form-group" }}> - <label class="control-label capacity-edit">Capacity: </label> - {{capacity-input class='input-sm' value=this.capacity totalCapacity=view.totalCapacity queue=this maxVal=100}} - - </div> - <div {{bind-attr class=":form-group this.isValid::has-error" }}> - <label class="control-label max-capacity-edit">Max. Capacity: </label> - {{max-capacity-input class='input-sm' value=this.maximum_capacity totalCapacity=view.totalCapacity queue=this maxVal=100}} + <label class="col-xs-1 control-label capacity-edit">Capacity: </label> + <div class="col-xs-2 capacity-input control-value input-group input-percent"> +{{capacity-input class='input-sm' value=this.capacity totalCapacity=view.totalCapacity queue=this maxVal=100}} +<span class="input-group-addon">%</span> + </div> + <div class="col-xs-3 control-value"> +{{input-range min="0" max="100" step="1" value=this.capacity}} + </div> + <label style="padding-top: 0px" class="col-xs-1 control-label capacity-edit">Max Capacity: </label> + <div {{bind-attr class="this.isValid::has-error" }}> + <div class="col-xs-2 capacity-input control-value input-group input-percent"> +{{max-capacity-input class='input-sm' value=this.maximum_capacity totalCapacity=view.totalCapacity queue=this maxVal=100}} +<span class="input-group-addon">%</span> + </div> + <div class="col-xs-3 control-value"> +{{input-range min="0" max="100" step="1" value=this.maximum_capacity}} {{#each this.errors.maximum_capacity}} <span class="help-block"> {{message}} </span> {{/each}} </div> + </div> + </div> </form> http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/capacityBar.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/capacityBar.hbs b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/capacityBar.hbs index d860cc4..05741f0 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/capacityBar.hbs +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/capacityBar.hbs @@ -17,7 +17,7 @@ }} <div class="progress progress-labelled" data-label-max="100" data-label-step="25" style="position: relative;"> - <div {{bind-attr style="capacityWidth" class=":progress-bar warn:progress-bar-danger:progress-bar-success"}}> + <div {{bind-attr style="capacityWidth" class=":progress-bar warn:progress-bar-danger:progress-bar-success"}}> <span> {{capacityValue}}% </span> http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/totalCapacity.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/totalCapacity.hbs b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/totalCapacity.hbs index e00c1cc..6e50328 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/totalCapacity.hbs +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/totalCapacity.hbs @@ -18,35 +18,43 @@ <div class="panel panel-default panel-capacity"> <div class="panel-heading"> - <div class="panel-title"> - <strong>Capacity</strong> - {{#if isOperator}} - <a href="#" {{action 'toggleEdit'}} class="text-right"> - {{#if view.isEdit}} - <div class="edit-link">Hide Edit</div> - {{else}} - <div class="edit-link">Show Edit</div> - {{/if}} - </a> - {{/if}} + <div class="panel-title"> + Capacity + <div class="total"> +<div class="level-total-label">Level Total</div> +{{capacity-bar capacityValue=totalCapacity maxCapacityValue=totalCapacity warn=leafQueues.firstObject.overCapacity}} </div> + </div> </div> <div class="panel-body total"> -<div class="control-label queue-label">TOTAL</div> -{{capacity-bar capacityValue=totalCapacity maxCapacityValue=totalCapacity warn=leafQueues.firstObject.overCapacity}} - </div> <div class="panel-body queues"> {{#each leafQueues}} + {{#if this.isCurrent}} <div {{bind-attr class=":queue-capacity this.isCurrent:active"}}> + <div class="queue-label">{{this.name}}</div> + {{render "capacityEditForm" this}} + <a href="#" {{action toggleProperty "showPeerQueues"}}> + <div class="peer-toggle"> +Show/Hide Peer Level Queues + </div> + </a> + </div> + {{/if}} + {{/each}} +{{#if showPeerQueues}} + {{#each leafQueues}} + {{#unless this.isCurrent}} + <div {{bind-attr class=":queue-capacity :queue-capacity-peer"}}> <p> - <div class="control-label queue-label">{{this.name}}</div> + <div class="queue-label">{{this.name}}</div> </p> - {{capacity-bar capacityValue=this.capacity maxCapacityValue=this.maximum_capacity warn=this.overCapacity}} {{render "capacityEditForm" this}} </div> + {{/unless}} {{/each}} +{{/if}} {{#each newLeafQueues}} - <div {{bind-attr class=":queue-capacity :new-queue this.isCurrent:active"}} > + <div {{bind-attr class=":queue-capacity :queue-capacity-peer :new-queue this.isCurrent:active"}} > <div class="input-row row" > <div class="col-md-5"> {{#each this.errors.path}} @@ -54,7 +62,6 @@ {{/each}} </div> </div> - {{capacity-bar capacityValue=this.capacity maxCapacityValue=this.maximum_capacity warn=this.overCapacity}} {{render "capacityEditForm" this}} </div> {{/each}} http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/userGroupInput.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/userGroupInput.hbs b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/userGroupInput.hbs index fab7ea8..8f0a7d6 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/userGroupInput.hbs +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/components/userGroupInput.hbs @@ -17,18 +17,14 @@ }} <div class="user-group-input form-group has-feedback "> - <div class="col-sm-4 control-label"> - Users: - </div> + <div class="col-sm-4 control-label">Users</div> <div class="col-sm-8"> {{input keyDown=noSpace disabledBinding="disabled" class="form-control input-sm" value=users placeholder="Comma-separated list of users"}} <i class="fa fa-user form-control-feedback"></i> </div> </div> <div class="form-group has-feedback user-group-input"> - <div class="col-sm-4 control-label"> - Groups: - </div> + <div class="col-sm-4 control-label">Groups</div> <div class="col-sm-8"> {{input keyDown=noSpace disabledBinding="disabled" class="form-control input-sm" value=groups placeholder="Comma-separated list of groups"}} <i class="fa fa-users form-control-feedback"></i> http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/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 caf3dd1..93e069e 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 @@ -57,16 +57,7 @@ {{#each pathErrors}} <p class="help-block red">{{this}}</p> {{/each}} - <h4 ><small>{{content.path}}</small> - <div class="btn-group btn-group-xs" data-toggle="buttons" > - <label {{action 'setState' 'running'}} {{bind-attr class=":btn isRunning:btn-success:btn-default isRunning:active isNotOperator:disabled" }}> - <input type="radio" name="options"> Running - </label> - <label {{action 'setState' 'stopped'}} {{bind-attr class=":btn isRunning:btn-default:btn-danger isRunning::active isNotOperator:disabled" }}> - <input type="radio" name="options"> Stopped - </label> - </div> - </h4> + <h4><small>{{content.path}}</small></h4> </div> </div> <div class="row queue-capacity-row"> @@ -88,24 +79,29 @@ <div class="panel panel-default panel-capacity"> <div class="panel-heading"> <div class="panel-title"> - <strong>Access Control</strong> - {{#if isOperator}} - <a href="#" {{action 'toggleEditACL'}} class="text-right"> - {{#if isEditACL}} - <div class="edit-link">Hide Edit</div> - {{else}} - <div class="edit-link">Show Edit</div> - {{/if}} - </a> - {{/if}} + Access Control and Status </div> </div> <div class="panel-body"> <form class="form-horizontal form-acl" role="form"> - {{#if isEditACL}} + <div class="form-group row"> + <label class="col-lg-4 col-xs-4 control-label">State</label> + <div class="col-lg-6 col-md-6 col-sm-8 col-xs-7 control-value"> + <div class="btn-group btn-group-xs" data-toggle="buttons" > + <label {{action 'setState' 'running'}} {{bind-attr class=":btn isRunning:btn-success:btn-default isRunning:active isNotOperator:disabled" }}> + <input type="radio" name="options"> Running + </label> + <label {{action 'setState' 'stopped'}} {{bind-attr class=":btn isRunning:btn-default:btn-danger isRunning::active isNotOperator:disabled" }}> + <input type="radio" name="options"> Stopped + </label> + </div> + </div> + </div> + + {{#if isOperator}} <div class="form-group row"> - <label class="col-lg-4 col-xs-4 control-label">Administer Queue ACL</label> + <label class="col-lg-4 col-xs-4 control-label">Administer Queue</label> <div class="col-lg-6 col-md-6 col-sm-8 col-xs-7 control-value"> <div class="btn-group btn-group-xs" data-toggle="buttons"> {{radio-button label="Anyone" selectionBinding="acl_administer_queue" value="*"}} @@ -121,24 +117,7 @@ {{/unless}} <div class="form-group row"> - <label class="col-lg-4 col-xs-4 control-label">Administer Jobs ACL</label> - <div class="col-lg-6 col-md-6 col-sm-8 col-xs-7 control-value"> - <div class="btn-group btn-group-xs" data-toggle="buttons"> - {{radio-button label="Anyone" selectionBinding="acl_administer_jobs" value="*"}} - {{radio-button label="Custom" selectionBinding="acl_administer_jobs" value="custom"}} - </div> - {{#if aaj_dirty}} - <a {{action 'rollbackProp' 'acl_administer_jobs'}} href="#"><i class="fa fa-undo"></i></a> - {{/if}} - </div> - </div> - {{#unless aaj_anyone}} - {{user-group-input ug=content.acl_administer_jobs disabled=aaj_anyone}} - {{/unless}} - - - <div class="form-group row"> - <label class="col-lg-4 col-xs-4 control-label">Submit Apps ACL</label> + <label class="col-lg-4 col-xs-4 control-label">Submit Applications</label> <div class="col-lg-6 col-md-6 col-sm-8 col-xs-7 control-value"> <div class="btn-group btn-group-xs" data-toggle="buttons"> {{radio-button label="Anyone" selectionBinding="acl_submit_applications" value="*"}} @@ -155,7 +134,7 @@ {{else}} <div class="form-group"> - <label class="col-lg-4 col-xs-4 control-label">Administer Queue ACL</label> + <label class="col-lg-4 col-xs-4 control-label">Administer Queue</label> <div class="col-lg-8 col-xs-8 control-value"> <p class="form-control-static"> {{escapeACL content.acl_administer_queue}} @@ -164,16 +143,7 @@ </div> <div class="form-group"> - <label class="col-lg-4 col-xs-4 control-label">Administer Jobs ACL</label> - <div class="col-lg-8 col-xs-8 control-value"> - <p class="form-control-static"> - {{escapeACL content.acl_administer_jobs}} - </p> - </div> - </div> - - <div class="form-group"> - <label class="col-lg-4 col-xs-4 control-label">Submit Apps ACL</label> + <label class="col-lg-4 col-xs-4 control-label">Submit Applications</label> <div class="col-lg-8 col-xs-8 control-value"> <p class="form-control-static"> {{escapeACL content.acl_submit_applications}} @@ -186,44 +156,74 @@ </div> </div> - <div class="col-md-6"> + <div class="col-md-6 queue-resources"> <div class="panel panel-default panel-capacity"> <div class="panel-heading"> <div class="panel-title"> - <strong>Resource Allocation</strong> - {{#if isOperator}} - <a href="#" {{action 'toggleEditRA'}} class="text-right"> - {{#if isEditRA}} - <div class="edit-link">Hide Edit</div> - {{else}} - <div class="edit-link">Show Edit</div> - {{/if}} - </a> - {{/if}} + Resources </div> </div> <div class="panel-body"> <form class="form-horizontal" role="form"> <div class="form-group"> - <label class="col-lg-4 col-xs-4 control-label">User Limit Factor</label> - <div class="col-lg-8 col-xs-8 "> - {{#if isEditRA}} - {{int-input value=content.user_limit_factor class="input-sm"}} + <label class="col-xs-6 control-label">User Limit Factor</label> + {{#if isOperator}} + <div class="col-xs-6 control-value"> + {{int-input value=content.user_limit_factor maxlength=10 class="input-sm input-int"}} {{else}} + <div class="col-xs-6"> <p class="form-control-static">{{content.user_limit_factor}}</p> {{/if}} </div> </div> <div class="form-group"> - <label class="col-lg-4 col-xs-4 control-label">Minimum User Limit</label> - <div class="col-lg-8 col-xs-8"> - {{#if isEditRA}} - <div class="input-group"> + <label class="col-xs-6 control-label">Minimum User Limit</label> + {{#if isOperator}} + <div class="col-xs-6 control-value"> + <div class="input-group input-percent"> {{int-input value=content.minimum_user_limit_percent class="input-sm" maxVal=100}} <span class="input-group-addon">%</span> </div> {{else}} - <p class="form-control-static">{{content.minimum_user_limit_percent}} %</p> + <div class="col-xs-6"> + {{#if content.minimum_user_limit_percent}} + <p class="form-control-static">{{content.minimum_user_limit_percent}} %</p> + {{else}} + <p class="form-control-static">-</p> + {{/if}} + {{/if}} + </div> + </div> + <div class="form-group"> + <label class="col-xs-6 control-label">Maximum Applications</label> + {{#if isOperator}} + <div class="col-xs-6 control-value"> + {{int-input placeholder="Inherited" maxlength=15 value=content.maximum_applications class="input-sm input-int"}} + {{else}} + <div class="col-xs-6"> + {{#if content.maximum_applications}} + <p class="form-control-static">{{content.maximum_applications}}</p> + {{else}} + <p class="form-control-static">-</p> + {{/if}} + {{/if}} + </div> + </div> + <div class="form-group"> + <label class="col-xs-6 control-label">Maximum AM Resource</label> + {{#if isOperator}} + <div class="col-xs-6 control-value"> + <div class="input-group input-percent"> + {{int-input placeholder="Inherited" value=content.maximum_am_resource_percent class="input-sm" maxVal=100}} + <span class="input-group-addon">%</span> + </div> + {{else}} + <div class="col-xs-6"> + {{#if content.maximum_am_resource_percent}} + <p class="form-control-static">{{content.maximum_am_resource_percent}} %</p> + {{else}} + <p class="form-control-static">-</p> + {{/if}} {{/if}} </div> </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queues.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queues.hbs b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queues.hbs index 2c00541..f0b80d1 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queues.hbs +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/queues.hbs @@ -80,7 +80,7 @@ </div> {{!-- QUEUE --}} -<div class="col-md-8"> +<div class="col-md-8 queue-area"> {{outlet}} </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/schedulerPanel.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/schedulerPanel.hbs b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/schedulerPanel.hbs index 7333006..12ad8a3 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/schedulerPanel.hbs +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/app/templates/schedulerPanel.hbs @@ -19,43 +19,65 @@ <div class="panel panel-default panel-capacity"> <div class="panel-heading"> <div class="panel-title"> - <strong>Scheduler</strong> - {{#if isOperator}} - <a href="#" {{action 'toggleEditScheduler'}} class="text-right"> - {{#if isEditScheduler}} - <div class="edit-link">Hide Edit</div> - {{else}} - <div class="edit-link">Show Edit</div> - {{/if}} - </a> - {{/if}} + Scheduler </div> </div> <div class="panel-body"> <form class="form-horizontal" role="form"> <div class="form-group"> - <label class="col-xs-4 control-label">Maximum Apps</label> - <div class="col-xs-8"> - {{#if isEditScheduler}} - {{int-input value=scheduler.maximum_applications class="input-sm"}} + <label class="col-xs-5 control-label">Maximum Applications</label> + {{#if isOperator}} + <div class="col-xs-6 control-value"> + {{int-input value=scheduler.maximum_applications maxlength=15 class="input-sm input-int"}} {{else}} + <div class="col-xs-6"> <p class="form-control-static">{{scheduler.maximum_applications}}</p> {{/if}} </div> </div> <div class="form-group"> - <label class="col-xs-4 control-label">Minimum AM Resource</label> - <div class="col-xs-8"> - {{#if isEditScheduler}} - <div class="input-group"> + <label class="col-xs-5 control-label">Maximum AM Resource</label> + {{#if isOperator}} + <div class="col-xs-6 control-value"> + <div class="input-group input-percent"> {{int-input value=scheduler.maximum_am_resource_percent class="input-sm" maxVal=100}} <span class="input-group-addon">%</span> </div> {{else}} - <p class="form-control-static">{{scheduler.maximum_am_resource_percent}} %</p> + <div class="col-xs-6"> + {{#if scheduler.maximum_am_resource_percent}} + <p class="form-control-static">{{scheduler.maximum_am_resource_percent}} %</p> + {{else}} + <p class="form-control-static">-</p> + {{/if}} {{/if}} </div> </div> + <div class="form-group"> + <label class="col-xs-5 control-label">Node Locality Delay</label> + {{#if isOperator}} + <div class="col-xs-6 control-value"> + {{int-input value=scheduler.node_locality_delay maxlength=10 class="input-sm input-int"}} + {{else}} + <div class="col-xs-6"> + {{#if scheduler.node_locality_delay}} + <p class="form-control-static">{{scheduler.node_locality_delay}} %</p> + {{else}} + <p class="form-control-static">-</p> + {{/if}} + {{/if}} + </div> + </div> + {{#if isOperator}} + {{#if scheduler.resource_calculator}} + <div class="form-group"> + <label class="col-xs-5 control-label">Calculator</label> + <div class="col-xs-12 control-value"> + {{input value=scheduler.resource_calculator class="input-sm form-control"}} + </div> + </div> + {{/if}} + {{/if}} </form> </div> </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/ui/config.coffee ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/ui/config.coffee b/contrib/views/capacity-scheduler/src/main/resources/ui/config.coffee index 2fe3325..3f0e672 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/ui/config.coffee +++ b/contrib/views/capacity-scheduler/src/main/resources/ui/config.coffee @@ -66,5 +66,5 @@ exports.config = overrides: development: paths: - public: '/usr/lib/ambari-server/web/views-debug/CAPACITY-SCHEDULER/0.2.0/CS_1/' + public: '/usr/lib/ambari-server/web/views-debug/CAPACITY-SCHEDULER/0.3.0/CS_1/' http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/capacity-scheduler/src/main/resources/view.xml ---------------------------------------------------------------------- diff --git a/contrib/views/capacity-scheduler/src/main/resources/view.xml b/contrib/views/capacity-scheduler/src/main/resources/view.xml index 6206ccc..49f7e67 100644 --- a/contrib/views/capacity-scheduler/src/main/resources/view.xml +++ b/contrib/views/capacity-scheduler/src/main/resources/view.xml @@ -17,23 +17,26 @@ <view> <name>CAPACITY-SCHEDULER</name> <label>Capacity Scheduler</label> - <version>0.2.0</version> + <version>0.3.0</version> <parameter> <name>ambari.server.url</name> - <description>Ambari REST API Cluster URL (for example: http://ambari.server:8080/api/v1/clusters/c1)</description> + <description>The Ambari REST API cluster resource.</description> + <label>Ambari Cluster URL</label> + <placeholder>http://ambari.server:8080/api/v1/clusters/MyCluster</placeholder> <required>true</required> </parameter> - <parameter> <name>ambari.server.username</name> - <description>Ambari Cluster Operator username (for example: admin)</description> + <description>The Cluster Operator username (for example: admin).</description> + <label>Operator Username</label> + <placeholder>admin</placeholder> <required>true</required> </parameter> - <parameter> <name>ambari.server.password</name> - <description>Ambari Cluster Operator password (for example: password)</description> + <description>The Cluster Operator password (for example: password).</description> + <label>Operator Password</label> <required>true</required> <masked>true</masked> </parameter> http://git-wip-us.apache.org/repos/asf/ambari/blob/7f491bae/contrib/views/tez/readme.md ---------------------------------------------------------------------- diff --git a/contrib/views/tez/readme.md b/contrib/views/tez/readme.md index 68e3994..1a53a3b 100644 --- a/contrib/views/tez/readme.md +++ b/contrib/views/tez/readme.md @@ -23,7 +23,7 @@ This view provides a web interface for TEZ. Requirements ----- -- Ambari view 1.3.0 +- Ambari 1.7.0 - TEZ 0.6.0 or above Build
