You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2014/09/19 19:19:23 UTC

[15/29] git commit: AMBARI-7400. Slider View: Most view parameters should be made required. (onechiporenko)

AMBARI-7400. Slider View: Most view parameters should be made required. (onechiporenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/d62147ed
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d62147ed
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d62147ed

Branch: refs/heads/branch-alerts-dev
Commit: d62147ed37864f7f9f321448c3036ade0eeb681f
Parents: d7b09b6
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Fri Sep 19 13:13:34 2014 +0300
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Fri Sep 19 13:13:34 2014 +0300

----------------------------------------------------------------------
 .../app/assets/data/resource/cluster_name.json  |   12 -
 .../assets/data/resource/components_hosts.json  |   16 -
 .../ui/app/assets/data/resource/empty_json.json |    1 +
 .../assets/data/resource/service_configs.json   |   38 -
 .../assets/data/resource/service_status.json    |   95 --
 .../assets/data/resource/slider-properties.json |    7 +-
 .../createAppWizard/step1_controller.js         |   90 +-
 .../ui/app/controllers/slider_controller.js     |  308 +---
 .../src/main/resources/ui/app/helpers/ajax.js   |  119 +-
 .../src/main/resources/ui/app/initialize.js     |    9 +-
 .../ui/app/mappers/slider_apps_mapper.js        |    7 +
 .../resources/ui/app/models/slider_config.js    |   51 +
 .../src/main/resources/ui/app/routes/main.js    |   16 +
 .../resources/ui/app/templates/application.hbs  |    4 +-
 .../ui/app/templates/slider_title_tooltip.hbs   |    2 +-
 .../src/main/resources/ui/app/translations.js   |    7 +-
 .../resources/ui/app/views/application_view.js  |   13 +-
 .../slider/src/main/resources/ui/config.js      |    1 +
 .../resources/ui/vendor/scripts/common/tv4.js   | 1605 ++++++++++++++++++
 .../views/slider/src/main/resources/view.xml    |   21 +-
 20 files changed, 1815 insertions(+), 607 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/cluster_name.json
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/cluster_name.json b/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/cluster_name.json
deleted file mode 100644
index f559483..0000000
--- a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/cluster_name.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "href" : "http://162.216.151.215:8080/api/v1/clusters?_=1409232826826",
-  "items" : [
-    {
-      "href" : "http://162.216.151.215:8080/api/v1/clusters/mycluster",
-      "Clusters" : {
-        "cluster_name" : "mycluster",
-        "version" : "HDP-2.1"
-      }
-    }
-  ]
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/components_hosts.json
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/components_hosts.json b/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/components_hosts.json
deleted file mode 100644
index eaf72b4..0000000
--- a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/components_hosts.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "items" : [
-    {
-      "Hosts" : {
-        "host_name" : "myHost"
-      },
-      "host_components" : [
-        {
-          "HostRoles" : {
-            "component_name" : ""
-          }
-        }
-      ]
-    }
-  ]
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/empty_json.json
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/empty_json.json b/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/empty_json.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/empty_json.json
@@ -0,0 +1 @@
+{}

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/service_configs.json
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/service_configs.json b/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/service_configs.json
deleted file mode 100644
index 24c1a31..0000000
--- a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/service_configs.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "items" : [
-    {
-      "cluster_name" : "cl",
-      "configurations" : [
-        {
-          "Config" : {
-            "cluster_name" : "cl"
-          },
-          "type" : "ganglia-env",
-          "tag" : "version1410432304443",
-          "version" : 1,
-          "properties" : {
-            "rrdcached_timeout" : "3600",
-            "gmetad_user" : "nobody",
-            "rrdcached_base_dir" : "/var/lib/ganglia/rrds",
-            "rrdcached_write_threads" : "4",
-            "rrdcached_delay" : "1800",
-            "rrdcached_flush_timeout" : "7200",
-            "gmond_user" : "nobody",
-            "ganglia_runtime_dir" : "/var/run/ganglia/hdp",
-            "additional_clusters": "'HBaseCluster1','7000','AccumuloCluster1','7001','HBaseCluster2','7002'"
-          },
-          "properties_attributes" : { }
-        }
-      ],
-      "createtime" : 1410432307174,
-      "group_id" : -1,
-      "group_name" : "default",
-      "hosts" : [ ],
-      "is_current" : true,
-      "service_config_version" : 1,
-      "service_config_version_note" : "Initial configurations for Ganglia",
-      "service_name" : "GANGLIA",
-      "user" : "admin"
-    }
-  ]
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/service_status.json
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/service_status.json b/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/service_status.json
deleted file mode 100644
index 861f7cd..0000000
--- a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/service_status.json
+++ /dev/null
@@ -1,95 +0,0 @@
-
-{
-  "items" : [
-    {
-      "ServiceInfo" : {
-        "service_name" : "FALCON",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "FLUME",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "GANGLIA",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "HBASE",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "HDFS",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "HIVE",
-        "state" : "INSTALLED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "MAPREDUCE2",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "NAGIOS",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "OOZIE",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "PIG",
-        "state" : "INSTALLED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "SQOOP",
-        "state" : "INSTALLED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "STORM",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "TEZ",
-        "state" : "INSTALLED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "YARN",
-        "state" : "STARTED"
-      }
-    },
-    {
-      "ServiceInfo" : {
-        "service_name" : "ZOOKEEPER",
-        "state" : "STARTED"
-      }
-    }
-  ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/slider-properties.json
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/slider-properties.json b/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/slider-properties.json
index 53a3331..c9b0781 100644
--- a/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/slider-properties.json
+++ b/contrib/views/slider/src/main/resources/ui/app/assets/data/resource/slider-properties.json
@@ -16,7 +16,10 @@
       "hdfs.address" : "hdfs://slider-1.c.pramod-thangali.internal:8020",
       "yarn.resourcemanager.address" : "slider-2.c.pramod-thangali.internal:8050",
       "yarn.resourcemanager.scheduler.address" : "slider-2.c.pramod-thangali.internal:8030",
-      "zookeeper.quorum" : "slider-1.c.pramod-thangali.internal:2181,slider-2.c.pramod-thangali.internal:2181,slider-3.c.pramod-thangali.internal:2181"
+      "zookeeper.quorum" : "slider-1.c.pramod-thangali.internal:2181,slider-2.c.pramod-thangali.internal:2181,slider-3.c.pramod-thangali.internal:2181",
+      "ganglia.server.hostname" : "bvc",
+      "ganglia.custom.clusters" : "'HBaseCluster1','7000','AccumuloCluster1','7001','HBaseCluster2','7002'",
+      "slider.user" : "John Dow"
     }
   },
   "resources" : [
@@ -61,4 +64,4 @@
       "view_name" : "SLIDER"
     }
   ]
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/controllers/createAppWizard/step1_controller.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/controllers/createAppWizard/step1_controller.js b/contrib/views/slider/src/main/resources/ui/app/controllers/createAppWizard/step1_controller.js
index 8583443..c04b7b3 100644
--- a/contrib/views/slider/src/main/resources/ui/app/controllers/createAppWizard/step1_controller.js
+++ b/contrib/views/slider/src/main/resources/ui/app/controllers/createAppWizard/step1_controller.js
@@ -81,81 +81,37 @@ App.CreateAppWizardStep1Controller = Ember.Controller.extend({
    * @method loadStep
    */
   loadStep: function () {
-    this.loadGangliaHost();
-    this.loadGangliaClusters();
+    var sliderConfigs = App.SliderApp.store.all('sliderConfig'),
+      gangliaClusters = sliderConfigs.findBy('viewConfigName', 'ganglia.custom.clusters'),
+      gangliaHost = sliderConfigs.findBy('viewConfigName', 'ganglia.server.hostname');
+    App.set('gangliaClusters', this.formatGangliaClusters(gangliaClusters.get('value')));
+    App.set('gangliaHost', gangliaHost.get('value'));
     this.initializeNewApp();
     this.loadAvailableTypes();
   },
 
   /**
-   * Load ganglia server host
-   * @method loadGangliaHost
+   * Format value for <code>gangliaClusters</code>
+   * @param {string} prop
+   * @returns {Array}
+   * @method formatGangliaClusters
    */
-  loadGangliaHost: function () {
-    return App.ajax.send({
-      name: 'components_hosts',
-      sender: this,
-      data: {
-        componentName: "GANGLIA_SERVER",
-        urlPrefix: '/api/v1/'
-      },
-      success: 'loadGangliaHostSuccessCallback'
-    });
-  },
-
-  /**
-   * Success callback for hosts-request
-   * Save host name to gangliaHost
-   * @param {Object} data
-   * @method loadGangliaHostSuccessCallback
-   */
-  loadGangliaHostSuccessCallback: function (data) {
-    if(data.items[0]){
-      App.set('gangliaHost', Em.get(data.items[0], 'Hosts.host_name'));
-    }
-  },
-
-  /**
-   * Load ganglia clusters
-   * @method loadGangliaClusters
-   */
-  loadGangliaClusters: function () {
-    return App.ajax.send({
-      name: 'service_current_configs',
-      sender: this,
-      data: {
-        serviceName: "GANGLIA",
-        urlPrefix: '/api/v1/'
-      },
-      success: 'loadGangliaClustersSuccessCallback'
-    });
-  },
-
-  /**
-   * Success callback for config property
-   * Save cluster to gangliaClusters
-   * @param {Object} data
-   * @method loadGangliaClustersSuccessCallback
-   */
-  loadGangliaClustersSuccessCallback: function (data) {
+  formatGangliaClusters: function(prop) {
     var gangliaCustomClusters = [];
-
-    if (data.items[0]) {
-      var prop = Em.get(data.items[0].configurations[0].properties, 'additional_clusters');
-      if (prop) {
-        //parse CSV string with cluster names and ports
-        prop.replace(/\'/g, "").split(',').forEach(function(item, index){
-          if (index % 2 === 0) {
-            gangliaCustomClusters.push({
-              name: item
-            })
-          } else {
-            gangliaCustomClusters[gangliaCustomClusters.length - 1].port = parseInt(item);
-          }
-        });
-        App.set('gangliaClusters', gangliaCustomClusters);
-      }
+    //parse CSV string with cluster names and ports
+    if (!Em.isNone(prop)) {
+      prop.replace(/\'/g, "").split(',').forEach(function(item, index){
+        if (index % 2 === 0) {
+          gangliaCustomClusters.push({
+            name: item
+          })
+        }
+        else {
+          gangliaCustomClusters[gangliaCustomClusters.length - 1].port = parseInt(item);
+        }
+      });
     }
+    return gangliaCustomClusters;
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/controllers/slider_controller.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/controllers/slider_controller.js b/contrib/views/slider/src/main/resources/ui/app/controllers/slider_controller.js
index eb2762e..401c86d 100644
--- a/contrib/views/slider/src/main/resources/ui/app/controllers/slider_controller.js
+++ b/contrib/views/slider/src/main/resources/ui/app/controllers/slider_controller.js
@@ -17,55 +17,11 @@
  */
 
 /**
- * Checks Slider-properties.
- * If they are not available, uses Ambari-configs to populate them:
- *  - Load cluster name
- *  - Load hostName for GANGLIA_SERVER
- *  - Load hostName for NAGIOS_SERVER
- *  - Load hostNames for ZOOKEEPER_SERVER
- *  - Load config tags
- *  - Load configs
- *  - Save Slider-properties
- * If Slider-properties exists:
- *  - Load cluster name
- *  - Load hostNames
- * After whole data has been loaded set <code>App.sliderConfigs</code> and enable/disable Slider
+ * Load Slider-properties.
+ * After this set <code>App.sliderConfig</code>-models and enable/disable Slider
  * @type {Ember.Controller}
  */
-App.SliderController = Ember.Controller.extend(App.RunPeriodically, {
-
-  /**
-   * Map for Slider-errors
-   * If some config is empty, service isn't installed
-   * @type {object}
-   */
-  serviceConfigMap: {
-    HDFS: 'hdfsAddress',
-    YARN: 'yarnResourceManager',
-    ZOOKEEPER: 'zookeeperQuorum'
-  },
-
-  /**
-   * List of Slider-properties mapped from Ambari-configs
-   * Key-names used in Slider-Title-Popup, so don't change it pls
-   * @type {Em.Object}
-   */
-  initialValuesToLoad: Em.Object.create({
-    ambariAddress: null,
-    clusterName: null,
-    hdfsAddress: null,
-    yarnResourceManager: null,
-    yarnResourceManagerScheduler: null,
-    zookeeperQuorum: null,
-    gangliaServer: null,
-    gangliaClusters: null
-  }),
-
-  /**
-   * List of host names with ZOOKEEPER_SERVER installed
-   * @type {string[]}
-   */
-  zookeeperHosts: [],
+App.SliderController = Ember.Controller.extend({
 
   /**
    *  Load resources on controller initialization
@@ -81,12 +37,12 @@ App.SliderController = Ember.Controller.extend(App.RunPeriodically, {
    * @returns {$.ajax}
    * @method getParametersFromViewProperties
    */
-  getParametersFromViewProperties: function() {
+  getParametersFromViewProperties: function () {
     return App.ajax.send({
       name: 'slider.getViewParams',
       sender: this,
       success: 'getParametersFromViewPropertiesSuccessCallback',
-      error: 'getParametersFromViewPropertiesErrorCallback'
+      error: 'finishSliderConfiguration'
     });
   },
 
@@ -97,262 +53,36 @@ App.SliderController = Ember.Controller.extend(App.RunPeriodically, {
    * @param {object} data
    * @method getParametersFromViewPropertiesSuccessCallback
    */
-  getParametersFromViewPropertiesSuccessCallback: function(data) {
+  getParametersFromViewPropertiesSuccessCallback: function (data) {
     var properties = Em.get(data, 'ViewInstanceInfo.properties'),
-      initialValuesToLoad = this.get('initialValuesToLoad');
-    if (properties == null || properties['hdfs.address'] == null
-        || properties['yarn.resourcemanager.address'] == null
-        || properties['yarn.resourcemanager.scheduler.address'] == null
-        || properties['zookeeper.quorum'] == null) {
-      this.getClusterName();
-    } else {
-      // TODO remove below line as it is a temporary hack 
-      this.getClusterName();
-
-      initialValuesToLoad.setProperties({
-        ambariAddress: location.protocol + "//" + document.location.host,
-        hdfsAddress: properties['hdfs.address'],
-        yarnResourceManager: properties['yarn.resourcemanager.address'],
-        yarnResourceManagerScheduler: properties['yarn.resourcemanager.scheduler.address'],
-        zookeeperQuorum: properties['zookeeper.quorum'],
-        gangliaServer: properties['ganglia.server.hostname'],
-        gangliaClusters: properties['ganglia.custom.clusters']
-      });
-      App.set('gangliaHost', properties['ganglia.server.hostname']);
-      this.finishSliderConfiguration();
-    }
-  },
-
-  /**
-   * Error-callback for Slider-parameters request
-   * @method getParametersFromViewPropertiesErrorCallback
-   */
-  getParametersFromViewPropertiesErrorCallback: function() {
-    this.getClusterName();
-  },
-
-  /**
-   * Get cluster name from server
-   * @returns {$.ajax}
-   * @method getClusterName
-   */
-  getClusterName: function () {
-    return App.ajax.send({
-      name: 'cluster_name',
-      sender: this,
-      data: {
-        urlPrefix: '/api/v1/'
-      },
-      success: 'getClusterNameSuccessCallback'
-    });
-  },
-
-  /**
-   * Success callback for clusterName-request
-   * @param {object} data
-   * @param {object} opt
-   * @param {object} params
-   * @method getClusterNameSuccessCallback
-   */
-  getClusterNameSuccessCallback: function (data, opt, params) {
-    var clusterName = Em.get(data.items[0], 'Clusters.cluster_name');
-    App.set('clusterName', clusterName);
-    this.loadComponentHost({componentName: "GANGLIA_SERVER", callback: "loadGangliaHostSuccessCallback"});
-    this.loadComponentHost({componentName: "NAGIOS_SERVER", callback: "loadNagiosHostSuccessCallback"});
-    this.loadComponentHost({componentName: "ZOOKEEPER_SERVER", callback: "setZookeeperQuorum"});
-    this.loadConfigsTags();
-  },
-
-  /**
-   * Load config tags from server
-   * @returns {$.ajax}
-   * @method loadConfigsTags
-   */
-  loadConfigsTags: function () {
-    return App.ajax.send({
-      name: 'config.tags',
-      sender: this,
-      data: {
-        urlPrefix: '/api/v1/'
-      },
-      success: 'onLoadConfigsTags'
-    });
-  },
-
-  /**
-   * Success callback for <code>loadConfigsTags</code>
-   * Get configs for selected tags
-   * @param {object} data
-   * @method onLoadConfigsTags
-   */
-  onLoadConfigsTags: function (data) {
-    var urlParams = [];
-    if (data.Clusters.desired_configs['yarn-site'] && data.Clusters.desired_configs['zookeeper-env']) {
-      var coreSiteTag = data.Clusters.desired_configs['core-site'].tag;
-      var yarnSiteTag = data.Clusters.desired_configs['yarn-site'].tag;
-      var zookeeperTag = data.Clusters.desired_configs['zookeeper-env'].tag;
-      urlParams.push('(type=core-site&tag=' + coreSiteTag + ')');
-      urlParams.push('(type=yarn-site&tag=' + yarnSiteTag + ')');
-      urlParams.push('(type=zookeeper-env&tag=' + zookeeperTag + ')');
-
-      App.ajax.send({
-        name: 'get_all_configurations',
-        sender: this,
-        data: {
-          urlParams: urlParams.join('|'),
-          urlPrefix: '/api/v1/'
-        },
-        success: 'onLoadConfigs'
-      });
-    }
-  },
-
-  /**
-   * Success callback for <code>onLoadConfigs</code>
-   * Set properties for <code>initialValuesToLoad</code> using loaded configs
-   * @param {object} data
-   * @method onLoadConfigs
-   */
-  onLoadConfigs: function (data) {
-    var hdfs = data.items.findProperty('type', 'core-site'),
-      yarn = data.items.findProperty('type', 'yarn-site'),
-      zookeeper = data.items.findProperty('type', 'zookeeper-env'),
-      initialValuesToLoad = this.get('initialValuesToLoad');
-    initialValuesToLoad.set('ambariAddress', location.protocol + "//" + document.location.host);
-    initialValuesToLoad.set('clusterName', App.get('clusterName'));
-    initialValuesToLoad.set('hdfsAddress', hdfs.properties['fs.defaultFS']);
-    initialValuesToLoad.set('yarnResourceManager', yarn.properties['yarn.resourcemanager.address']);
-    initialValuesToLoad.set('yarnResourceManagerScheduler', yarn.properties['yarn.resourcemanager.scheduler.address']);
-    initialValuesToLoad.set('zookeeperQuorum', zookeeper.properties.clientPort);
-    this.setZookeeperQuorum();
-  },
-
-  /**
-   * Set value for <code>initialValuesToLoad.zookeeperQuorum</code>
-   * Also do request to save Slider-properties
-   * @param {object} data
-   * @method setZookeeperQuorum
-   */
-  setZookeeperQuorum: function (data) {
-    var zookeeperHosts = this.get('zookeeperHosts'),
-      hosts = [],
-      initialValuesToLoad = this.get('initialValuesToLoad');
-
-    //done
-    if (!Em.isNone(initialValuesToLoad.zookeeperQuorum)) {
-      if (data) {
-        hosts = data.items.map(function (item) {
-          return item.Hosts.host_name + ":" + initialValuesToLoad.zookeeperQuorum;
-        });
-        initialValuesToLoad.set('zookeeperQuorum', hosts.join(','));
-        this.sendInitialValues();
-      }
-      else {
-        if (zookeeperHosts.length > 0) {
-          hosts = zookeeperHosts.map(function (host) {
-            return host + ":" + initialValuesToLoad.zookeeperQuorum;
-          });
-          initialValuesToLoad.set('zookeeperQuorum', hosts.join(','));
-          this.sendInitialValues();
-        }
-      }
-    }
-    else {
-      this.set('zookeeperHosts', data.items.mapProperty('Hosts.host_name'));
-    }
-  },
-
-  /**
-   * Send request to server to save initialValues
-   * @return {$.ajax}
-   * @method sendInitialValues
-   */
-  sendInitialValues: function () {
-    var initialValues = this.get('initialValuesToLoad');
-    return App.ajax.send({
-      name: 'saveInitialValues',
-      sender: this,
-      data: {
-        data: {
-          ViewInstanceInfo: {
-            properties: {
-              'hdfs.address': initialValues.get('hdfsAddress'),
-              'yarn.resourcemanager.address': initialValues.get('yarnResourceManager'),
-              'yarn.resourcemanager.scheduler.address': initialValues.get('yarnResourceManagerScheduler'),
-              'zookeeper.quorum': initialValues.get('zookeeperQuorum')
-            }
-          }
-        }
-      },
-      success: 'finishSliderConfiguration'
+      initialValuesToLoad = this.get('initialValuesToLoad'),
+      sliderConfigs = App.SliderApp.store.all('sliderConfig'),
+      self = this;
+    sliderConfigs.forEach(function (model) {
+      var key = model.get('viewConfigName');
+      model.set('value', properties[key]);
     });
+    self.finishSliderConfiguration();
   },
 
   /**
    * After all Slider-configs are loaded, application should check self status
    * @method finishSliderConfiguration
    */
-  finishSliderConfiguration: function() {
+  finishSliderConfiguration: function () {
     //check if all services exist
-    var serviceConfigMap = this.get('serviceConfigMap'),
-      initialValuesToLoad = this.get('initialValuesToLoad'),
-      services = Em.keys(serviceConfigMap),
-      errors = [];
-    services.forEach(function(serviceName) {
-      var configName = Em.get(serviceConfigMap, serviceName);
-      if (Em.isEmpty(initialValuesToLoad[configName])) {
-        errors.push(Em.I18n.t('error.no' + serviceName));
+    var errors = [];
+    App.SliderApp.store.all('sliderConfig').forEach(function (model) {
+      if (Em.isEmpty(model.get('value')) && model.get('required')) {
+        errors.push(Em.I18n.t('error.config_is_empty').format(model.get('viewConfigName')));
       }
     });
+    errors.uniq();
     App.setProperties({
       viewErrors: errors,
       viewEnabled: errors.length === 0,
-      sliderConfigs: initialValuesToLoad,
       mapperTime: new Date().getTime()
     });
-  },
-
-  /**
-   * Load host for component
-   * @param {{componentName: string, callback: string}} params
-   * @return {$.ajax}
-   * @method loadGangliaHost
-   */
-  loadComponentHost: function (params) {
-    return App.ajax.send({
-      name: 'components_hosts',
-      sender: this,
-      data: {
-        componentName: params.componentName,
-        urlPrefix: '/api/v1/'
-      },
-      success: params.callback
-    });
-
-  },
-
-  /**
-   * Success callback for hosts-request
-   * Save host name to GANGLIA_SERVER (set in <code>App.gangliaHost</code>)
-   * @param {Object} data
-   * @method loadGangliaHostSuccessCallback
-   */
-  loadGangliaHostSuccessCallback: function (data) {
-    if (data.items[0]) {
-      App.set('gangliaHost', Em.get(data.items[0], 'Hosts.host_name'));
-    }
-  },
-
-  /**
-   * Success callback for hosts-request
-   * Save host name to NAGIOS_SERVER (set in <code>App.nagiosHost</code>)
-   * @param {Object} data
-   * @method loadGangliaHostSuccessCallback
-   */
-  loadNagiosHostSuccessCallback: function (data) {
-    if (data.items[0]) {
-      App.set('nagiosHost', Em.get(data.items[0], 'Hosts.host_name'));
-    }
   }
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/helpers/ajax.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/helpers/ajax.js b/contrib/views/slider/src/main/resources/ui/app/helpers/ajax.js
index 0a14842..ba7fbce 100644
--- a/contrib/views/slider/src/main/resources/ui/app/helpers/ajax.js
+++ b/contrib/views/slider/src/main/resources/ui/app/helpers/ajax.js
@@ -24,7 +24,7 @@
  *  real - real url (without API prefix)
  *  type - request type (also may be defined in the format method)
  *  format - function for processing ajax params after default formatRequest. May be called with one or two parameters (data, opt). Return ajax-params object
- *  testInProduction - can this request be executed on production tests (used only in tests)
+ *  schema - basic validation schema (tv4) for response (optional)
  *
  * @type {Object}
  */
@@ -36,6 +36,14 @@ var urls = {
     headers: {
       Accept: "text/plain; charset=utf-8",
       "Content-Type": "text/plain; charset=utf-8"
+    },
+    schema: {
+      required: ['ViewInstanceInfo'],
+      properties: {
+        ViewInstanceInfo: {
+          required: ['properties']
+        }
+      }
     }
   },
 
@@ -45,6 +53,28 @@ var urls = {
     headers: {
       Accept: "text/plain; charset=utf-8",
       "Content-Type": "text/plain; charset=utf-8"
+    },
+    schema: {
+      required: ['items'],
+      properties: {
+        items: {
+          type: 'array',
+          items: {
+            required: ['id', 'typeComponents', 'typeConfigs'],
+            properties: {
+              typeConfigs: {
+                type: 'object'
+              },
+              typeComponents: {
+                type: 'array',
+                items: {
+                  required: ['id', 'name', 'category', 'displayName']
+                }
+              }
+            }
+          }
+        }
+      }
     }
   },
 
@@ -54,6 +84,23 @@ var urls = {
     headers: {
       Accept: "text/plain; charset=utf-8",
       "Content-Type": "text/plain; charset=utf-8"
+    },
+    schema: {
+      required: ['items'],
+      properties: {
+        items: {
+          type: 'array',
+          items: {
+            required: ['id', 'description', 'diagnostics', 'name', 'user', 'state', 'type', 'components', 'configs'],
+            alerts: {
+              type: 'object',
+              detail: {
+                type: 'array'
+              }
+            }
+          }
+        }
+      }
     }
   },
 
@@ -64,6 +111,7 @@ var urls = {
 
   'saveInitialValues': {
     real: '',
+    mock: '/data/resource/empty_json.json',
     headers: {
       "Content-Type": "text/plain; charset=utf-8"
     },
@@ -126,58 +174,6 @@ var urls = {
     }
   },
 
-  'service_status': {
-    real: 'clusters/{clusterName}/services?fields=ServiceInfo/state&minimal_response=true',
-    mock: '/data/resource/service_status.json',
-    headers: {
-      Accept: "text/plain; charset=utf-8",
-      "Content-Type": "text/plain; charset=utf-8"
-    }
-  },
-
-  'components_hosts': {
-    real: 'clusters/{clusterName}/hosts?host_components/HostRoles/component_name={componentName}&minimal_response=true',
-    mock: '/data/resource/components_hosts.json',
-    headers: {
-      Accept: "text/plain; charset=utf-8",
-      "Content-Type": "text/plain; charset=utf-8"
-    }
-  },
-
-  'service_current_configs': {
-    real: 'clusters/{clusterName}/configurations/service_config_versions?service_name={serviceName}&is_current=true',
-    mock: '/data/resource/service_configs.json',
-    headers: {
-      Accept: "text/plain; charset=utf-8",
-      "Content-Type": "text/plain; charset=utf-8"
-    }
-  },
-
-  'config.tags': {
-    'real': 'clusters/{clusterName}?fields=Clusters/desired_configs',
-    headers: {
-      Accept: "text/plain; charset=utf-8",
-      "Content-Type": "text/plain; charset=utf-8"
-    }
-  },
-
-  'get_all_configurations': {
-    'real': 'clusters/{clusterName}/configurations?{urlParams}',
-    headers: {
-      Accept: "text/plain; charset=utf-8",
-      "Content-Type": "text/plain; charset=utf-8"
-    }
-  },
-
-  'cluster_name': {
-    real: 'clusters',
-    mock: '/data/resource/cluster_name.json',
-    headers: {
-      Accept: "text/plain; charset=utf-8",
-      "Content-Type": "text/plain; charset=utf-8"
-    }
-  },
-
   'metrics': {
     real: 'apps/{id}/metrics/{metric}',
     mock: '/data/metrics/metric.json'
@@ -248,11 +244,11 @@ var formatRequest = function (data) {
     }
     var url = formatUrl(this.real, data);
     opt.url = prefix + (url ? url : '');
+    if (this.format) {
+      jQuery.extend(opt, this.format(data, opt));
+    }
   }
 
-  if (this.format) {
-    jQuery.extend(opt, this.format(data, opt));
-  }
   return opt;
 };
 
@@ -305,6 +301,17 @@ var ajax = Em.Object.extend({
 
     opt.success = function (data) {
       console.log("TRACE: The url is: " + opt.url);
+
+      // validate response if needed
+      if (urls[config.name].schema) {
+        var result = tv4.validateMultiple(data, urls[config.name].schema);
+        if (!result.valid) {
+          result.errors.forEach(function (error) {
+            console.warn('Request: ' + config.name, 'WARNING: ', error.message, error.dataPath);
+          });
+        }
+      }
+
       if (config.success) {
         config.sender[config.success](data, opt, params);
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/initialize.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/initialize.js b/contrib/views/slider/src/main/resources/ui/app/initialize.js
index fd34ebe..5428c3d 100755
--- a/contrib/views/slider/src/main/resources/ui/app/initialize.js
+++ b/contrib/views/slider/src/main/resources/ui/app/initialize.js
@@ -105,20 +105,13 @@ App.initializer({
       gangliaClusters: null,
 
       /**
-       * View-configs set from ambari-admin
-       * Loaded in <code>App.SliderController</code>
-       * @type {null|object}
-       */
-      sliderConfigs: null,
-
-      /**
        * Last time when mapper ran
        * @type {null|number}
        */
       mapperTime: null
 
     });
-    application.SliderController.proto().loop('initResources');
+    application.SliderController.proto().initResources();
     application.ApplicationTypeMapper.loop('load');
     application.SliderAppsMapper.loop('load');
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/mappers/slider_apps_mapper.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/mappers/slider_apps_mapper.js b/contrib/views/slider/src/main/resources/ui/app/mappers/slider_apps_mapper.js
index a8ebbff..7312f86 100644
--- a/contrib/views/slider/src/main/resources/ui/app/mappers/slider_apps_mapper.js
+++ b/contrib/views/slider/src/main/resources/ui/app/mappers/slider_apps_mapper.js
@@ -161,6 +161,12 @@ App.SliderAppsMapper = App.Mapper.createWithMixins(App.RunPeriodically, {
     });
   },
 
+  /**
+   * Concatenate <code>supportedMetrics</code> into one string
+   * @param {object} app
+   * @returns {string}
+   * @method parseMetricNames
+   */
   parseMetricNames : function(app) {
     if (app.supportedMetrics) {
       return app.supportedMetrics.join(",");
@@ -185,6 +191,7 @@ App.SliderAppsMapper = App.Mapper.createWithMixins(App.RunPeriodically, {
         quickLinks = self.parseQuickLinks(app),
         alerts = self.parseAlerts(app),
         jmx = self.parseObject(app.jmx),
+        metricNames = self.parseMetricNames(app),
         masterActiveTime = jmx.findProperty('key', 'MasterActiveTime'),
         masterStartTime = jmx.findProperty('key', 'MasterStartTime');
       if (masterActiveTime) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/models/slider_config.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/models/slider_config.js b/contrib/views/slider/src/main/resources/ui/app/models/slider_config.js
new file mode 100644
index 0000000..a079faf
--- /dev/null
+++ b/contrib/views/slider/src/main/resources/ui/app/models/slider_config.js
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Slider config-property (see Ambari-Admin view-settings)
+ * Also see <code>view.xml</code>
+ * @type {DS.Model}
+ */
+App.SliderConfig = DS.Model.extend({
+
+  /**
+   * Name in the Ambari-Admin
+   * @type {string}
+   */
+  viewConfigName: DS.attr('string'),
+
+  /**
+   * Shown name
+   * @type {string}
+   */
+  displayName: DS.attr('string'),
+
+  /**
+   * @type {null|string}
+   */
+  value: null,
+
+  /**
+   * Is property required
+   * @type {bool}
+   */
+  required: DS.attr('bool')
+
+});
+
+App.SliderConfig.FIXTURES = [];

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/routes/main.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/routes/main.js b/contrib/views/slider/src/main/resources/ui/app/routes/main.js
index 80d2de5..d1e0bb7 100644
--- a/contrib/views/slider/src/main/resources/ui/app/routes/main.js
+++ b/contrib/views/slider/src/main/resources/ui/app/routes/main.js
@@ -46,6 +46,22 @@ App.SliderAppsRoute = Ember.Route.extend({
     return this.store.all('sliderApp');
   },
 
+
+  setupController: function(controller, model) {
+    controller.set('model', model);
+
+    // Load sliderConfigs to storage
+    App.SliderApp.store.pushMany('sliderConfig', Em.A([
+      Em.Object.create({id: 1, required: true, viewConfigName: 'hdfs.address', displayName: 'hdfsAddress', linkedService: 'HDFS'}),
+      Em.Object.create({id: 2, required: true, viewConfigName: 'yarn.resourcemanager.address', displayName: 'yarnResourceManager', linkedService: 'YARN'}),
+      Em.Object.create({id: 3, required: true, viewConfigName: 'yarn.resourcemanager.scheduler.address',  displayName: 'yarnResourceManagerScheduler'}),
+      Em.Object.create({id: 4, required: true, viewConfigName: 'zookeeper.quorum', displayName: 'zookeeperQuorum', linkedService: 'ZOOKEEPER'}),
+      Em.Object.create({id: 5, required: false, viewConfigName: 'ganglia.server.hostname', displayName: 'gangliaServer'}),
+      Em.Object.create({id: 6, required: false, viewConfigName: 'ganglia.custom.clusters', displayName: 'gangliaClusters'}),
+      Em.Object.create({id: 7, required: false, viewConfigName: 'slider.user', displayName: 'sliderUser'})
+    ]));
+  },
+
   actions: {
     createApp: function () {
       this.transitionTo('createAppWizard');

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/templates/application.hbs b/contrib/views/slider/src/main/resources/ui/app/templates/application.hbs
index 625eaca..da828bf 100755
--- a/contrib/views/slider/src/main/resources/ui/app/templates/application.hbs
+++ b/contrib/views/slider/src/main/resources/ui/app/templates/application.hbs
@@ -20,12 +20,12 @@
   {{#view view.SliderTitleView}}
     <h1>{{t slider.apps.title}} - <span class="slider-app-title" {{bs-bind-popover view.popover}}>{{App.instance}}</span></h1>
   {{/view}}
+  {{outlet bs-tooltip-box}}
 </div>
 {{#if App.viewEnabled}}
   {{outlet}}
-  {{outlet bs-tooltip-box}}
 {{else}}
   {{#each error in App.viewErrors}}
-    <h3>{{error}}</h3>
+    <h3>{{{error}}}</h3>
   {{/each}}
 {{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/templates/slider_title_tooltip.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/templates/slider_title_tooltip.hbs b/contrib/views/slider/src/main/resources/ui/app/templates/slider_title_tooltip.hbs
index 1b80aa2..39cecd1 100644
--- a/contrib/views/slider/src/main/resources/ui/app/templates/slider_title_tooltip.hbs
+++ b/contrib/views/slider/src/main/resources/ui/app/templates/slider_title_tooltip.hbs
@@ -22,7 +22,7 @@
   </div>
   {{#each config in view.content}}
     <div class="row">
-      <div class="col-md-4">{{humanize config.name}}</div>
+      <div class="col-md-4">{{humanize config.displayName}}</div>
       <div class="col-md-8">{{formatWordBreak config.value devider=','}}</div>
     </div>
   {{/each}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/translations.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/translations.js b/contrib/views/slider/src/main/resources/ui/app/translations.js
index d7ab3eb..4336ddc 100644
--- a/contrib/views/slider/src/main/resources/ui/app/translations.js
+++ b/contrib/views/slider/src/main/resources/ui/app/translations.js
@@ -53,12 +53,7 @@ Em.I18n.translations = {
     'send': 'Send'
   },
 
-  'error.noHDFS': 'Slider applications view requires HDFS service.',
-  'error.startHDFS': 'Slider applications view requires HDFS service to be started.',
-  'error.noYARN': 'Slider applications view requires YARN service.',
-  'error.startYARN': 'Slider applications view requires YARN service to be started.',
-  'error.noZOOKEEPER': 'Slider applications view requires ZooKeeper service.',
-  'error.startZOOKEEPER': 'Slider applications view requires ZooKeeper service to be started.',
+  'error.config_is_empty': 'Config <strong>{0}</strong> should not be empty',
 
   'popup.confirmation.commonHeader': 'Confirmation',
   'question.sure':'Are you sure?',

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/app/views/application_view.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/app/views/application_view.js b/contrib/views/slider/src/main/resources/ui/app/views/application_view.js
index bae82e9..1860944 100644
--- a/contrib/views/slider/src/main/resources/ui/app/views/application_view.js
+++ b/contrib/views/slider/src/main/resources/ui/app/views/application_view.js
@@ -38,19 +38,8 @@ App.ApplicationView = Ember.View.extend({
      * @method sliderConfigsChecker
      */
     sliderConfigsChecker: function() {
-      var configs = App.get('sliderConfigs'),
-        res = [],
-        excludedConfigs = ['ambariAddress', 'clusterName'];
-      if (configs) {
-        Em.keys(configs).forEach(function(c) {
-          if (!excludedConfigs.contains(c)) {
-            res.push({name: c, value: configs[c]});
-          }
-        });
-      }
-      this.set('content', res);
       var template = this.createChildView(App.SliderTitleTooltipView, {
-        content: res
+        content: App.SliderApp.store.all('sliderConfig')
       });
       this.set('popover.template', template.renderToBuffer().string());
     }.observes('App.mapperTime')

http://git-wip-us.apache.org/repos/asf/ambari/blob/d62147ed/contrib/views/slider/src/main/resources/ui/config.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/config.js b/contrib/views/slider/src/main/resources/ui/config.js
index e464128..4c6a023 100755
--- a/contrib/views/slider/src/main/resources/ui/config.js
+++ b/contrib/views/slider/src/main/resources/ui/config.js
@@ -29,6 +29,7 @@ exports.config = {
       order: {
         before: [
           'vendor/scripts/common/d3.v2.js',
+          'vendor/scripts/common/tv4.js',
           'vendor/scripts/common/cubism.v1.js',
           'vendor/scripts/common/rickshaw.js',
           'vendor/scripts/common/console-polyfill.js',