You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sr...@apache.org on 2015/04/23 22:39:49 UTC
[1/2] ambari git commit: AMBARI-10702. Theme widgets should be merged
from inherited theme (mpapirkovskyy via srimanth)
Repository: ambari
Updated Branches:
refs/heads/trunk 8adb1b0bf -> d8bff0381
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes-mapred/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes-mapred/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes-mapred/theme.json
index 97d05dc..c96d656 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes-mapred/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes-mapred/theme.json
@@ -1,52 +1,50 @@
{
- "Theme": {
- "name": "default",
- "description": "Default theme for MAPREDUCE service",
- "configuration": {
- "layouts": [
- {
- "name": "default",
- "tabs": [
- {
- "name": "settings",
- "display-name": "Settings",
- "layout": {
- "tab-columns": "1",
- "tab-rows": "1",
- "sections": [
- {
- "name": "section-mr-scheduler",
- "display-name": "MR Scheduler Defaults",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "2",
- "section-columns": "2",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-mr-scheduler-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "subsection-mr-scheduler-col2",
- "row-index": "0",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- }
- ]
- }
+ "name": "default",
+ "description": "Default theme for MAPREDUCE service",
+ "configuration": {
+ "layouts": [
+ {
+ "name": "default",
+ "tabs": [
+ {
+ "name": "settings",
+ "display-name": "Settings",
+ "layout": {
+ "tab-columns": "1",
+ "tab-rows": "1",
+ "sections": [
+ {
+ "name": "section-mr-scheduler",
+ "display-name": "MR Scheduler Defaults",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "2",
+ "section-columns": "2",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-mr-scheduler-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "subsection-mr-scheduler-col2",
+ "row-index": "0",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ }
+ ]
}
- ]
- }
- ]
- },
+ }
+ ]
+ }
+ ],
"placement": {
"configuration-layout": "default",
"configs": [
@@ -68,47 +66,47 @@
}
]
},
- "widgets":[
+ "widgets": [
{
- "config":"mapred-site/mapreduce.map.memory.mb",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "mapred-site/mapreduce.map.memory.mb",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"GB"
+ "unit-name": "GB"
}
]
}
},
{
- "config":"mapred-site/mapreduce.reduce.memory.mb",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "mapred-site/mapreduce.reduce.memory.mb",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"GB"
+ "unit-name": "GB"
}
]
}
},
{
- "config":"mapred-site/yarn.app.mapreduce.am.resource.mb",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "mapred-site/yarn.app.mapreduce.am.resource.mb",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"GB"
+ "unit-name": "GB"
}
]
}
},
{
- "config":"mapred-site/mapreduce.task.io.sort.mb",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "mapred-site/mapreduce.task.io.sort.mb",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"MB"
+ "unit-name": "MB"
}
]
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes/theme.json
index ffe0996..5dbf19f 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/YARN/themes/theme.json
@@ -1,97 +1,95 @@
{
- "Theme": {
- "name": "default",
- "description": "Default theme for YARN service",
- "configuration": {
- "layouts": [
- {
- "name": "default",
- "tabs": [
- {
- "name": "settings",
- "display-name": "Settings",
- "layout": {
- "tab-columns": "3",
- "tab-rows": "2",
- "sections": [
- {
- "name": "section-nm-sizing",
- "display-name": "NodeManager Sizing",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "2",
- "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": "section-yarn-platform-features",
- "display-name": "YARN Platform Features",
- "row-index": "0",
- "column-index": "2",
- "row-span": "1",
- "column-span": "1",
- "section-columns": "1",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-yarn-platform-features-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- },
- {
- "name": "section-container-sizing",
- "display-name": "Container Sizing",
- "row-index": "1",
- "column-index": "0",
- "row-span": "1",
- "column-span": "2",
- "section-columns": "2",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-container-sizing-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "subsection-container-sizing-col2",
- "row-index": "0",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- }
- ]
- }
+ "name": "default",
+ "description": "Default theme for YARN service",
+ "configuration": {
+ "layouts": [
+ {
+ "name": "default",
+ "tabs": [
+ {
+ "name": "settings",
+ "display-name": "Settings",
+ "layout": {
+ "tab-columns": "3",
+ "tab-rows": "2",
+ "sections": [
+ {
+ "name": "section-nm-sizing",
+ "display-name": "NodeManager Sizing",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "2",
+ "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": "section-yarn-platform-features",
+ "display-name": "YARN Platform Features",
+ "row-index": "0",
+ "column-index": "2",
+ "row-span": "1",
+ "column-span": "1",
+ "section-columns": "1",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-yarn-platform-features-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ },
+ {
+ "name": "section-container-sizing",
+ "display-name": "Container Sizing",
+ "row-index": "1",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "2",
+ "section-columns": "2",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-container-sizing-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "subsection-container-sizing-col2",
+ "row-index": "0",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ }
+ ]
}
- ]
- }
- ]
- },
+ }
+ ]
+ }
+ ],
"placement": {
"configuration-layout": "default",
"configs": [
@@ -240,4 +238,4 @@
}
]
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/themes/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/themes/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/themes/theme.json
index c149daa..553c9a9 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/themes/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/themes/theme.json
@@ -1,150 +1,22 @@
{
- "Theme": {
- "name": "default",
- "description": "Default theme for YARN service",
+ "name": "default",
+ "description": "Default theme for YARN service",
+ "configuration": {
"placement": {
"configuration-layout": "default",
"configs": [
{
- "config": "yarn-site/yarn.nodemanager.resource.memory-mb",
- "subsection-name": "subsection-nm-sizing-col1"
- },
- {
- "config": "yarn-site/yarn.nodemanager.vmem-pmem-ratio",
- "subsection-name": "subsection-nm-sizing-col1"
- },
- {
- "config": "yarn-site/yarn.nodemanager.resource.percentage-physical-cpu-limit",
- "subsection-name": "subsection-nm-sizing-col2"
- },
- {
- "config": "yarn-site/yarn.nodemanager.resource.cpu-vcores",
- "subsection-name": "subsection-nm-sizing-col2"
- },
- {
- "config": "yarn-site/yarn.scheduler.minimum-allocation-mb",
- "subsection-name": "subsection-container-sizing-col1"
- },
- {
- "config": "yarn-site/yarn.scheduler.maximum-allocation-mb",
- "subsection-name": "subsection-container-sizing-col1"
- },
- {
- "config": "yarn-site/yarn.scheduler.minimum-allocation-vcores",
- "subsection-name": "subsection-container-sizing-col2"
- },
- {
- "config": "yarn-site/yarn.scheduler.maximum-allocation-vcores",
- "subsection-name": "subsection-container-sizing-col2"
- },
- {
"config": "yarn-site/yarn.node-labels.enabled",
"subsection-name": "subsection-yarn-platform-features-col1"
},
{
"config": "yarn-env/yarn_cgroups_enabled",
"subsection-name": "subsection-yarn-platform-features-col1"
- },
- {
- "config": "yarn-site/yarn.resourcemanager.work-preserving-recovery.enabled",
- "subsection-name": "subsection-yarn-platform-features-col1"
- },
- {
- "config": "yarn-site/yarn.log-aggregation-enable",
- "subsection-name": "subsection-yarn-platform-features-col1"
}
]
},
"widgets": [
{
- "config": "yarn-site/yarn.nodemanager.resource.memory-mb",
- "widget": {
- "type": "slider",
- "units": [
- {
- "unit-name": "MB"
- }
- ]
- }
- },
- {
- "config": "yarn-site/yarn.nodemanager.vmem-pmem-ratio",
- "widget": {
- "type": "slider",
- "units": [
- {
- "unit-name": "float"
- }
- ]
- }
- },
- {
- "config": "yarn-site/yarn.nodemanager.resource.percentage-physical-cpu-limit",
- "widget": {
- "type": "slider",
- "units": [
- {
- "unit-name": "percent"
- }
- ]
- }
- },
- {
- "config": "yarn-site/yarn.nodemanager.resource.cpu-vcores",
- "widget": {
- "type": "slider",
- "units": [
- {
- "unit-name": "int"
- }
- ]
- }
- },
- {
- "config": "yarn-site/yarn.scheduler.minimum-allocation-mb",
- "widget": {
- "type": "slider",
- "units": [
- {
- "unit-name": "MB"
- }
- ]
- }
- },
- {
- "config": "yarn-site/yarn.scheduler.maximum-allocation-mb",
- "widget": {
- "type": "slider",
- "units": [
- {
- "unit-name": "MB"
- }
- ]
- }
- },
- {
- "config": "yarn-site/yarn.scheduler.minimum-allocation-vcores",
- "widget": {
- "type": "slider",
- "units": [
- {
- "unit-name": "int"
- }
- ]
- }
- },
- {
- "config": "yarn-site/yarn.scheduler.maximum-allocation-vcores",
- "widget": {
- "type": "slider",
- "units": [
- {
- "unit-name": "int"
- }
- ]
- }
- },
- {
"config": "yarn-site/yarn.node-labels.enabled",
"widget": {
"type": "checkbox"
@@ -155,19 +27,7 @@
"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"
- }
}
]
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/test/java/org/apache/ambari/server/stack/ThemeModuleTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stack/ThemeModuleTest.java b/ambari-server/src/test/java/org/apache/ambari/server/stack/ThemeModuleTest.java
index 500ccb3..f4b4b93 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/stack/ThemeModuleTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/stack/ThemeModuleTest.java
@@ -18,70 +18,36 @@
package org.apache.ambari.server.stack;
-import org.apache.ambari.server.state.ThemeInfo;
-import org.apache.commons.lang.StringUtils;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
+import org.apache.ambari.server.state.theme.Theme;
import org.junit.Test;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.io.File;
import static org.junit.Assert.*;
public class ThemeModuleTest {
- private String parentTheme = "{\n" +
- " \"Theme\": {\n" +
- " \"name\": \"default\",\n" +
- " \"description\": \"Default theme for HDFS service\",\n" +
- " \"subObject\": {\n" +
- " \"primitiveInt\" : 10,\n" +
- " \"primitiveStr\" : \"str\",\n" +
- " \"array1\" : [1,2,3],\n" +
- " \"array2\" : [1,2,3]\n" +
- " }\n" +
- " }\n" +
- "}";
- private String childTheme = "{\n" +
- " \"Theme\": {\n" +
- " \"description\": \"inherited theme\",\n" +
- " \"subObject\": {\n" +
- " \"primitiveInt\" : 12,\n" +
- " \"primitiveStr\" : \"newStr\",\n" +
- " \"array1\" : [1,2,3,4,5],\n" +
- " \"array2\" : null,\n" +
- " \"subObject2\" : {\"1\":\"1\"}\n" +
- " }\n" +
- " }\n" +
- "}";
-
- private ObjectMapper mapper = new ObjectMapper();
- TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {};
@Test
public void testResolve() throws Exception {
+ File parentThemeFile = new File(this.getClass().getClassLoader().getResource("parent-theme.json").getFile());
+ File childThemeFile = new File(this.getClass().getClassLoader().getResource("child-theme.json").getFile());
- ThemeInfo parentInfo = new ThemeInfo();
- parentInfo.setThemeMap(mapper.<Map<String, Object>>readValue(parentTheme, typeRef));
- ThemeModule parentModule = new ThemeModule(parentInfo);
-
- ThemeInfo childInfo = new ThemeInfo();
- childInfo.setThemeMap(mapper.<Map<String, Object>>readValue(childTheme, typeRef));
- ThemeModule childModule = new ThemeModule(childInfo);
+ ThemeModule parentModule = new ThemeModule(parentThemeFile);
+ ThemeModule childModule = new ThemeModule(childThemeFile);
childModule.resolve(parentModule, null, null);
- Map descriptionMap = ((Map) childInfo.getThemeMap().get("Theme"));
- Map subObjectMap = (Map) descriptionMap.get("subObject");
+ Theme childTheme = childModule.getModuleInfo().getThemeMap().get(ThemeModule.THEME_KEY);
+ Theme parentTheme = parentModule.getModuleInfo().getThemeMap().get(ThemeModule.THEME_KEY);
+
+ assertNotNull(childTheme.getThemeConfiguration().getLayouts()); // not defined in child should be inherited
+
+ assertEquals(10, parentTheme.getThemeConfiguration().getPlacement().getConfigs().size());
+ assertEquals(12, childTheme.getThemeConfiguration().getPlacement().getConfigs().size()); //two more inherited
- assertTrue(StringUtils.equals((String) descriptionMap.get("description"), "inherited theme"));
- assertTrue(descriptionMap.containsKey("name"));
- assertFalse(subObjectMap.containsKey("array2"));
- assertEquals(subObjectMap.get("primitiveInt"), 12);
- assertEquals(subObjectMap.get("primitiveStr"), "newStr");
- assertEquals(((List)subObjectMap.get("array1")).size(), 5);
+ assertEquals(10, parentTheme.getThemeConfiguration().getWidgets().size());
+ assertEquals(12, childTheme.getThemeConfiguration().getWidgets().size());
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/test/resources/child-theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/child-theme.json b/ambari-server/src/test/resources/child-theme.json
new file mode 100644
index 0000000..553c9a9
--- /dev/null
+++ b/ambari-server/src/test/resources/child-theme.json
@@ -0,0 +1,33 @@
+{
+ "name": "default",
+ "description": "Default theme for YARN service",
+ "configuration": {
+ "placement": {
+ "configuration-layout": "default",
+ "configs": [
+ {
+ "config": "yarn-site/yarn.node-labels.enabled",
+ "subsection-name": "subsection-yarn-platform-features-col1"
+ },
+ {
+ "config": "yarn-env/yarn_cgroups_enabled",
+ "subsection-name": "subsection-yarn-platform-features-col1"
+ }
+ ]
+ },
+ "widgets": [
+ {
+ "config": "yarn-site/yarn.node-labels.enabled",
+ "widget": {
+ "type": "checkbox"
+ }
+ },
+ {
+ "config": "yarn-env/yarn_cgroups_enabled",
+ "widget": {
+ "type": "checkbox"
+ }
+ }
+ ]
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/test/resources/parent-theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/parent-theme.json b/ambari-server/src/test/resources/parent-theme.json
new file mode 100644
index 0000000..5dbf19f
--- /dev/null
+++ b/ambari-server/src/test/resources/parent-theme.json
@@ -0,0 +1,241 @@
+{
+ "name": "default",
+ "description": "Default theme for YARN service",
+ "configuration": {
+ "layouts": [
+ {
+ "name": "default",
+ "tabs": [
+ {
+ "name": "settings",
+ "display-name": "Settings",
+ "layout": {
+ "tab-columns": "3",
+ "tab-rows": "2",
+ "sections": [
+ {
+ "name": "section-nm-sizing",
+ "display-name": "NodeManager Sizing",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "2",
+ "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": "section-yarn-platform-features",
+ "display-name": "YARN Platform Features",
+ "row-index": "0",
+ "column-index": "2",
+ "row-span": "1",
+ "column-span": "1",
+ "section-columns": "1",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-yarn-platform-features-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ },
+ {
+ "name": "section-container-sizing",
+ "display-name": "Container Sizing",
+ "row-index": "1",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "2",
+ "section-columns": "2",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-container-sizing-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "subsection-container-sizing-col2",
+ "row-index": "0",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "placement": {
+ "configuration-layout": "default",
+ "configs": [
+ {
+ "config": "yarn-site/yarn.nodemanager.resource.memory-mb",
+ "subsection-name": "subsection-nm-sizing-col1"
+ },
+ {
+ "config": "yarn-site/yarn.nodemanager.vmem-pmem-ratio",
+ "subsection-name": "subsection-nm-sizing-col1"
+ },
+ {
+ "config": "yarn-site/yarn.nodemanager.resource.percentage-physical-cpu-limit",
+ "subsection-name": "subsection-nm-sizing-col2"
+ },
+ {
+ "config": "yarn-site/yarn.nodemanager.resource.cpu-vcores",
+ "subsection-name": "subsection-nm-sizing-col2"
+ },
+ {
+ "config": "yarn-site/yarn.scheduler.minimum-allocation-mb",
+ "subsection-name": "subsection-container-sizing-col1"
+ },
+ {
+ "config": "yarn-site/yarn.scheduler.maximum-allocation-mb",
+ "subsection-name": "subsection-container-sizing-col1"
+ },
+ {
+ "config": "yarn-site/yarn.scheduler.minimum-allocation-vcores",
+ "subsection-name": "subsection-container-sizing-col2"
+ },
+ {
+ "config": "yarn-site/yarn.scheduler.maximum-allocation-vcores",
+ "subsection-name": "subsection-container-sizing-col2"
+ },
+ {
+ "config": "yarn-site/yarn.resourcemanager.work-preserving-recovery.enabled",
+ "subsection-name": "subsection-yarn-platform-features-col1"
+ },
+ {
+ "config": "yarn-site/yarn.log-aggregation-enable",
+ "subsection-name": "subsection-yarn-platform-features-col1"
+ }
+ ]
+ },
+ "widgets": [
+ {
+ "config": "yarn-site/yarn.nodemanager.resource.memory-mb",
+ "widget": {
+ "type": "slider",
+ "units": [
+ {
+ "unit-name": "MB"
+ }
+ ]
+ }
+ },
+ {
+ "config": "yarn-site/yarn.nodemanager.vmem-pmem-ratio",
+ "widget": {
+ "type": "slider",
+ "units": [
+ {
+ "unit-name": "float"
+ }
+ ]
+ }
+ },
+ {
+ "config": "yarn-site/yarn.nodemanager.resource.percentage-physical-cpu-limit",
+ "widget": {
+ "type": "slider",
+ "units": [
+ {
+ "unit-name": "percent"
+ }
+ ]
+ }
+ },
+ {
+ "config": "yarn-site/yarn.nodemanager.resource.cpu-vcores",
+ "widget": {
+ "type": "slider",
+ "units": [
+ {
+ "unit-name": "int"
+ }
+ ]
+ }
+ },
+ {
+ "config": "yarn-site/yarn.scheduler.minimum-allocation-mb",
+ "widget": {
+ "type": "slider",
+ "units": [
+ {
+ "unit-name": "MB"
+ }
+ ]
+ }
+ },
+ {
+ "config": "yarn-site/yarn.scheduler.maximum-allocation-mb",
+ "widget": {
+ "type": "slider",
+ "units": [
+ {
+ "unit-name": "MB"
+ }
+ ]
+ }
+ },
+ {
+ "config": "yarn-site/yarn.scheduler.minimum-allocation-vcores",
+ "widget": {
+ "type": "slider",
+ "units": [
+ {
+ "unit-name": "int"
+ }
+ ]
+ }
+ },
+ {
+ "config": "yarn-site/yarn.scheduler.maximum-allocation-vcores",
+ "widget": {
+ "type": "slider",
+ "units": [
+ {
+ "unit-name": "int"
+ }
+ ]
+ }
+ },
+ {
+ "config": "yarn-site/yarn.log-aggregation-enable",
+ "widget": {
+ "type": "checkbox"
+ }
+ },
+ {
+ "config": "yarn-site/yarn.resourcemanager.work-preserving-recovery.enabled",
+ "widget": {
+ "type": "checkbox"
+ }
+ }
+ ]
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-web/app/mappers/configs/themes_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/configs/themes_mapper.js b/ambari-web/app/mappers/configs/themes_mapper.js
index 978d7e3..5f00730 100644
--- a/ambari-web/app/mappers/configs/themes_mapper.js
+++ b/ambari-web/app/mappers/configs/themes_mapper.js
@@ -123,7 +123,7 @@ App.themesMapper = App.QuickDataMapper.create({
* @param {Object} json - json to parse
*/
mapThemeConfigs: function(json) {
- Em.getWithDefault(json, "ThemeInfo.theme_data.Theme.placement.configs", []).forEach(function(configLink) {
+ Em.getWithDefault(json, "ThemeInfo.theme_data.Theme.configuration.placement.configs", []).forEach(function(configLink) {
var configId = this.getConfigId(configLink);
var subSectionId = configLink["subsection-name"];
var subSection = App.SubSection.find(subSectionId);
@@ -144,7 +144,7 @@ App.themesMapper = App.QuickDataMapper.create({
* @param {Object} json - json to parse
*/
mapThemeWidgets: function(json) {
- Em.getWithDefault(json, "ThemeInfo.theme_data.Theme.widgets", []).forEach(function(widget) {
+ Em.getWithDefault(json, "ThemeInfo.theme_data.Theme.configuration.widgets", []).forEach(function(widget) {
var configId = this.getConfigId(widget);
var configProperty = App.StackConfigProperty.find(configId);
[2/2] ambari git commit: AMBARI-10702. Theme widgets should be merged
from inherited theme (mpapirkovskyy via srimanth)
Posted by sr...@apache.org.
AMBARI-10702. Theme widgets should be merged from inherited theme (mpapirkovskyy via srimanth)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/d8bff038
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d8bff038
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d8bff038
Branch: refs/heads/trunk
Commit: d8bff0381cf307672652bb402292f91465783670
Parents: 8adb1b0
Author: Srimanth Gunturi <sg...@hortonworks.com>
Authored: Thu Apr 23 13:39:33 2015 -0700
Committer: Srimanth Gunturi <sg...@hortonworks.com>
Committed: Thu Apr 23 13:39:33 2015 -0700
----------------------------------------------------------------------
.../apache/ambari/server/stack/ThemeModule.java | 51 +-
.../apache/ambari/server/state/ThemeInfo.java | 8 +-
.../server/state/theme/ConfigPlacement.java | 58 +++
.../ambari/server/state/theme/Layout.java | 83 ++++
.../ambari/server/state/theme/Placement.java | 88 ++++
.../ambari/server/state/theme/Section.java | 183 ++++++++
.../ambari/server/state/theme/Subsection.java | 126 +++++
.../apache/ambari/server/state/theme/Tab.java | 74 +++
.../ambari/server/state/theme/TabLayout.java | 103 ++++
.../apache/ambari/server/state/theme/Theme.java | 79 ++++
.../server/state/theme/ThemeConfiguration.java | 134 ++++++
.../apache/ambari/server/state/theme/Unit.java | 40 ++
.../ambari/server/state/theme/Widget.java | 52 ++
.../ambari/server/state/theme/WidgetEntry.java | 51 ++
.../HDP/2.2/services/HBASE/themes/theme.json | 469 +++++++++----------
.../HDP/2.2/services/HDFS/themes/theme.json | 177 ++++---
.../HDP/2.2/services/HIVE/themes/theme.json | 391 ++++++++--------
.../2.2/services/YARN/themes-mapred/theme.json | 134 +++---
.../HDP/2.2/services/YARN/themes/theme.json | 184 ++++----
.../HDP/2.3/services/YARN/themes/theme.json | 148 +-----
.../ambari/server/stack/ThemeModuleTest.java | 64 +--
.../src/test/resources/child-theme.json | 33 ++
.../src/test/resources/parent-theme.json | 241 ++++++++++
ambari-web/app/mappers/configs/themes_mapper.js | 4 +-
24 files changed, 2057 insertions(+), 918 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java
index 5b22dd9..85ce252 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/ThemeModule.java
@@ -19,8 +19,8 @@ package org.apache.ambari.server.stack;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.state.ThemeInfo;
+import org.apache.ambari.server.state.theme.Theme;
import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,6 +39,8 @@ public class ThemeModule extends BaseModule<ThemeModule, ThemeInfo> implements V
private static final Logger LOG = LoggerFactory.getLogger(ThemeModule.class);
private static final ObjectMapper mapper = new ObjectMapper();
+ public static final String THEME_KEY = "Theme";
+
static {
}
@@ -62,9 +64,9 @@ public class ThemeModule extends BaseModule<ThemeModule, ThemeInfo> implements V
LOG.error("Theme file not found");
}
try {
- TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {
- };
- Map<String, Object> map = mapper.readValue(reader, typeRef);
+ Theme theme = mapper.readValue(reader, Theme.class);
+ Map<String, Theme> map = new HashMap<String, Theme>();
+ map.put(THEME_KEY, theme);
moduleInfo.setThemeMap(map);
LOG.debug("Loaded theme: {}", moduleInfo);
} catch (IOException e) {
@@ -83,44 +85,15 @@ public class ThemeModule extends BaseModule<ThemeModule, ThemeInfo> implements V
public void resolve(ThemeModule parent, Map<String, StackModule> allStacks, Map<String, ServiceModule> commonServices) throws AmbariException {
ThemeInfo parentModuleInfo = parent.getModuleInfo();
-
-
if (parent.getModuleInfo() != null && !moduleInfo.isDeleted()) {
- moduleInfo.setThemeMap(mergedMap(parent.getModuleInfo().getThemeMap(), moduleInfo.getThemeMap()));
- }
- }
-
- @SuppressWarnings("unchecked")
- private Map<String, Object> mergedMap(Map<String, Object> parent, Map<String, Object> child) {
- Map<String, Object> mergedMap = new HashMap<String, Object>();
- if (parent == null) {
- mergedMap = child;
- }else if (child == null) {
- mergedMap.putAll(parent);
- } else {
- mergedMap.putAll(parent);
- for (Map.Entry<String, Object> entry : child.entrySet()) {
- String key = entry.getKey();
- Object childValue = entry.getValue();
- if (childValue == null) {
- mergedMap.remove(key);
- }else if (!mergedMap.containsKey(key) || !(childValue instanceof Map)) {
- //insert if absent, override if explicitly null, override primitives and arrays
- mergedMap.put(key, childValue);
- }else {
- Object parentValue = mergedMap.get(key);
- if (!(parentValue instanceof Map)) {
- //override on type mismatch also
- mergedMap.put(key, childValue);
- } else {
- mergedMap.put(key, mergedMap((Map<String, Object>)parentValue, (Map<String, Object>)childValue));
- }
- }
+ if (moduleInfo.getThemeMap() == null || moduleInfo.getThemeMap().isEmpty()) {
+ moduleInfo.setThemeMap(parentModuleInfo.getThemeMap());
+ } else if(parentModuleInfo.getThemeMap() != null && !parentModuleInfo.getThemeMap().isEmpty()) {
+ Theme childTheme = moduleInfo.getThemeMap().get(THEME_KEY);
+ Theme parentTheme = parentModuleInfo.getThemeMap().get(THEME_KEY);
+ childTheme.mergeWithParent(parentTheme);
}
-
}
-
- return mergedMap;
}
@Override
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java
index 355fe25..855733a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ThemeInfo.java
@@ -17,6 +17,8 @@
*/
package org.apache.ambari.server.state;
+import org.apache.ambari.server.state.theme.Theme;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@@ -35,16 +37,16 @@ public class ThemeInfo {
private Boolean deleted = false;
@XmlTransient
- private Map<String, Object> themeMap = null;
+ private Map<String, Theme> themeMap = null;
public ThemeInfo() {
}
- public Map<String, Object> getThemeMap() {
+ public Map<String, Theme> getThemeMap() {
return themeMap;
}
- public void setThemeMap(Map<String, Object> themeMap) {
+ public void setThemeMap(Map<String, Theme> themeMap) {
this.themeMap = themeMap;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ConfigPlacement.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ConfigPlacement.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ConfigPlacement.java
new file mode 100644
index 0000000..c20cd8e
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ConfigPlacement.java
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ConfigPlacement {
+ @JsonProperty("config")
+ private String config;
+ @JsonProperty("subsection-name")
+ private String subsectionName;
+
+ public String getConfig() {
+ return config;
+ }
+
+ public void setConfig(String config) {
+ this.config = config;
+ }
+
+ public String getSubsectionName() {
+ return subsectionName;
+ }
+
+ public void setSubsectionName(String subsectionName) {
+ this.subsectionName = subsectionName;
+ }
+
+ public boolean isRemoved() {
+ return subsectionName == null;
+ }
+
+ public void mergeWithParent(ConfigPlacement parent) {
+ if (subsectionName == null) {
+ subsectionName = parent.subsectionName;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Layout.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Layout.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Layout.java
new file mode 100644
index 0000000..66d1910
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Layout.java
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Layout{
+ @JsonProperty("name")
+ private String name;
+ @JsonProperty("tabs")
+ private List<Tab> tabs;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List<Tab> getTabs() {
+ return tabs;
+ }
+
+ public void setTabs(List<Tab> tabs) {
+ this.tabs = tabs;
+ }
+
+
+ public void mergeWithParent(Layout parentLayout) {
+ //merge Tabs only due to theme structure
+ tabs = mergeTabs(parentLayout.tabs, tabs);
+ }
+
+ private List<Tab> mergeTabs(List<Tab> parentTabs, List<Tab> childTabs) {
+ Map<String, Tab> mergedTabs = new HashMap<String, Tab>();
+ for (Tab parentTab : parentTabs) {
+ mergedTabs.put(parentTab.getName(), parentTab);
+ }
+
+ for (Tab childTab : childTabs) {
+ if (childTab.getName() != null) {
+ if (childTab.getDisplayName() == null && childTab.getTabLayout() == null) {
+ mergedTabs.remove(childTab.getName());
+ } else {
+ Tab parentTab = mergedTabs.get(childTab.getName());
+ childTab.mergeWithParent(parentTab);
+ mergedTabs.put(childTab.getName(), childTab);
+ }
+ }
+ }
+ return new ArrayList<Tab>(mergedTabs.values());
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Placement.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Placement.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Placement.java
new file mode 100644
index 0000000..e3708d8
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Placement.java
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Placement{
+ @JsonProperty("configs")
+ private List<ConfigPlacement> configs;
+ @JsonProperty("configuration-layout")
+ private String configurationLayout;
+
+ public List<ConfigPlacement> getConfigs() {
+ return configs;
+ }
+
+ public void setConfigs(List<ConfigPlacement> configs) {
+ this.configs = configs;
+ }
+
+ public String getConfigurationLayout() {
+ return configurationLayout;
+ }
+
+ public void setConfigurationLayout(String configurationLayout) {
+ this.configurationLayout = configurationLayout;
+ }
+
+ public void mergeWithParent(Placement parent) {
+ if (configurationLayout == null) {
+ configurationLayout = parent.configurationLayout;
+ }
+
+ if (configs == null) {
+ configs = parent.configs;
+ }else if (parent.configs != null) {
+ configs = mergeConfigs(parent.configs, configs);
+ }
+
+ }
+
+ private List<ConfigPlacement> mergeConfigs(List<ConfigPlacement> parentConfigs, List<ConfigPlacement> childConfigs) {
+ Map<String, ConfigPlacement> mergedConfigPlacements = new HashMap<String, ConfigPlacement>();
+ for (ConfigPlacement parentConfigPlacement : parentConfigs) {
+ mergedConfigPlacements.put(parentConfigPlacement.getConfig(), parentConfigPlacement);
+ }
+
+ for (ConfigPlacement childConfigPlacement : childConfigs) {
+ if (childConfigPlacement.getConfig() != null) {
+ if (childConfigPlacement.isRemoved()) {
+ mergedConfigPlacements.remove(childConfigPlacement.getConfig());
+ } else {
+ ConfigPlacement parentConfigPlacement = mergedConfigPlacements.get(childConfigPlacement.getConfig());
+ childConfigPlacement.mergeWithParent(parentConfigPlacement);
+ mergedConfigPlacements.put(childConfigPlacement.getConfig(), childConfigPlacement);
+ }
+ }
+ }
+ return new ArrayList<ConfigPlacement>(mergedConfigPlacements.values());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Section.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Section.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Section.java
new file mode 100644
index 0000000..87b954a
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Section.java
@@ -0,0 +1,183 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Section {
+ @JsonProperty("subsections")
+ private List<Subsection> subsections;
+ @JsonProperty("display-name")
+ private String displayName;
+ @JsonProperty("row-index")
+ private String rowIndex;
+ @JsonProperty("section-rows")
+ private String sectionRows;
+ @JsonProperty("name")
+ private String name;
+ @JsonProperty("column-span")
+ private String columnSpan;
+ @JsonProperty("section-columns")
+ private String sectionColumns;
+ @JsonProperty("column-index")
+ private String columnIndex;
+ @JsonProperty("row-span")
+ private String rowSpan;
+
+ public List<Subsection> getSubsections() {
+ return subsections;
+ }
+
+ public void setSubsections(List<Subsection> subsections) {
+ this.subsections = subsections;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getRowIndex() {
+ return rowIndex;
+ }
+
+ public void setRowIndex(String rowIndex) {
+ this.rowIndex = rowIndex;
+ }
+
+ public String getSectionRows() {
+ return sectionRows;
+ }
+
+ public void setSectionRows(String sectionRows) {
+ this.sectionRows = sectionRows;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getColumnSpan() {
+ return columnSpan;
+ }
+
+ public void setColumnSpan(String columnSpan) {
+ this.columnSpan = columnSpan;
+ }
+
+ public String getSectionColumns() {
+ return sectionColumns;
+ }
+
+ public void setSectionColumns(String sectionColumns) {
+ this.sectionColumns = sectionColumns;
+ }
+
+ public String getColumnIndex() {
+ return columnIndex;
+ }
+
+ public void setColumnIndex(String columnIndex) {
+ this.columnIndex = columnIndex;
+ }
+
+ public String getRowSpan() {
+ return rowSpan;
+ }
+
+ public void setRowSpan(String rowSpan) {
+ this.rowSpan = rowSpan;
+ }
+
+ public boolean isRemoved() {
+ return columnIndex == null && columnSpan == null &&
+ subsections == null && displayName == null &&
+ rowIndex == null && rowSpan == null &&
+ sectionRows == null && sectionColumns == null;
+ }
+
+ public void mergeWithParent(Section parentSection) {
+ if (displayName == null) {
+ displayName = parentSection.displayName;
+ }
+ if (rowIndex == null) {
+ rowIndex = parentSection.rowIndex;
+ }
+ if (rowSpan == null) {
+ rowSpan = parentSection.rowSpan;
+ }
+ if (sectionRows == null) {
+ sectionRows = parentSection.sectionRows;
+ }
+ if (columnIndex == null) {
+ columnIndex = parentSection.columnIndex;
+ }
+ if (columnSpan == null) {
+ columnSpan = parentSection.columnSpan;
+ }
+ if (sectionColumns == null) {
+ sectionColumns = parentSection.sectionColumns;
+ }
+ if (subsections == null) {
+ subsections = parentSection.subsections;
+ }else if (parentSection.subsections != null) {
+ subsections = mergeSubsections(parentSection.subsections, subsections);
+ }
+ }
+
+ private List<Subsection> mergeSubsections(List<Subsection> parentSubsections, List<Subsection> childSubsections) {
+
+ Map<String, Subsection> mergedSubsections = new HashMap<String, Subsection>();
+ for (Subsection parentSubsection : parentSubsections) {
+ mergedSubsections.put(parentSubsection.getName(), parentSubsection);
+ }
+
+ for (Subsection childSubsection : childSubsections) {
+ if (childSubsection.getName() != null) {
+ if (childSubsection.isRemoved()) {
+ mergedSubsections.remove(childSubsection.getName());
+ } else {
+ Subsection parentSection = mergedSubsections.get(childSubsection.getName());
+ childSubsection.mergeWithParent(parentSection);
+ mergedSubsections.put(childSubsection.getName(), childSubsection);
+ }
+ }
+ }
+ return new ArrayList<Subsection>(mergedSubsections.values());
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Subsection.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Subsection.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Subsection.java
new file mode 100644
index 0000000..b86b51f
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Subsection.java
@@ -0,0 +1,126 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Subsection {
+ @JsonProperty("row-index")
+ private String rowIndex;
+ @JsonProperty("name")
+ private String name;
+ @JsonProperty("display-name")
+ private String displayName;
+ @JsonProperty("column-span")
+ private String columnSpan;
+ @JsonProperty("row-span")
+ private String rowSpan;
+ @JsonProperty("column-index")
+ private String columnIndex;
+ @JsonProperty("border")
+ private String border;
+
+
+ public String getRowIndex() {
+ return rowIndex;
+ }
+
+ public void setRowIndex(String rowIndex) {
+ this.rowIndex = rowIndex;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getColumnSpan() {
+ return columnSpan;
+ }
+
+ public void setColumnSpan(String columnSpan) {
+ this.columnSpan = columnSpan;
+ }
+
+ public String getRowSpan() {
+ return rowSpan;
+ }
+
+ public void setRowSpan(String rowSpan) {
+ this.rowSpan = rowSpan;
+ }
+
+ public String getColumnIndex() {
+ return columnIndex;
+ }
+
+ public void setColumnIndex(String columnIndex) {
+ this.columnIndex = columnIndex;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getBorder() {
+ return border;
+ }
+
+ public void setBorder(String border) {
+ this.border = border;
+ }
+
+ public boolean isRemoved() {
+ return rowIndex == null && rowSpan == null && columnIndex == null && columnSpan == null;
+ }
+
+ public void mergeWithParent(Subsection parent) {
+ if (rowSpan == null) {
+ rowSpan = parent.rowSpan;
+ }
+ if (rowIndex == null) {
+ rowIndex = parent.rowIndex;
+ }
+ if (columnSpan == null) {
+ columnSpan = parent.columnSpan;
+ }
+ if (columnIndex == null) {
+ columnIndex = parent.columnIndex;
+ }
+ if (displayName == null) {
+ displayName = parent.displayName;
+ }
+ if (border == null) {
+ border = parent.border;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Tab.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Tab.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Tab.java
new file mode 100644
index 0000000..b949a12
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Tab.java
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Tab {
+ @JsonProperty("display-name")
+ private String displayName;
+ @JsonProperty("name")
+ private String name;
+ @JsonProperty("layout")
+ private TabLayout tabLayout;
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public TabLayout getTabLayout() {
+ return tabLayout;
+ }
+
+ public void setTabLayout(TabLayout tabLayout) {
+ this.tabLayout = tabLayout;
+ }
+
+ public void mergeWithParent(Tab parentTab) {
+ // null name is not expected due to theme structure
+
+ if (displayName == null) {
+ displayName = parentTab.displayName;
+ }
+ if (tabLayout == null) {
+ tabLayout = parentTab.tabLayout;
+ } else {
+ tabLayout.mergeWithParent(parentTab.tabLayout);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/TabLayout.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/TabLayout.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/TabLayout.java
new file mode 100644
index 0000000..d92c04d
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/TabLayout.java
@@ -0,0 +1,103 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TabLayout {
+ @JsonProperty("tab-rows")
+ private String tabRows;
+ @JsonProperty("sections")
+ private List<Section> sections;
+ @JsonProperty("tab-columns")
+ private String tabColumns;
+
+ public String getTabRows() {
+ return tabRows;
+ }
+
+ public void setTabRows(String tabRows) {
+ this.tabRows = tabRows;
+ }
+
+ public List<Section> getSections() {
+ return sections;
+ }
+
+ public void setSections(List<Section> sections) {
+ this.sections = sections;
+ }
+
+ public String getTabColumns() {
+ return tabColumns;
+ }
+
+ public void setTabColumns(String tabColumns) {
+ this.tabColumns = tabColumns;
+ }
+
+ public void mergeWithParent(TabLayout parent) {
+ if (tabColumns == null) {
+ tabColumns = parent.tabColumns;
+ }
+
+ if (tabRows == null) {
+ tabRows = parent.tabRows;
+ }
+
+ if (sections == null) {
+ sections = parent.sections;
+ }else if (parent.sections != null) {
+ sections = mergedSections(parent.sections, sections);
+ }
+ }
+
+ private List<Section> mergedSections(List<Section> parentSections, List<Section> childSections) {
+ Map<String, Section> mergedSections = new HashMap<String, Section>();
+ for (Section parentSection : parentSections) {
+ mergedSections.put(parentSection.getName(), parentSection);
+ }
+
+ for (Section childSection : childSections) {
+ if (childSection.getName() != null) {
+ if (childSection.isRemoved()) {
+ mergedSections.remove(childSection.getName());
+ } else {
+ Section parentSection = mergedSections.get(childSection.getName());
+ childSection.mergeWithParent(parentSection);
+ mergedSections.put(childSection.getName(), childSection);
+ }
+ }
+ }
+ return new ArrayList<Section>(mergedSections.values());
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Theme.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Theme.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Theme.java
new file mode 100644
index 0000000..96d2fc0
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Theme.java
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Theme{
+ @JsonProperty("description")
+ private String description;
+ @JsonProperty("name")
+ private String name;
+ @JsonProperty("configuration")
+ private ThemeConfiguration themeConfiguration;
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public ThemeConfiguration getThemeConfiguration() {
+ return themeConfiguration;
+ }
+
+ public void setThemeConfiguration(ThemeConfiguration themeConfiguration) {
+ this.themeConfiguration = themeConfiguration;
+ }
+
+ public void mergeWithParent(Theme parent) {
+ if (parent == null) {
+ return;
+ }
+
+ if (name == null) {
+ name = parent.name;
+ }
+
+ if (description == null) {
+ description = parent.description;
+ }
+
+ if (themeConfiguration == null) {
+ themeConfiguration = parent.themeConfiguration;
+ } else {
+ themeConfiguration.mergeWithParent(parent.themeConfiguration);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ThemeConfiguration.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ThemeConfiguration.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ThemeConfiguration.java
new file mode 100644
index 0000000..a0d8907
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/ThemeConfiguration.java
@@ -0,0 +1,134 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ThemeConfiguration{
+ @JsonProperty("placement")
+ private Placement placement;
+ @JsonProperty("widgets")
+ private List<WidgetEntry> widgets;
+ @JsonProperty("layouts")
+ private List<Layout> layouts;
+
+ public Placement getPlacement() {
+ return placement;
+ }
+
+ public void setPlacement(Placement placement) {
+ this.placement = placement;
+ }
+
+ public List<WidgetEntry> getWidgets() {
+ return widgets;
+ }
+
+ public void setWidgets(List<WidgetEntry> widgets) {
+ this.widgets = widgets;
+ }
+
+ public List<Layout> getLayouts() {
+ return layouts;
+ }
+
+ public void setLayouts(List<Layout> layouts) {
+ this.layouts = layouts;
+ }
+
+ public void mergeWithParent(ThemeConfiguration parent) {
+ if (parent == null) {
+ return;
+ }
+
+ if (placement == null) {
+ placement = parent.placement;
+ } else {
+ placement.mergeWithParent(parent.placement);
+ }
+
+ if (widgets == null) {
+ widgets = parent.widgets;
+ } else if (parent.widgets != null) {
+ widgets = mergeWidgets(parent.widgets, widgets);
+ }
+
+ if (layouts == null) {
+ layouts = parent.layouts;
+ } else if (parent.layouts != null) {
+ layouts = mergeLayouts(parent.layouts, layouts);
+ }
+
+
+ }
+
+ private List<Layout> mergeLayouts(List<Layout> parentLayouts, List<Layout> childLayouts) {
+ Map<String, Layout> mergedLayouts = new HashMap<String, Layout>();
+
+ for (Layout parentLayout : parentLayouts) {
+ mergedLayouts.put(parentLayout.getName(), parentLayout);
+ }
+
+ for (Layout childLayout : childLayouts) {
+ if (childLayout.getName() != null) { //skip invalid entries
+ if (childLayout.getTabs() == null) {
+ mergedLayouts.remove(childLayout.getName());
+ } else {
+ Layout parentLayout = mergedLayouts.get(childLayout.getName());
+ childLayout.mergeWithParent(parentLayout);
+ mergedLayouts.put(childLayout.getName(), childLayout);
+ }
+ }
+ }
+
+ return new ArrayList<Layout>(mergedLayouts.values());
+
+ }
+
+ private List<WidgetEntry> mergeWidgets(List<WidgetEntry> parentWidgets, List<WidgetEntry> childWidgets) {
+ Map<String, WidgetEntry> mergedWidgets = new HashMap<String, WidgetEntry>();
+ for (WidgetEntry widgetEntry : parentWidgets) {
+ mergedWidgets.put(widgetEntry.getConfig(), widgetEntry);
+ }
+
+ for (WidgetEntry widgetEntry : childWidgets) {
+ if (widgetEntry.getConfig() != null) { //skip invalid entries
+ if (widgetEntry.getWidget() == null) {
+ mergedWidgets.remove(widgetEntry.getConfig());
+ } else {
+ mergedWidgets.put(widgetEntry.getConfig(), widgetEntry);
+ }
+ }
+
+ }
+
+ return new ArrayList<WidgetEntry>(mergedWidgets.values());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Unit.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Unit.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Unit.java
new file mode 100644
index 0000000..7bd058c
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Unit.java
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Unit {
+ @JsonProperty("unit-name")
+ private String unitName;
+
+ public String getUnitName() {
+ return unitName;
+ }
+
+ public void setUnitName(String unitName) {
+ this.unitName = unitName;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Widget.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Widget.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Widget.java
new file mode 100644
index 0000000..7b1e09c
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/Widget.java
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.List;
+
+
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Widget{
+ @JsonProperty("type")
+ private String type;
+ @JsonProperty("units")
+ private List<Unit> units;
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public List<Unit> getUnits() {
+ return units;
+ }
+
+ public void setUnits(List<Unit> units) {
+ this.units = units;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/java/org/apache/ambari/server/state/theme/WidgetEntry.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/theme/WidgetEntry.java b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/WidgetEntry.java
new file mode 100644
index 0000000..9e9c068
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/theme/WidgetEntry.java
@@ -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.
+ */
+
+package org.apache.ambari.server.state.theme;
+
+
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class WidgetEntry {
+ @JsonProperty("config")
+ private String config;
+ @JsonProperty("widget")
+ private Widget widget;
+
+ public String getConfig() {
+ return config;
+ }
+
+ public void setConfig(String config) {
+ this.config = config;
+ }
+
+ public Widget getWidget() {
+ return widget;
+ }
+
+ public void setWidget(Widget widget) {
+ this.widget = widget;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json
index d5917c0..f62300d 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/themes/theme.json
@@ -1,161 +1,159 @@
{
- "Theme": {
- "name": "default",
- "description": "Default theme for HBASE service",
- "configuration": {
- "layouts": [
- {
- "name": "default",
- "tabs": [
- {
- "name": "settings",
- "display-name": "Settings",
- "layout": {
- "tab-columns": "3",
- "tab-rows": "3",
- "sections": [
- {
- "name": "section-hbase-memory",
- "display-name": "Server",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "2",
- "section-columns": "2",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-hbase-memory-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "subsection-hbase-memory-col2",
- "row-index": "0",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- },
- {
- "name": "section-hbase-client",
- "display-name": "Client",
- "row-index": "0",
- "column-index": "2",
- "row-span": "1",
- "column-span": "1",
- "section-columns": "1",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-hbase-client-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- },
- {
- "name": "section-hbase-disk",
- "display-name": "Disk",
- "row-index": "1",
- "column-index": "0",
- "row-span": "1",
- "column-span": "3",
- "section-columns": "3",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-hbase-disk-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "subsection-hbase-disk-col2",
- "row-index": "0",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "subsection-hbase-disk-col3",
- "row-index": "0",
- "column-index": "2",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- },
- {
- "name": "section-hbase-timeouts",
- "display-name": "Timeouts",
- "row-index": "2",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1",
- "section-columns": "1",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-hbase-timeouts-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- },
- {
- "name": "section-hbase-security",
- "display-name": "Security",
- "row-index": "2",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1",
- "section-columns": "1",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-hbase-security-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- },
- {
- "name": "section-hbase-phoenix",
- "display-name": "Phoenix SQL",
- "row-index": "2",
- "column-index": "2",
- "row-span": "1",
- "column-span": "1",
- "section-columns": "1",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-hbase-phoenix-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- }
- ]
- }
+ "name": "default",
+ "description": "Default theme for HBASE service",
+ "configuration": {
+ "layouts": [
+ {
+ "name": "default",
+ "tabs": [
+ {
+ "name": "settings",
+ "display-name": "Settings",
+ "layout": {
+ "tab-columns": "3",
+ "tab-rows": "3",
+ "sections": [
+ {
+ "name": "section-hbase-memory",
+ "display-name": "Server",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "2",
+ "section-columns": "2",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-hbase-memory-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "subsection-hbase-memory-col2",
+ "row-index": "0",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ },
+ {
+ "name": "section-hbase-client",
+ "display-name": "Client",
+ "row-index": "0",
+ "column-index": "2",
+ "row-span": "1",
+ "column-span": "1",
+ "section-columns": "1",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-hbase-client-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ },
+ {
+ "name": "section-hbase-disk",
+ "display-name": "Disk",
+ "row-index": "1",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "3",
+ "section-columns": "3",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-hbase-disk-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "subsection-hbase-disk-col2",
+ "row-index": "0",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "subsection-hbase-disk-col3",
+ "row-index": "0",
+ "column-index": "2",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ },
+ {
+ "name": "section-hbase-timeouts",
+ "display-name": "Timeouts",
+ "row-index": "2",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1",
+ "section-columns": "1",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-hbase-timeouts-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ },
+ {
+ "name": "section-hbase-security",
+ "display-name": "Security",
+ "row-index": "2",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1",
+ "section-columns": "1",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-hbase-security-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ },
+ {
+ "name": "section-hbase-phoenix",
+ "display-name": "Phoenix SQL",
+ "row-index": "2",
+ "column-index": "2",
+ "row-span": "1",
+ "column-span": "1",
+ "section-columns": "1",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-hbase-phoenix-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ }
+ ]
}
- ]
- }
- ]
- },
+ }
+ ]
+ }
+ ],
"placement": {
"configuration-layout": "default",
"configs": [
@@ -233,173 +231,173 @@
}
]
},
- "widgets":[
+ "widgets": [
{
- "config":"hbase-env/hbase_master_heapsize",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-env/hbase_master_heapsize",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"GB"
+ "unit-name": "GB"
}
]
}
},
{
- "config":"hbase-env/hbase_regionserver_heapsize",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-env/hbase_regionserver_heapsize",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"GB"
+ "unit-name": "GB"
}
]
}
},
{
- "config":"hbase-site/hfile.block.cache.size",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-site/hfile.block.cache.size",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"percent"
+ "unit-name": "percent"
}
]
}
},
{
- "config":"hbase-site/hbase.regionserver.global.memstore.upperLimit",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-site/hbase.regionserver.global.memstore.upperLimit",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"percent"
+ "unit-name": "percent"
}
]
}
},
{
- "config":"hbase-site/hbase.hregion.memstore.flush.size",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-site/hbase.hregion.memstore.flush.size",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"MB"
+ "unit-name": "MB"
}
]
}
},
{
- "config":"hbase-site/hbase.hregion.memstore.block.multiplier",
- "widget":{
- "type":"combo"
+ "config": "hbase-site/hbase.hregion.memstore.block.multiplier",
+ "widget": {
+ "type": "combo"
}
},
{
- "config":"hbase-site/hbase.regionserver.handler.count",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-site/hbase.regionserver.handler.count",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"int"
+ "unit-name": "int"
}
]
}
},
{
- "config":"hbase-site/hbase.client.retries.number",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-site/hbase.client.retries.number",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"int"
+ "unit-name": "int"
}
]
}
},
{
- "config":"hbase-site/hbase.client.keyvalue.maxsize",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-site/hbase.client.keyvalue.maxsize",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"MB"
+ "unit-name": "MB"
}
]
}
},
{
- "config":"hbase-site/hbase.hregion.max.filesize",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hbase-site/hbase.hregion.max.filesize",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"GB"
+ "unit-name": "GB"
}
]
}
},
{
- "config":"hbase-site/hbase.hregion.majorcompaction",
- "widget":{
- "type":"time-interval-spinner",
- "units":[
+ "config": "hbase-site/hbase.hregion.majorcompaction",
+ "widget": {
+ "type": "time-interval-spinner",
+ "units": [
{
- "unit-name":"days,hours"
+ "unit-name": "days,hours"
}
]
}
},
{
- "config":"hbase-site/hbase.hstore.compactionThreshold",
- "widget":{
- "type":"combo"
+ "config": "hbase-site/hbase.hstore.compactionThreshold",
+ "widget": {
+ "type": "combo"
}
},
{
- "config":"hbase-site/zookeeper.session.timeout",
- "widget":{
- "type":"time-interval-spinner",
- "units":[
+ "config": "hbase-site/zookeeper.session.timeout",
+ "widget": {
+ "type": "time-interval-spinner",
+ "units": [
{
- "unit-name":"minutes,seconds"
+ "unit-name": "minutes,seconds"
}
]
}
},
{
- "config":"hbase-site/hbase.rpc.timeout",
- "widget":{
- "type":"time-interval-spinner",
- "units":[
+ "config": "hbase-site/hbase.rpc.timeout",
+ "widget": {
+ "type": "time-interval-spinner",
+ "units": [
{
- "unit-name":"minutes,seconds"
+ "unit-name": "minutes,seconds"
}
]
}
},
{
- "config":"hbase-site/hbase.security.authentication",
- "widget":{
- "type":"toggle"
+ "config": "hbase-site/hbase.security.authentication",
+ "widget": {
+ "type": "toggle"
}
},
{
- "config":"hbase-site/hbase.security.authorization",
- "widget":{
- "type":"checkbox"
+ "config": "hbase-site/hbase.security.authorization",
+ "widget": {
+ "type": "checkbox"
}
},
{
- "config":"hbase-env/phoenix_sql_enabled",
- "widget":{
- "type":"checkbox"
+ "config": "hbase-env/phoenix_sql_enabled",
+ "widget": {
+ "type": "checkbox"
}
},
{
- "config":"hbase-site/phoenix.query.timeoutMs",
- "widget":{
- "type":"time-interval-spinner",
+ "config": "hbase-site/phoenix.query.timeoutMs",
+ "widget": {
+ "type": "time-interval-spinner",
"units": [
{
"unit-name": "minutes,seconds"
@@ -410,3 +408,4 @@
]
}
}
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json
index bcffd0f..84e61d1 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/themes/theme.json
@@ -1,64 +1,62 @@
{
- "Theme": {
- "name": "default",
- "description": "Default theme for HDFS service",
- "configuration": {
- "layouts": [
- {
- "name": "default",
- "tabs": [
- {
- "name": "settings",
- "display-name": "Settings",
- "layout": {
- "tab-columns": "2",
- "tab-rows": "1",
- "sections": [
- {
- "name": "section-namenode",
- "display-name": "NameNode",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1",
- "section-columns": "1",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-namenode-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- },
- {
- "name": "section-datanode",
- "display-name": "DataNode",
- "row-index": "0",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1",
- "section-columns": "1",
- "section-rows": "1",
- "subsections": [
- {
- "name": "subsection-datanode-col1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- }
- ]
- }
- ]
- }
+ "name": "default",
+ "description": "Default theme for HDFS service",
+ "configuration": {
+ "layouts": [
+ {
+ "name": "default",
+ "tabs": [
+ {
+ "name": "settings",
+ "display-name": "Settings",
+ "layout": {
+ "tab-columns": "2",
+ "tab-rows": "1",
+ "sections": [
+ {
+ "name": "section-namenode",
+ "display-name": "NameNode",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1",
+ "section-columns": "1",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-namenode-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ },
+ {
+ "name": "section-datanode",
+ "display-name": "DataNode",
+ "row-index": "0",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1",
+ "section-columns": "1",
+ "section-rows": "1",
+ "subsections": [
+ {
+ "name": "subsection-datanode-col1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ }
+ ]
+ }
+ ]
}
- ]
- }
- ]
- },
+ }
+ ]
+ }
+ ],
"placement": {
"configuration-layout": "default",
"configs": [
@@ -96,76 +94,76 @@
}
]
},
- "widgets":[
+ "widgets": [
{
- "config":"hdfs-site/dfs.namenode.name.dir",
- "widget":{
- "type":"directories"
+ "config": "hdfs-site/dfs.namenode.name.dir",
+ "widget": {
+ "type": "directories"
}
},
{
- "config":"hdfs-site/dfs.namenode.safemode.threshold-pct",
- "widget":{
- "type":"toggle"
+ "config": "hdfs-site/dfs.namenode.safemode.threshold-pct",
+ "widget": {
+ "type": "toggle"
}
},
{
- "config":"hdfs-site/dfs.namenode.handler.count",
- "widget":{
- "type":"slider",
- "units":[
+ "config": "hdfs-site/dfs.namenode.handler.count",
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"int"
+ "unit-name": "int"
}
]
}
},
{
"config": "hadoop-env/namenode_heapsize",
- "widget":{
- "type":"slider",
- "units":[
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"GB"
+ "unit-name": "GB"
}
]
}
},
{
"config": "hdfs-site/dfs.datanode.failed.volumes.tolerated",
- "widget":{
- "type":"slider",
- "units":[
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"int"
+ "unit-name": "int"
}
]
}
},
{
"config": "hdfs-site/dfs.datanode.data.dir",
- "widget":{
- "type":"directories"
+ "widget": {
+ "type": "directories"
}
},
{
"config": "hadoop-env/dtnode_heapsize",
- "widget":{
- "type":"slider",
- "units":[
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"GB"
+ "unit-name": "GB"
}
]
}
},
{
"config": "hdfs-site/dfs.datanode.max.transfer.threads",
- "widget":{
- "type":"slider",
- "units":[
+ "widget": {
+ "type": "slider",
+ "units": [
{
- "unit-name":"int"
+ "unit-name": "int"
}
]
}
@@ -173,3 +171,4 @@
]
}
}
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/d8bff038/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
index 375fa20..d840d18 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/themes/theme.json
@@ -1,201 +1,199 @@
{
- "Theme": {
- "name": "default",
- "description": "Default theme for HIVE service",
- "configuration": {
- "layouts": [
- {
- "name": "default",
- "tabs": [
- {
- "name": "settings",
- "display-name": "Settings",
- "layout": {
- "tab-rows": 6,
- "tab-columns": 3,
- "sections": [
- {
- "name": "optimization",
- "display-name": "Optimization",
- "row-index": "0",
- "column-index": "0",
- "row-span": "3",
- "column-span": "2",
- "section-columns": "2",
- "section-rows": "4",
- "subsections": [
- {
- "name": "optimization-row1-col1",
- "display-name": "Storage",
- "row-index": "0",
- "column-index": "0",
- "row-span": "2",
- "column-span": "1"
- },
- {
- "name": "optimization-row1-col2-1",
- "display-name": "",
- "row-index": "0",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "optimization-row1-col2-2",
- "display-name": "",
- "row-index": "1",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1",
- "border": true
- },
- {
- "name": "optimization-row2-col1",
- "display-name": "Optimization Vectorization",
- "row-index": "2",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "optimization-row2-col2",
- "display-name": "",
- "row-index": "2",
- "column-index": "1",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "optimization-row3-col1",
- "display-name": "Memory",
- "row-index": "3",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "optimization-row3-col2",
- "display-name": "",
- "row-index": "3",
- "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-1",
- "row-index": "0",
- "column-index": "0",
- "row-span": "1",
- "column-span": "1"
- },
- {
- "name": "acid-transactions-row1-col1-2",
- "row-index": "1",
- "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": "2",
- "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": "2",
- "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": "2",
- "column-span": "1"
- }
- ]
- }
- ]
- }
+ "name": "default",
+ "description": "Default theme for HIVE service",
+ "configuration": {
+ "layouts": [
+ {
+ "name": "default",
+ "tabs": [
+ {
+ "name": "settings",
+ "display-name": "Settings",
+ "layout": {
+ "tab-rows": 6,
+ "tab-columns": 3,
+ "sections": [
+ {
+ "name": "optimization",
+ "display-name": "Optimization",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "3",
+ "column-span": "2",
+ "section-columns": "2",
+ "section-rows": "4",
+ "subsections": [
+ {
+ "name": "optimization-row1-col1",
+ "display-name": "Storage",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "2",
+ "column-span": "1"
+ },
+ {
+ "name": "optimization-row1-col2-1",
+ "display-name": "",
+ "row-index": "0",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "optimization-row1-col2-2",
+ "display-name": "",
+ "row-index": "1",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1",
+ "border": true
+ },
+ {
+ "name": "optimization-row2-col1",
+ "display-name": "Optimization Vectorization",
+ "row-index": "2",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "optimization-row2-col2",
+ "display-name": "",
+ "row-index": "2",
+ "column-index": "1",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "optimization-row3-col1",
+ "display-name": "Memory",
+ "row-index": "3",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "optimization-row3-col2",
+ "display-name": "",
+ "row-index": "3",
+ "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-1",
+ "row-index": "0",
+ "column-index": "0",
+ "row-span": "1",
+ "column-span": "1"
+ },
+ {
+ "name": "acid-transactions-row1-col1-2",
+ "row-index": "1",
+ "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": "2",
+ "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": "2",
+ "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": "2",
+ "column-span": "1"
+ }
+ ]
+ }
+ ]
}
- ]
- }
- ]
- },
+ }
+ ]
+ }
+ ],
"placement": {
"configuration-layout": "default",
"configs": [
@@ -635,3 +633,4 @@
]
}
}
+