瀏覽代碼

AMBARI-10429. Create Hive and Tez theme based enhanced configs (onechiporenko)

Oleg Nechiporenko 10 年之前
父節點
當前提交
747c3b88cc
共有 33 個文件被更改,包括 1178 次插入327 次删除
  1. 18 8
      ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/configuration/hive-site.xml
  2. 13 1
      ambari-server/src/main/resources/stacks/HDP/2.1/services/HIVE/configuration/hive-site.xml
  3. 84 1
      ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/configuration/hive-env.xml
  4. 92 29
      ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/configuration/hive-site.xml
  5. 102 1
      ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/configuration/hiveserver2-site.xml
  6. 7 0
      ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/metainfo.xml
  7. 609 0
      ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
  8. 52 50
      ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes/theme.json
  9. 3 1
      ambari-web/app/controllers/main/service/info/configs.js
  10. 1 1
      ambari-web/app/mixins/main/service/configs/config_overridable.js
  11. 1 1
      ambari-web/app/mixins/unit_convert/convert_unit_widget_view_mixin.js
  12. 5 1
      ambari-web/app/styles/application.less
  13. 1 0
      ambari-web/app/templates.js
  14. 1 1
      ambari-web/app/templates/common/configs/service_config.hbs
  15. 3 2
      ambari-web/app/templates/common/configs/service_config_layout_tab.hbs
  16. 1 40
      ambari-web/app/templates/common/configs/widgets/checkbox_config_widget.hbs
  17. 19 27
      ambari-web/app/templates/common/configs/widgets/combo_config_widget.hbs
  18. 69 0
      ambari-web/app/templates/common/configs/widgets/controls.hbs
  19. 5 16
      ambari-web/app/templates/common/configs/widgets/directory_config_widget.hbs
  20. 4 12
      ambari-web/app/templates/common/configs/widgets/list_config_widget.hbs
  21. 1 12
      ambari-web/app/templates/common/configs/widgets/radio_button_config.hbs
  22. 2 50
      ambari-web/app/templates/common/configs/widgets/slider_config_widget.hbs
  23. 5 17
      ambari-web/app/templates/common/configs/widgets/textfield_config_widget.hbs
  24. 9 24
      ambari-web/app/templates/common/configs/widgets/time_interval_spinner.hbs
  25. 5 14
      ambari-web/app/templates/common/configs/widgets/toggle_config_widget.hbs
  26. 1 0
      ambari-web/app/utils/helper.js
  27. 11 1
      ambari-web/app/views/common/configs/service_config_layout_tab_view.js
  28. 6 3
      ambari-web/app/views/common/configs/widgets/combo_config_widget_view.js
  29. 23 0
      ambari-web/app/views/common/configs/widgets/config_widget_view.js
  30. 2 7
      ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js
  31. 4 2
      ambari-web/app/views/common/configs/widgets/time_interval_spinner_view.js
  32. 18 4
      ambari-web/app/views/common/configs/widgets/toggle_config_widget_view.js
  33. 1 1
      ambari-web/app/views/common/controls_view.js

+ 18 - 8
ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/configuration/hive-site.xml

@@ -354,14 +354,24 @@ limitations under the License.
     <display-name>Default File Format</display-name>
     <value-attributes>
       <type>value-list</type>
-      <entries>ORCFile</entries>
-      <entries>TextFile</entries>
-      <entries>SequenceFile</entries>
-      <entries>RCfile</entries>      
-      <entry_descriptions>The Optimized Row Columnar (ORC) file format provides a highly efficient way to store Hive data. It was designed to overcome limitations of the other Hive file formats. Using ORC files improves performance when Hive is reading, writing, and processing data.</entry_descriptions>
-      <entry_descriptions>Text file format saves Hive data as normal text.</entry_descriptions>
-      <entry_descriptions>Compressed text file format saves Hive data in CompressedStorage.</entry_descriptions>
-      <entry_descriptions>Short of Record Columnar File, are flat files consisting of binary key/value pairs</entry_descriptions>      
+      <entries>
+        <entry>
+          <value>ORCFile</value>
+          <description>The Optimized Row Columnar (ORC) file format provides a highly efficient way to store Hive data. It was designed to overcome limitations of the other Hive file formats. Using ORC files improves performance when Hive is reading, writing, and processing data.</description>
+        </entry>
+        <entry>
+          <value>TextFile</value>
+          <description>Text file format saves Hive data as normal text.</description>
+        </entry>
+        <entry>
+          <value>SequenceFile</value>
+          <description>Compressed text file format saves Hive data in CompressedStorage.</description>
+        </entry>
+        <entry>
+          <value>RCfile</value>
+          <description>Short of Record Columnar File, are flat files consisting of binary key/value pairs.</description>
+        </entry>
+      </entries>
     </value-attributes>
   </property>
 </configuration>

+ 13 - 1
ambari-server/src/main/resources/stacks/HDP/2.1/services/HIVE/configuration/hive-site.xml

@@ -365,7 +365,7 @@ limitations under the License.
     <value-attributes>
       <type>int</type>
       <minimum>682</minimum>
-      <minimum>6820</minimum>
+      <maximum>6820</maximum>
       <unit>MB</unit>
       <increment-step>682</increment-step>
     </value-attributes>
@@ -469,6 +469,12 @@ limitations under the License.
       </entries>
       <selection-cardinality>1</selection-cardinality>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_txn_acid</name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -482,6 +488,12 @@ limitations under the License.
       <maximum>20</maximum>
       <increment-step>1</increment-step>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_txn_acid</name>
+      </property>
+    </depends-on>
   </property>
 
   <property>

+ 84 - 1
ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/configuration/hive-env.xml

@@ -61,5 +61,88 @@ fi
 export METASTORE_PORT={{hive_metastore_port}}
     </value>
   </property>
-  
+
+  <property>
+    <name>hive_exec_orc_storage_strategy</name>
+    <display-name>ORC Storage Strategy</display-name>
+    <value>SPEED</value>
+    <value-attributes>
+      <type>value-list</type>
+      <entries>
+        <entry>
+          <value>SPEED</value>
+          <label>Speed</label>
+        </entry>
+        <entry>
+          <value>COMPRESSION</value>
+          <label>Compression</label>
+        </entry>
+      </entries>
+      <selection-cardinality>1</selection-cardinality>
+    </value-attributes>
+  </property>
+
+  <property>
+    <name>hive_txn_acid</name>
+    <display-name>ACID Transactions</display-name>
+    <value>true</value>
+    <value-attributes>
+      <type>value-list</type>
+      <entries>
+        <entry>
+          <value>true</value>
+          <label>On</label>
+        </entry>
+        <entry>
+          <value>false</value>
+          <label>Off</label>
+        </entry>
+      </entries>
+      <selection-cardinality>1</selection-cardinality>
+    </value-attributes>
+  </property>
+
+  <property>
+    <name>hive_security_authorization</name>
+    <display-name>Choose Authorization</display-name>
+    <value>None</value>
+    <value-attributes>
+      <type>value-list</type>
+      <entries>
+        <entry>
+          <value>None</value>
+          <label>None</label>
+        </entry>
+        <entry>
+          <value>SQLStdAuth</value>
+          <label>SQLStdAuth</label>
+        </entry>
+        <entry>
+          <value>Ranger</value>
+          <label>Ranger</label>
+        </entry>
+      </entries>
+    </value-attributes>
+  </property>
+
+  <property>
+    <name>hive_timeline_logging_enabled</name>
+    <display-name>Use ATS Logging</display-name>
+    <value>true</value>
+    <value-attributes>
+      <type>value-list</type>
+      <entries>
+        <entry>
+          <value>true</value>
+          <label>True</label>
+        </entry>
+        <entry>
+          <value>false</value>
+          <label>False</label>
+        </entry>
+      </entries>
+      <selection-cardinality>1</selection-cardinality>
+    </value-attributes>
+  </property>
+
 </configuration>

+ 92 - 29
ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/configuration/hive-site.xml

@@ -175,6 +175,14 @@ limitations under the License.
     <name>hive.exec.reducers.bytes.per.reducer</name>
     <value>67108864</value>
     <description>size per reducer.The default is 256Mb, i.e if the input size is 1G, it will use 4 reducers.</description>
+    <display-name>Memory</display-name>
+    <value-attributes>
+      <type>int</type>
+      <minimum>64</minimum>
+      <maximum>4398046511104</maximum>
+      <unit>B</unit>
+      <step-increment></step-increment>
+    </value-attributes>
   </property>
 
   <property>
@@ -194,6 +202,12 @@ limitations under the License.
       A pre-execution hook is specified as the name of a Java class which implements the
       org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext interface.
     </description>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_timeline_logging_enabled </name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -204,6 +218,12 @@ limitations under the License.
       A post-execution hook is specified as the name of a Java class which implements the
       org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext interface.
     </description>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_timeline_logging_enabled </name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -214,6 +234,12 @@ limitations under the License.
       An on-failure hook is specified as the name of Java class which implements the
       org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext interface.
     </description>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_timeline_logging_enabled </name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -253,16 +279,22 @@ limitations under the License.
       <type>value-list</type>
       <entries>
         <entry>
-          <value>true</value>
-          <label>True</label>
+          <value>nonstrict</value>
+          <label>On</label>
         </entry>
         <entry>
-          <value>false</value>
-          <label>False</label>
+          <value>strict</value>
+          <label>Off</label>
         </entry>
       </entries>
       <selection-cardinality>1</selection-cardinality>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_txn_acid</name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -507,16 +539,6 @@ limitations under the License.
     </value-attributes>
   </property>
 
-  <property>
-    <name>hive.exec.orc.compression.strategy</name>
-    <value>SPEED</value>
-    <description>
-      Expects one of [speed, compression].
-      Define the compression strategy to use while writing data.
-      This changes the compression level of higher level compression codec (like ZLIB).
-    </description>
-  </property>
-
   <property>
     <name>hive.orc.splits.include.file.footer</name>
     <value>false</value>
@@ -586,6 +608,12 @@ limitations under the License.
       </entries>
       <selection-cardinality>1</selection-cardinality>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_txn_acid</name>
+      </property>
+    </depends-on>
   </property>
   <property>
     <name>hive.enforce.sorting</name>
@@ -783,6 +811,12 @@ limitations under the License.
       </entries>
       <selection-cardinality>1</selection-cardinality>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_txn_acid</name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -817,6 +851,12 @@ limitations under the License.
       </entries>
       <selection-cardinality>1</selection-cardinality>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_txn_acid</name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -902,6 +942,12 @@ limitations under the License.
       </entries>
       <selection-cardinality>1</selection-cardinality>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_security_authorization</name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -914,12 +960,19 @@ limitations under the License.
   </property>
   <property>
     <name>hive.security.metastore.authorization.manager</name>
+    <display-name>Hive Authorization Manager</display-name>
     <value>org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider,org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly</value>
     <description>
       authorization manager class name to be used in the metastore for authorization.
       The user defined authorization class should implement interface
       org.apache.hadoop.hive.ql.security.authorization.HiveMetastoreAuthorizationProvider.
     </description>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_security_authorization</name>
+      </property>
+    </depends-on>
   </property>
   <property>
     <name>hive.security.metastore.authorization.auth.reads</name>
@@ -1166,16 +1219,6 @@ limitations under the License.
     </value-attributes>
   </property>
 
-  <property>
-    <name>hive.server2.tez.default.queues</name>
-    <value>default</value>
-    <description>
-      A list of comma separated values corresponding to YARN queues of the same name.
-      When HiveServer2 is launched in Tez mode, this configuration needs to be set
-      for multiple Tez sessions to run in parallel on the cluster.
-    </description>
-  </property>
-
   <property>
     <name>hive.convert.join.bucket.mapjoin.tez</name>
     <value>false</value>
@@ -1324,12 +1367,20 @@ limitations under the License.
   </property>
 
   <property>
-    <name>hive.vectorized.execution.reduce.enabled</name>
-    <value>false</value>
-    <description>
-      This flag should be set to true to enable vectorized mode of the reduce-side of query execution.
-      The default value is true.
+    <name>hive.auto.convert.join.noconditionaltask.size</name>
+    <value>2147483648</value>
+    <description>If hive.auto.convert.join.noconditionaltask is off, this parameter does not take affect. However, if it
+      is on, and the sum of size for n-1 of the tables/partitions for a n-way join is smaller than this size, the join is directly
+      converted to a mapjoin(there is no conditional task). The default is 10MB.
     </description>
+    <display-name>For Map Join, per Map memory threshold</display-name>
+    <value-attributes>
+      <type>int</type>
+      <minimum>1073741824</minimum>
+      <maximum>17179869184</maximum>
+      <unit>B</unit>
+      <step-increment></step-increment>
+    </value-attributes>
   </property>
 
   <property>
@@ -1486,6 +1537,12 @@ limitations under the License.
       </entries>
       <selection-cardinality>1</selection-cardinality>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_exec_orc_storage_strategy</name>
+      </property>
+    </depends-on>
   </property>
 
   <property>
@@ -1510,6 +1567,12 @@ limitations under the License.
       </entries>
       <selection-cardinality>1</selection-cardinality>
     </value-attributes>
+    <depends-on>
+      <property>
+        <type>hive-env</type>
+        <name>hive_exec_orc_storage_strategy</name>
+      </property>
+    </depends-on>
   </property>
 
   <property>

+ 102 - 1
ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/configuration/hiveserver2-site.xml

@@ -31,5 +31,106 @@ limitations under the License.
     <description>the hive client authorization manager class name.
     The user defined authorization class should implement interface org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider.  </description>
   </property>
-  
+
+  <property>
+    <name>tez.session.am.dag.submit.timeout.secs</name>
+    <value>600</value>
+    <description></description>
+    <display-name>Max idle tez session length</display-name>
+    <value-attributes>
+      <type>int</type>
+      <minimum>600</minimum>
+      <maximum>86400</maximum>
+      <unit>seconds</unit>
+      <step-increment>600</step-increment>
+    </value-attributes>
+  </property>
+
+  <property>
+    <name>hive.server2.enable.doAs</name>
+    <value>true</value>
+    <description>
+      Setting this property to true will have HiveServer2 execute
+      Hive operations as the user making the calls to it.
+    </description>
+    <display-name>Run as end user instead of Hive user</display-name>
+    <value-attributes>
+      <type>value-list</type>
+      <entries>
+        <entry>
+          <value>true</value>
+          <label>True</label>
+        </entry>
+        <entry>
+          <value>false</value>
+          <label>False</label>
+        </entry>
+      </entries>
+      <selection-cardinality>1</selection-cardinality>
+    </value-attributes>
+  </property>
+
+  <property>
+    <name>hive.server2.tez.sessions.per.default.queue</name>
+    <value>1</value>
+    <description>
+      A positive integer that determines the number of Tez sessions that should be
+      launched on each of the queues specified by "hive.server2.tez.default.queues".
+      Determines the parallelism on each queue.
+    </description>
+    <display-name>Session per queue</display-name>
+    <value-attributes>
+      <type>int</type>
+      <minimum>1</minimum>
+      <maximum>10</maximum>
+      <step-increment>1</step-increment>
+    </value-attributes>
+  </property>
+
+  <property>
+    <name>hive.server2.tez.default.queues</name>
+    <display-name>Default query queues</display-name>
+    <value>default</value>
+    <description>
+      A list of comma separated values corresponding to YARN queues of the same name.
+      When HiveServer2 is launched in Tez mode, this configuration needs to be set
+      for multiple Tez sessions to run in parallel on the cluster.
+    </description>
+    <value-attributes>
+      <type>combo</type>
+      <entries>
+        <entry>
+          <value>default</value>
+          <label>Default</label>
+        </entry>
+      </entries>
+      <selection-cardinality>1+</selection-cardinality>
+    </value-attributes>
+  </property>
+
+  <property>
+    <name>hive.server2.tez.initialize.default.sessions</name>
+    <value>false</value>
+    <description>
+      This flag is used in HiveServer2 to enable a user to use HiveServer2 without
+      turning on Tez for HiveServer2. The user could potentially want to run queries
+      over Tez without the pool of sessions.
+    </description>
+    <display-name>Start Tez session at Initialization</display-name>
+    <value-attributes>
+      <type>value-list</type>
+      <entries>
+        <entry>
+          <value>true</value>
+          <label>True</label>
+        </entry>
+        <entry>
+          <value>false</value>
+          <label>False</label>
+        </entry>
+      </entries>
+      <selection-cardinality>1</selection-cardinality>
+    </value-attributes>
+  </property>
+
 </configuration>

+ 7 - 0
ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/metainfo.xml

@@ -108,6 +108,13 @@
         </osSpecific>
       </osSpecifics>
 
+      <themes>
+        <theme>
+          <fileName>theme.json</fileName>
+          <default>true</default>
+        </theme>
+      </themes>
+
       <requiredServices>
         <service>PIG</service>
       </requiredServices>

+ 609 - 0
ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json

@@ -0,0 +1,609 @@
+{
+  "Theme": {
+    "name": "default",
+    "description": "Default theme for HIVE service",
+    "configuration": {
+      "layouts": [
+        {
+          "name": "default",
+          "tabs": [
+            {
+              "name": "settings",
+              "display-name": "Settings",
+              "layout": {
+                "sections": [
+                  {
+                    "name": "optimization",
+                    "display-name": "Optimization",
+                    "row-index": "0",
+                    "column-index": "0",
+                    "row-span": "3",
+                    "column-span": "2",
+                    "section-columns": "2",
+                    "section-rows": "3",
+                    "subsections": [
+                      {
+                        "name": "optimization-row1-col1",
+                        "display-name": "Storage",
+                        "row-index": "0",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "optimization-row1-col2",
+                        "display-name": "",
+                        "row-index": "0",
+                        "column-index": "1",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "optimization-row2-col1",
+                        "display-name": "Optimization Vectorization",
+                        "row-index": "1",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "optimization-row2-col2",
+                        "display-name": "",
+                        "row-index": "1",
+                        "column-index": "1",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "optimization-row3-col1",
+                        "display-name": "Memory",
+                        "row-index": "2",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "optimization-row3-col2",
+                        "display-name": "",
+                        "row-index": "2",
+                        "column-index": "1",
+                        "row-span": "1",
+                        "column-span": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "name": "acid-transactions",
+                    "display-name": "Acid Transactions",
+                    "row-index": "0",
+                    "column-index": "2",
+                    "row-span": "2",
+                    "column-span": "1",
+                    "section-columns": "1",
+                    "section-rows": "2",
+                    "subsections": [
+                      {
+                        "name": "acid-transactions-row1-col1",
+                        "row-index": "0",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "name": "performance",
+                    "display-name": "Performance",
+                    "row-index": "3",
+                    "column-index": "0",
+                    "row-span": "3",
+                    "column-span": "2",
+                    "section-columns": "2",
+                    "section-rows": "3",
+                    "subsections": [
+                      {
+                        "name": "performance-row1-col1",
+                        "display-name": "TEZ Engine",
+                        "row-index": "0",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "performance-row1-col2",
+                        "display-name": "",
+                        "row-index": "0",
+                        "column-index": "1",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "performance-row2-col1",
+                        "row-index": "1",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "performance-row2-col2",
+                        "row-index": "1",
+                        "column-index": "1",
+                        "row-span": "1",
+                        "column-span": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "name": "interactive-query",
+                    "display-name": "Interactive Query",
+                    "row-index": "2",
+                    "column-index": "2",
+                    "row-span": "2",
+                    "column-span": "1",
+                    "section-columns": "1",
+                    "section-rows": "2",
+                    "subsections": [
+                      {
+                        "name": "interactive-query-row1-col1",
+                        "row-index": "0",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "name": "security",
+                    "display-name": "Security",
+                    "row-index": "4",
+                    "column-index": "2",
+                    "row-span": "2",
+                    "column-span": "1",
+                    "section-columns": "1",
+                    "section-rows": "2",
+                    "subsections": [
+                      {
+                        "name": "security-row1-col1",
+                        "row-index": "0",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      }
+                    ]
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      ]
+    },
+    "placement": {
+      "configuration-layout": "default",
+      "configs": [
+        {
+          "config": "hive-site/hive.default.fileformat",
+          "subsection-name": "optimization-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.exec.orc.default.stripe.size",
+          "subsection-name": "optimization-row1-col1"
+        },
+        {
+          "config": "hive-env/hive_exec_orc_storage_strategy",
+          "subsection-name": "optimization-row1-col2"
+        },
+        {
+          "config": "hive-site/hive.exec.orc.default.compress",
+          "subsection-name": "optimization-row1-col2"
+        },
+        {
+          "config": "hive-site/hive.optimize.index.filter",
+          "subsection-name": "optimization-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.optimize.sort.dynamic.partition",
+          "subsection-name": "optimization-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.exec.orc.encoding.strategy",
+          "subsection-name": "optimization-row1-col2"
+        },
+        {
+          "config": "hive-site/hive.exec.orc.compression.strategy",
+          "subsection-name": "optimization-row1-col2"
+        },
+        {
+          "config": "hive-site/hive.vectorized.execution.enabled",
+          "subsection-name": "optimization-row2-col1"
+        },
+        {
+          "config": "hive-site/hive.vectorized.execution.reduce.enabled",
+          "subsection-name": "optimization-row2-col2"
+        },
+        {
+          "config": "hive-site/hive.auto.convert.join.noconditionaltask.size",
+          "subsection-name": "optimization-row3-col1"
+        },
+        {
+          "config": "hive-site/hive.exec.reducers.bytes.per.reducer",
+          "subsection-name": "optimization-row3-col2"
+        },
+        {
+          "config": "hive-env/hive_txn_acid",
+          "subsection-name": "acid-transactions-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.txn.manager",
+          "subsection-name": "acid-transactions-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.support.concurrency",
+          "subsection-name": "acid-transactions-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.compactor.initiator.on",
+          "subsection-name": "acid-transactions-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.compactor.worker.threads",
+          "subsection-name": "acid-transactions-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.enforce.bucketing",
+          "subsection-name": "acid-transactions-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.exec.dynamic.partition.mode",
+          "subsection-name": "acid-transactions-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.execution.engine",
+          "subsection-name": "performance-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.tez.container.size",
+          "subsection-name": "performance-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.prewarm.enabled",
+          "subsection-name": "performance-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.prewarm.numcontainers",
+          "subsection-name": "performance-row1-col2"
+        },
+        {
+          "config": "hive-site/hive.tez.auto.reducer.parallelism",
+          "subsection-name": "performance-row1-col2"
+        },
+        {
+          "config": "hive-site/hive.tez.dynamic.partition.pruning",
+          "subsection-name": "performance-row1-col2"
+        },
+        {
+          "config": "hive-site/hive.cbo.enable",
+          "subsection-name": "performance-row2-col1"
+        },
+        {
+          "config": "hive-site/hive.stats.fetch.partition.stats",
+          "subsection-name": "performance-row2-col1"
+        },
+        {
+          "config": "hive-site/hive.stats.fetch.column.stats",
+          "subsection-name": "performance-row2-col1"
+        },
+        {
+          "config": "hive-site/hive.compute.query.using.stats",
+          "subsection-name": "performance-row2-col2"
+        },
+        {
+          "config": "hiveserver2-site/hive.server2.tez.initialize.default.sessions",
+          "subsection-name": "interactive-query-row1-col1"
+        },
+        {
+          "config": "hiveserver2-site/hive.server2.tez.sessions.per.default.queue",
+          "subsection-name": "interactive-query-row1-col1"
+        },
+        {
+          "config": "hiveserver2-site/hive.server2.enable.doAs",
+          "subsection-name": "interactive-query-row1-col1"
+        },
+        {
+          "config": "hiveserver2-site/tez.session.am.dag.submit.timeout.secs",
+          "subsection-name": "interactive-query-row1-col1"
+        },
+        {
+          "config": "hive-env/hive_security_authorization",
+          "subsection-name": "security-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.security.authorization.enabled",
+          "subsection-name": "security-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.security.metastore.authorization.manager",
+          "subsection-name": "security-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.server2.authentication",
+          "subsection-name": "security-row1-col1"
+        },
+        {
+          "config": "hive-site/hive.server2.use.SSL",
+          "subsection-name": "security-row1-col1"
+        }
+      ]
+    },
+    "widgets": [
+      {
+        "config": "hive-site/hive.default.fileformat",
+        "widget": {
+          "type": "combo"
+        }
+      },
+      {
+        "config": "hive-site/hive.exec.orc.default.stripe.size",
+        "widget": {
+          "type": "slider",
+          "units": [
+            {
+              "unit-name": "MB"
+            }
+          ]
+        }
+      },
+      {
+        "config": "hive-site/hive.exec.orc.default.compress",
+        "widget": {
+          "type": "combo"
+        }
+      },
+      {
+        "config": "hive-site/hive.optimize.index.filter",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.optimize.sort.dynamic.partition",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.exec.orc.encoding.strategy",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-env/hive_exec_orc_storage_strategy",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.exec.orc.compression.strategy",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.vectorized.execution.enabled",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.vectorized.execution.reduce.enabled",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.auto.convert.join.noconditionaltask.size",
+        "widget": {
+          "type": "slider",
+          "units": [
+            {
+              "unit-name": "MB"
+            }
+          ]
+        }
+      },
+      {
+        "config": "hive-site/hive.exec.reducers.bytes.per.reducer",
+        "widget": {
+          "type": "slider",
+          "units": [
+            {
+              "unit-name": "MB"
+            }
+          ]
+        }
+      },
+      {
+        "config": "hive-env/hive_txn_acid",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.txn.manager",
+        "widget": {
+          "type": "combo"
+        }
+      },
+      {
+        "config": "hive-site/hive.security.metastore.authorization.manager",
+        "widget": {
+          "type": "string"
+        }
+      },
+      {
+        "config": "hive-site/hive.support.concurrency",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.compactor.initiator.on",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.compactor.worker.threads",
+        "widget": {
+          "type": "slider",
+          "units": [
+            {
+              "unit-name": "int"
+            }
+          ]
+        }
+      },
+      {
+        "config": "hive-site/hive.enforce.bucketing",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.exec.dynamic.partition.mode",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.execution.engine",
+        "widget": {
+          "type": "combo"
+        }
+      },
+      {
+        "config": "hive-site/hive.tez.container.size",
+        "widget": {
+          "type": "slider",
+          "units": [
+            {
+              "unit-name": "MB"
+            }
+          ]
+        }
+      },
+      {
+        "config": "hive-site/hive.prewarm.enabled",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.prewarm.numcontainers",
+        "widget": {
+          "type": "slider",
+          "units": [
+            {
+              "unit-name": "int"
+            }
+          ]
+        }
+      },
+      {
+        "config": "hive-site/hive.tez.auto.reducer.parallelism",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.tez.dynamic.partition.pruning",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.cbo.enable",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.stats.fetch.partition.stats",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.stats.fetch.column.stats",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.compute.query.using.stats",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hiveserver2-site/hive.server2.tez.initialize.default.sessions",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hiveserver2-site/hive.server2.tez.sessions.per.default.queue",
+        "widget": {
+          "type": "slider",
+          "units": [
+            {
+              "unit-name": "int"
+            }
+          ]
+        }
+      },
+      {
+        "config": "hiveserver2-site/hive.server2.enable.doAs",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hiveserver2-site/tez.session.am.dag.submit.timeout.secs",
+        "widget": {
+          "type": "time-interval-spinner",
+          "units": [
+            {
+              "unit-name": "hours,minutes"
+            }
+          ]
+        }
+      },
+      {
+        "config": "hive-env/hive_security_authorization",
+        "widget": {
+          "type": "combo"
+        }
+      },
+      {
+        "config": "hive-site/hive.security.authorization.enabled",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "hive-site/hive.server2.authentication",
+        "widget": {
+          "type": "combo"
+        }
+      },
+      {
+        "config": "hive-site/hive.server2.use.SSL",
+        "widget": {
+          "type": "toggle"
+        }
+      }
+    ]
+  }
+}

+ 52 - 50
ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes/theme.json

@@ -24,20 +24,21 @@
                     "section-columns": "2",
                     "section-rows": "1",
                     "subsections": [
-	                  {
-	                    "name": "subsection-nm-sizing-col1",
-	                    "row-index": "0",
-	                    "column-index": "0",
-	                    "row-span": "1",
-	                    "column-span": "1"
-	                  }, {
-	                    "name": "subsection-nm-sizing-col2",
-	                    "row-index": "0",
-	                    "column-index": "1",
-	                    "row-span": "1",
-	                    "column-span": "1"
-	                  }
-	                ]
+                      {
+                        "name": "subsection-nm-sizing-col1",
+                        "row-index": "0",
+                        "column-index": "0",
+                        "row-span": "1",
+                        "column-span": "1"
+                      },
+                      {
+                        "name": "subsection-nm-sizing-col2",
+                        "row-index": "0",
+                        "column-index": "1",
+                        "row-span": "1",
+                        "column-span": "1"
+                      }
+                    ]
                   },
                   {
                     "name": "section-yarn-platform-features",
@@ -74,7 +75,8 @@
                         "column-index": "0",
                         "row-span": "1",
                         "column-span": "1"
-                      }, {
+                      },
+                      {
                         "name": "subsection-container-sizing-col2",
                         "row-index": "0",
                         "column-index": "1",
@@ -139,14 +141,14 @@
         }
       ]
     },
-    "widgets":[
+    "widgets": [
       {
-        "config":"yarn-site/yarn.nodemanager.resource.memory-mb",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "yarn-site/yarn.nodemanager.resource.memory-mb",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"MB"
+              "unit-name": "MB"
             }
           ]
         }
@@ -185,65 +187,65 @@
         }
       },
       {
-        "config":"yarn-site/yarn.scheduler.minimum-allocation-mb",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "yarn-site/yarn.scheduler.minimum-allocation-mb",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"MB"
+              "unit-name": "MB"
             }
           ]
         }
       },
       {
-        "config":"yarn-site/yarn.scheduler.maximum-allocation-mb",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "yarn-site/yarn.scheduler.maximum-allocation-mb",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"MB"
+              "unit-name": "MB"
             }
           ]
         }
       },
       {
-        "config":"yarn-site/yarn.scheduler.minimum-allocation-vcores",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "yarn-site/yarn.scheduler.minimum-allocation-vcores",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"int"
+              "unit-name": "int"
             }
           ]
         }
       },
       {
-        "config":"yarn-site/yarn.scheduler.maximum-allocation-vcores",
-        "widget":{
-          "type":"slider",
-          "units":[
+        "config": "yarn-site/yarn.scheduler.maximum-allocation-vcores",
+        "widget": {
+          "type": "slider",
+          "units": [
             {
-              "unit-name":"int"
+              "unit-name": "int"
             }
           ]
         }
       },
       {
-        "config":"yarn-site/yarn.node-labels.enabled",
-        "widget":{
-          "type":"checkbox"
+        "config": "yarn-site/yarn.node-labels.enabled",
+        "widget": {
+          "type": "checkbox"
         }
       },
       {
-        "config":"yarn-site/yarn.log-aggregation-enable",
-        "widget":{
-          "type":"checkbox"
+        "config": "yarn-site/yarn.log-aggregation-enable",
+        "widget": {
+          "type": "checkbox"
         }
       },
       {
-        "config":"yarn-site/yarn.resourcemanager.work-preserving-recovery.enabled",
-        "widget":{
-          "type":"checkbox"
+        "config": "yarn-site/yarn.resourcemanager.work-preserving-recovery.enabled",
+        "widget": {
+          "type": "checkbox"
         }
       }
     ]

+ 3 - 1
ambari-web/app/controllers/main/service/info/configs.js

@@ -907,12 +907,14 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
    */
   checkOverrideProperty: function (componentConfig) {
     var overrideToAdd = this.get('overrideToAdd');
+    var value = Em.get(overrideToAdd, 'value');
+    var isEnhanced = !!this.get('overrideToAdd.widget');
     if (overrideToAdd) {
       overrideToAdd = componentConfig.configs.filter(function(c){
         return c.name == overrideToAdd.name && c.filename == overrideToAdd.filename;
       });
       if (overrideToAdd[0]) {
-        this.addOverrideProperty(overrideToAdd[0], this.get('selectedConfigGroup'));
+        this.addOverrideProperty(overrideToAdd[0], this.get('selectedConfigGroup'), isEnhanced ? value : null);
         this.set('overrideToAdd', null);
       }
     }

+ 1 - 1
ambari-web/app/mixins/main/service/configs/config_overridable.js

@@ -62,7 +62,7 @@ App.ConfigOverridable = Em.Mixin.create({
       );
     }
     else {
-      serviceConfigController.addOverrideProperty(serviceConfigProperty, selectedConfigGroup);
+      serviceConfigController.addOverrideProperty(serviceConfigProperty, selectedConfigGroup, serviceConfigProperty.get('widget') ? serviceConfigProperty.get('value') : null);
     }
   },
 

+ 1 - 1
ambari-web/app/mixins/unit_convert/convert_unit_widget_view_mixin.js

@@ -37,8 +37,8 @@ App.ConvertUnitWidgetViewMixin = Em.Mixin.create(App.BaseUnitConvertMixin, {
    * Get converted value according to config property unit format from specified widget value.
    *
    * @param {String|Number|Object[]} value - widget value to convert
-   * @param {Boolean} returnObject - returned value should be an array of objects
    * @returns {Number}
+   * @method configValueByWidget
    */
   configValueByWidget: function(value) {
     return this.convertValue(value, this._converterGetWidgetUnits(), this._converterGetPropertyAttributes());

+ 5 - 1
ambari-web/app/styles/application.less

@@ -5618,7 +5618,6 @@ input[type="checkbox"].align-checkbox {
     width: ~"calc(100% + 40px)";
     .config-section-table {
       width: 100%;
-      height: 100%;
       border-spacing: 20px;
       border-collapse: separate;
       table-layout: fixed; // for width to be equally distributed
@@ -5633,6 +5632,11 @@ input[type="checkbox"].align-checkbox {
           font-weight: 400;
         }
 
+        h5 {
+          font-size: 18px;
+          font-weight: 400;
+        }
+
         td:not(:first-of-type) {
           border-left: 2px solid #ccc; // horizontal splitter
           padding-left: 20px;

+ 1 - 0
ambari-web/app/templates.js

@@ -22,3 +22,4 @@
 
 require('templates/main/service/info/summary/base');
 require('templates/common/progress');
+require('templates/common/configs/widgets/controls');

+ 1 - 1
ambari-web/app/templates/common/configs/service_config.hbs

@@ -111,7 +111,7 @@
             {{/each}}
           {{else}}
               {{! Render Enhanced Config Section }}
-              {{view App.ServiceConfigLayoutTabView contentBinding="tab"}}
+              {{view App.ServiceConfigLayoutTabView contentBinding="tab" canEditBinding="view.canEdit" }}
           {{/if}}
         </div>
       {{/each}}

+ 3 - 2
ambari-web/app/templates/common/configs/service_config_layout_tab.hbs

@@ -28,10 +28,11 @@
                 <tr>
                   {{#each subsection in subRow}}
                     <td {{bindAttr class="subsection.isHiddenByFilter:invisible :config-subsection"}}>
+                      <h5>{{subsection.displayName}}&nbsp;</h5>
                       {{#each config in subsection.configs}}
-                        {{#if config.view}}
+                        {{#if config.widget}}
                           {{#unless config.isHiddenByFilter}}
-                            {{view config.widget configBinding="config"}}
+                            {{view config.widget configBinding="config" canEditBinding="view.canEdit"}}
                           {{/unless}}
                         {{/if}}
                       {{/each}}

+ 1 - 40
ambari-web/app/templates/common/configs/widgets/checkbox_config_widget.hbs

@@ -24,43 +24,4 @@
     {{/if}}
   </label>
 </div>
-<div {{bindAttr class="view.isHover:show:not-show :clearfix"}}>
-  {{#if view.isOriginalSCP}}
-    {{view App.RestoreConfigView visibleBinding="view.undoAllowed"}}
-  {{/if}}
-  {{#if view.overrideAllowed}}
-    {{#isAccessible ADMIN}}
-      <div class="pull-left action-button">
-        <a class="btn btn-small" href="#" data-toggle="tooltip"
-          {{action "createOverrideProperty" view.config target="view.parentView"}}
-          {{translateAttr data-original-title="common.override"}}>
-          <i class="icon-plus-sign"></i>
-        </a>
-      </div>
-    {{/isAccessible}}
-  {{/if}}
-</div>
-
-{{#if view.isComparison}}
-  {{#if controller.selectedConfigGroup.isDefault}}
-    <span
-        class="label label-info">{{t dashboard.configHistory.table.version.prefix}}{{controller.selectedVersion}}</span>
-    {{#if controller.isCurrentSelected}}
-      <span class="label label-success">{{t common.current}}</span>
-    {{/if}}
-  {{else}}
-    <span class="label label-info">{{t common.default}}
-      &nbsp;{{t services.service.config.configHistory.configGroup}}</span>
-  {{/if}}
-{{/if}}
-
-{{#if view.isOriginalSCP}}
-  {{view App.ConfigWidgetOverrideView
-  serviceConfigPropertyBinding="view.config"
-  isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-  }}
-{{/if}}
-
-{{#if view.isComparison}}
-  {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
-{{/if}}
+{{template "templates/common/configs/widgets/controls"}}

+ 19 - 27
ambari-web/app/templates/common/configs/widgets/combo_config_widget.hbs

@@ -15,32 +15,24 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
-
-<p class="widget-config-label">{{view.configLabel}}</p>
-<div class="input-append pull-left">
-  {{view Em.TextField valueBinding="view.content.value" disabled="disabled"}}
-  <div class="dropdown btn-group">
-    <button class="btn dropdown-toggle" data-toggle="dropdown">
-      <span class="caret"></span>
-    </button>
-    <ul class="dropdown-menu">
-      {{#each item in view.content.valuesList}}
-        <li>
-          <a href="#" {{action setConfigValue item.configValue target="view"}}>{{item.widgetValue}}</a>
-        </li>
-      {{/each}}
-    </ul>
-  </div>
-</div>
-{{view App.RestoreConfigView}}
 {{#if view.isOriginalSCP}}
-  {{view App.ConfigWidgetOverrideView
-  serviceConfigPropertyBinding="view.config"
-  isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-  }}
-{{/if}}
-
-{{#if view.isComparison}}
-  {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
+  <p class="widget-config-label">{{view.configLabel}}</p>
 {{/if}}
-<div class="clearfix"></div>
+<div {{bindAttr class="view.isOriginalSCP:original-widget"}}>
+  <div class="input-append">
+    {{view Em.TextField valueBinding="view.content.value" disabled="disabled"}}
+    <div class="dropdown btn-group">
+      <button {{bindAttr class="view.disabled:disabled :btn :dropdown-toggle"}} data-toggle="dropdown">
+        <span class="caret"></span>
+      </button>
+      <ul class="dropdown-menu">
+        {{#each item in view.content.valuesList}}
+          <li>
+            <a href="#" {{action setConfigValue item.configValue target="view"}}>{{item.widgetValue}}</a>
+          </li>
+        {{/each}}
+      </ul>
+    </div>
+  </div>
+</div>
+{{template "templates/common/configs/widgets/controls"}}

+ 69 - 0
ambari-web/app/templates/common/configs/widgets/controls.hbs

@@ -0,0 +1,69 @@
+{{!
+* 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.
+}}
+{{#if view.canEdit}}
+  <div class="clearfix">
+    {{#if view.config.supportsFinal}}
+      <a href="#" data-toggle="tooltip"
+        {{bindAttr class=":btn :btn-small :btn-final :pull-left view.config.isFinal:active view.showFinalConfig:show:not-show" disabled="view.config.isNotEditable"}}
+        {{action "toggleFinalFlag" view.config target="view"}}
+        {{translateAttr data-original-title="services.service.config.final"}}>
+        <i class="icon-lock"></i>
+      </a>
+    {{/if}}
+    {{#if view.overrideAllowed}}
+      {{#isAccessible ADMIN}}
+        <div {{bindAttr class=":pull-left :action-button view.isHover:show:not-show"}}>
+          <a class="btn btn-small" href="#" data-toggle="tooltip"
+            {{action "createOverrideProperty" view.config target="view.parentView"}}
+            {{translateAttr data-original-title="common.override"}}>
+            <i class="icon-plus-sign"></i>
+          </a>
+        </div>
+      {{/isAccessible}}
+    {{/if}}
+    {{#if view.isOriginalSCP}}
+      {{view App.RestoreConfigView visibleBinding="view.undoAllowed"}}
+    {{/if}}
+  </div>
+
+  {{#if view.isComparison}}
+    {{#if controller.selectedConfigGroup.isDefault}}
+      <span
+          class="label label-info">{{t dashboard.configHistory.table.version.prefix}}{{controller.selectedVersion}}</span>
+      {{#if controller.isCurrentSelected}}
+        <span class="label label-success">{{t common.current}}</span>
+      {{/if}}
+    {{else}}
+      <span class="label label-info">{{t common.default}}
+        &nbsp;{{t services.service.config.configHistory.configGroup}}</span>
+    {{/if}}
+  {{/if}}
+
+  {{#if view.isOriginalSCP}}
+    {{view App.ConfigWidgetOverrideView
+    serviceConfigPropertyBinding="view.config"
+    isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
+    }}
+  {{/if}}
+
+  {{#if view.isComparison}}
+    {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
+  {{/if}}
+{{else}}
+  <div class="clearfix"></div>
+{{/if}}

+ 5 - 16
ambari-web/app/templates/common/configs/widgets/directory_config_widget.hbs

@@ -15,22 +15,11 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
+
 <div class="span10">
-  <span class="widget-config-label">{{view.config.displayName}}</span>
+  {{#if view.isOriginalSCP}}
+    <span class="widget-config-label">{{view.config.displayName}}</span>
+  {{/if}}
   {{view view.configView}}
 </div>
-{{view App.RestoreConfigView}}
-<div class="clearfix"></div>
-{{#if view.configErrorMessage}}
-  <p class="text-error">{{view.configErrorMessage}}</p>
-{{/if}}
-{{#if view.isOriginalSCP}}
-  {{view App.ConfigWidgetOverrideView
-  serviceConfigPropertyBinding="view.config"
-  isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-  }}
-{{/if}}
-
-{{#if view.isComparison}}
-  {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
-{{/if}}
+{{template "templates/common/configs/widgets/controls"}}

+ 4 - 12
ambari-web/app/templates/common/configs/widgets/list_config_widget.hbs

@@ -17,7 +17,9 @@
 }}
 
 <div {{bindAttr class="view.config.isHiddenByFilter:hide :widget-config :list-widget"}}>
-  <p class="widget-config-label">{{view.configLabel}}</p>
+  {{#if view.isOriginalSCP}}
+    <p class="widget-config-label">{{view.configLabel}}</p>
+  {{/if}}
   <div class="btn-group">
     <a class="btn dropdown-toggle" data-toggle="dropdown">{{view.displayVal}} <span class="caret"></span></a>
     {{#if view.valueIsChanged}}
@@ -39,14 +41,4 @@
       {{/each}}
     </ul>
   </div>
-  {{#if view.isOriginalSCP}}
-    {{view App.ConfigWidgetOverrideView
-    serviceConfigPropertyBinding="view.config"
-    isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-    }}
-  {{/if}}
-
-  {{#if view.isComparison}}
-    {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
-  {{/if}}
-</div>
+{{template "templates/common/configs/widgets/controls"}}

+ 1 - 12
ambari-web/app/templates/common/configs/widgets/radio_button_config.hbs

@@ -29,15 +29,4 @@
     </label>
   {{/each}}
 </div>
-{{view App.RestoreConfigView}}
-{{#if view.isOriginalSCP}}
-  {{view App.ConfigWidgetOverrideView
-  serviceConfigPropertyBinding="view.config"
-  isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-  }}
-{{/if}}
-
-{{#if view.isComparison}}
-  {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
-{{/if}}
-<div class="clearfix"></div>
+{{template "templates/common/configs/widgets/controls"}}

+ 2 - 50
ambari-web/app/templates/common/configs/widgets/slider_config_widget.hbs

@@ -16,8 +16,7 @@
 * limitations under the License.
 }}
 
-
-<div {{bindAttr class="view.config.isHiddenByFilter:hide :widget-config :slider-widget"}}>
+<div class="widget-config slider-widget">
   {{#if view.isOriginalSCP}}
     <p class="widget-config-label">{{formatWordBreak view.configLabel}}</p>
   {{/if}}
@@ -25,52 +24,5 @@
     <div class="pull-left ui-slider-wrapper-inner">{{view Ember.TextField valueBinding="view.config.value" class="input-mini slider-input"}}</div>
     <div class="pull-right ui-slider-label">{{view.mirrorValue}} {{view.unitLabel}}</div>
   </div>
-  <div {{bindAttr class=":clearfix"}}>
-      {{#if view.config.supportsFinal}}
-        <a href="#" data-toggle="tooltip"
-          {{bindAttr class=":btn :btn-small :btn-final :pull-left view.config.isFinal:active view.showFinalConfig:show:not-show" disabled="view.config.isNotEditable"}}
-          {{action "toggleFinalFlag" view.config target="view"}}
-          {{translateAttr data-original-title="services.service.config.final"}}>
-          <i class="icon-lock"></i>
-        </a>
-      {{/if}}
-      {{#if view.overrideAllowed}}
-        {{#isAccessible ADMIN}}
-          <div {{bindAttr class=":pull-left :action-button view.isHover:show:not-show"}}>
-            <a class="btn btn-small" href="#" data-toggle="tooltip"
-              {{action "createOverrideProperty" view.config target="view.parentView"}}
-              {{translateAttr data-original-title="common.override"}}>
-              <i class="icon-plus-sign"></i>
-            </a>
-          </div>
-        {{/isAccessible}}
-      {{/if}}
-      {{#if view.isOriginalSCP}}
-        {{view App.RestoreConfigView visibleBinding="view.undoAllowed"}}
-      {{/if}}
-  </div>
-
-  {{#if view.isComparison}}
-    {{#if controller.selectedConfigGroup.isDefault}}
-      <span
-          class="label label-info">{{t dashboard.configHistory.table.version.prefix}}{{controller.selectedVersion}}</span>
-      {{#if controller.isCurrentSelected}}
-        <span class="label label-success">{{t common.current}}</span>
-      {{/if}}
-    {{else}}
-      <span class="label label-info">{{t common.default}}
-        &nbsp;{{t services.service.config.configHistory.configGroup}}</span>
-    {{/if}}
-  {{/if}}
-
-  {{#if view.isOriginalSCP}}
-    {{view App.ConfigWidgetOverrideView
-      serviceConfigPropertyBinding="view.config"
-      isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-    }}
-  {{/if}}
-
-  {{#if view.isComparison}}
-    {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
-  {{/if}}
+  {{template "templates/common/configs/widgets/controls"}}
 </div>

+ 5 - 17
ambari-web/app/templates/common/configs/widgets/textfield_config_widget.hbs

@@ -16,22 +16,10 @@
 * limitations under the License.
 }}
 
-<div class="pull-left">
-  <p class="widget-config-label">{{view.configLabel}}</p>
+<div>
+  {{#if view.isOriginalSCP}}
+    <p class="widget-config-label">{{view.configLabel}}</p>
+  {{/if}}
   {{view view.configView}}
 </div>
-{{view App.RestoreConfigView}}
-<div class="clearfix"></div>
-{{#if view.configErrorMessage}}
-  <p class="text-error">{{view.configErrorMessage}}</p>
-{{/if}}
-{{#if view.isOriginalSCP}}
-  {{view App.ConfigWidgetOverrideView
-  serviceConfigPropertyBinding="view.config"
-  isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-  }}
-{{/if}}
-
-{{#if view.isComparison}}
-  {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
-{{/if}}
+{{template "templates/common/configs/widgets/controls"}}

+ 9 - 24
ambari-web/app/templates/common/configs/widgets/time_interval_spinner.hbs

@@ -15,29 +15,14 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
-<p class="widget-config-label">{{view.configLabel}}</p>
-{{#each spinnerContent in view.content}}
-  {{view App.SpinnerInputView contentBinding="spinnerContent" disabledBinding="view.disabled"}}
-{{/each}}
-{{#if view.valueIsChanged}}
-  <div class="action-button">
-    <a class="btn btn-small" href="#" {{action "restoreValue" target="view"}}>
-      <i class="icon-undo"></i>
-    </a>
-  </div>
-{{/if}}
-{{#if view.errorMessage}}
-  <div class="clearfix"></div>
-  <p class="text-error">{{view.errorMessage}}</p>
-{{/if}}
-{{#if view.isOriginalSCP}}
-  {{view App.ConfigWidgetOverrideView
-  serviceConfigPropertyBinding="view.config"
-  isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-  }}
-{{/if}}
 
-{{#if view.isComparison}}
-  {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
+{{#if view.isOriginalSCP}}
+  <p class="widget-config-label">{{view.configLabel}}</p>
 {{/if}}
-<div class="clearfix"></div>
+<div {{bindAttr class="view.isOriginalSCP:original-widget"}}>
+  {{#each spinnerContent in view.content}}
+    {{view App.SpinnerInputView contentBinding="spinnerContent" disabledBinding="view.disabled"}}
+  {{/each}}
+  <div class="clearfix"></div>
+</div>
+{{template "templates/common/configs/widgets/controls"}}

+ 5 - 14
ambari-web/app/templates/common/configs/widgets/toggle_config_widget.hbs

@@ -16,19 +16,10 @@
 * limitations under the License.
 }}
 
-<p class="widget-config-label">{{view.configLabel}}</p>
-<div class="pull-left">
-  {{view Ember.Checkbox checkedBinding="view.switcherValue"}}
-</div>
-{{view App.RestoreConfigView}}
 {{#if view.isOriginalSCP}}
-  {{view App.ConfigWidgetOverrideView
-  serviceConfigPropertyBinding="view.config"
-  isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
-  }}
-{{/if}}
-
-{{#if view.isComparison}}
-  {{view App.ConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
+  <p class="widget-config-label">{{view.configLabel}}</p>
 {{/if}}
-<div class="clearfix"></div>
+<div {{bindAttr class="view.isOriginalSCP:original-widget"}}>
+  {{view Ember.Checkbox checkedBinding="view.switcherValue"}}
+</div>
+{{template "templates/common/configs/widgets/controls"}}

+ 1 - 0
ambari-web/app/utils/helper.js

@@ -561,6 +561,7 @@ App.format = {
  * @param {object} options
  */
 App.popover = function (self, options) {
+  if (!self) return;
   self.popover(options);
   self.on("remove", function () {
     $(this).trigger('mouseleave');

+ 11 - 1
ambari-web/app/views/common/configs/service_config_layout_tab_view.js

@@ -20,6 +20,15 @@ var App = require('app');
 
 App.ServiceConfigLayoutTabView = Em.View.extend(App.ConfigOverridable, {
 
+  /**
+   * Determines if view is editable
+   * It true - show all control-elements (undo, override, finalize etc) for each widget
+   * If false - no widgets control-elements will be shown
+   * Bound from template
+   * @type {boolean}
+   */
+  canEdit: true,
+
   /**
    * @type {App.Service}
    */
@@ -46,7 +55,8 @@ App.ServiceConfigLayoutTabView = Em.View.extend(App.ConfigOverridable, {
     'radio-buttons': App.RadioButtonConfigWidgetView,
     slider: App.SliderConfigWidgetView,
     'time-interval-spinner': App.TimeIntervalSpinnerView,
-    toggle: App.ToggleConfigWidgetView
+    toggle: App.ToggleConfigWidgetView,
+    string: App.StringConfigWidgetView
   },
 
   /**

+ 6 - 3
ambari-web/app/views/common/configs/widgets/combo_config_widget_view.js

@@ -24,7 +24,7 @@ var App = require('app');
  */
 App.ComboConfigWidgetView = App.ConfigWidgetView.extend({
   templateName: require('templates/common/configs/widgets/combo_config_widget'),
-  classNames: ['widget', 'combo-widget'],
+  classNames: ['widget-config', 'combo-widget'],
 
   /**
    * Object with following structure:
@@ -40,6 +40,9 @@ App.ComboConfigWidgetView = App.ConfigWidgetView.extend({
 
   didInsertElement: function() {
     this.generateContent();
+    this.toggleWidgetState();
+    this.initPopover();
+    this._super();
   },
 
   /**
@@ -57,14 +60,14 @@ App.ComboConfigWidgetView = App.ConfigWidgetView.extend({
    * Generate values map according to widget/value format.
    *
    * @method convertToWidgetUnits
-   * @params {Object} valueAttributes
+   * @param {Object} valueAttributes
    * @returns {Object[]} - values list map @see content.valuesList
    */
   convertToWidgetUnits: function(valueAttributes) {
     return Em.get(valueAttributes, 'entries').map(function(item) {
       return Em.Object.create({
         configValue: item.value,
-        widgetValue: Em.getWithDefault(item, 'label', item.value)
+        widgetValue: item.label || item.value
       });
     });
   },

+ 23 - 0
ambari-web/app/views/common/configs/widgets/config_widget_view.js

@@ -35,6 +35,21 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo
    */
   isHover: false,
 
+  /**
+   * Determines if widget controls should be disabled
+   * @type {boolean}
+   */
+  disabled: false,
+
+  /**
+   * Determines if widget is editable
+   * It true - show all control-elements (undo, override, finalize etc) for widget
+   * If false - no widget control-elements will be shown
+   * Bound from template
+   * @type {boolean}
+   */
+  canEdit: true,
+
   /**
    * Alias to <code>config.isOriginalSCP</code>
    * Should be used in the templates
@@ -76,6 +91,14 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo
     return this.get('config.value') != this.get('config.defaultValue');
   }.property('config.value'),
 
+  /**
+   * Enable/disable widget state
+   * @method toggleWidgetState
+   */
+  toggleWidgetState: function () {
+    this.set('disabled', !this.get('config.isEditable'));
+  }.observes('config.isEditable'),
+
   /**
    * Reset config-value to its default
    * @method restoreValue

+ 2 - 7
ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js

@@ -35,12 +35,6 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({
    */
   slider: null,
 
-  /**
-   * Determines if widget controls should be disabled
-   * @type {boolean}
-   */
-  disabled: false,
-
   /**
    * Mirror of the config-value shown in the input on the left of the slider
    * @type {number}
@@ -85,7 +79,7 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({
   toggleWidgetState: function () {
     var slider = this.get('slider');
     this.get('config.isEditable') ? slider.enable() : slider.disable();
-    this.set('disabled', !this.get('config.isEditable'));
+    this._super();
   }.observes('config.isEditable'),
 
   willInsertElement: function () {
@@ -181,6 +175,7 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({
   /**
    * Setup convert table according to widget unit-name and property type.
    * Set label for unit to display.
+   * @method prepareValueConverter
    */
   prepareValueConverter: function() {
     var widgetUnit = this._converterGetWidgetUnits();

+ 4 - 2
ambari-web/app/views/common/configs/widgets/time_interval_spinner_view.js

@@ -20,7 +20,7 @@ var App = require('app');
 
 App.TimeIntervalSpinnerView = App.ConfigWidgetView.extend({
   templateName: require('templates/common/configs/widgets/time_interval_spinner'),
-  classNames: ['spinner-input-widget'],
+  classNames: ['widget-config', 'spinner-input-widget'],
 
   /**
    * @property isValid
@@ -82,6 +82,8 @@ App.TimeIntervalSpinnerView = App.ConfigWidgetView.extend({
   didInsertElement: function () {
     Em.run.once(this, 'prepareContent');
     this._super();
+    this.toggleWidgetState();
+    this.initPopover();
   },
 
   /**
@@ -126,7 +128,6 @@ App.TimeIntervalSpinnerView = App.ConfigWidgetView.extend({
    */
   valueObserver: function() {
     if (!this.get('content')) return;
-    var self = this;
     Em.run.once(this, 'valueObserverCallback');
   }.observes('content.@each.value'),
 
@@ -138,6 +139,7 @@ App.TimeIntervalSpinnerView = App.ConfigWidgetView.extend({
 
   /**
    * Check for property modification.
+   * @method checkModified
    */
   checkModified: function() {
     this.set('valueIsChanged', this.configValueByWidget(this.get('content')) != parseInt(this.get('config.defaultValue')));

+ 18 - 4
ambari-web/app/views/common/configs/widgets/toggle_config_widget_view.js

@@ -19,12 +19,12 @@
 var App = require('app');
 
 /**
- * Toggle wiget view for config property.
+ * Toggle widget view for config property.
  * @type {Em.View}
  */
 App.ToggleConfigWidgetView = App.ConfigWidgetView.extend({
   templateName: require('templates/common/configs/widgets/toggle_config_widget'),
-  classNames: ['widget', 'toggle-widget'],
+  classNames: ['widget-config', 'toggle-widget'],
 
   /**
    * Saved switcher for current config.
@@ -68,8 +68,11 @@ App.ToggleConfigWidgetView = App.ConfigWidgetView.extend({
     // plugin should be initiated after applying binding for switcherValue
     Em.run.later('sync', function() {
       this.initSwitcher();
+      this.toggleWidgetState();
+      this.initPopover();
     }.bind(this), 10);
     this.addObserver('switcherValue', this.updateConfigValue);
+    this._super();
   },
 
   /**
@@ -80,7 +83,7 @@ App.ToggleConfigWidgetView = App.ConfigWidgetView.extend({
   initSwitcher: function () {
     var labels = this.get('config.stackConfigProperty.valueAttributes.entries'),
       self = this;
-    if (this.$("input")) {
+    if (this.$()) {
       var switcher = this.$("input").bootstrapSwitch({
         onText: labels[0].label,
         offText: labels[1].label,
@@ -105,6 +108,17 @@ App.ToggleConfigWidgetView = App.ConfigWidgetView.extend({
     var value = this.getNewSwitcherValue(this.get('config.value'));
     this.get('switcher').bootstrapSwitch('toggleState', value);
     this.set('switcherValue', value);
-  }
+  },
+
+  /**
+   * Enable/disable switcher basing on config isEditable value
+   * @method toggleWidgetState
+   */
+  toggleWidgetState: function () {
+    if (this.get('switcher')){
+      this.get('switcher').bootstrapSwitch('disabled', !this.get('config.isEditable'));
+    }
+    this._super();
+  }.observes('config.isEditable')
 
 });

+ 1 - 1
ambari-web/app/views/common/controls_view.js

@@ -679,7 +679,7 @@ App.ServiceConfigRadioButton = Ember.Checkbox.extend({
         components.forEach(function (_component) {
           if (_component.foreignKeys) {
             _component.foreignKeys.forEach(function (_componentName) {
-              if (this.get('parentView.parentView.serviceConfigs').someProperty('name', _componentName)) {
+              if (this.get('parentView.parentView.serviceConfigs') && this.get('parentView.parentView.serviceConfigs').someProperty('name', _componentName)) {
                 var component = this.get('parentView.parentView.serviceConfigs').findProperty('name', _componentName);
                 component.set('isVisible', _component.displayName === this.get('value'));
               }