Repository: ambari Updated Branches: refs/heads/trunk 592609bb0 -> a982836df
AMBARI-10259. Expose the widget artifact on stack version and stack service resource. (swagle) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a982836d Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a982836d Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a982836d Branch: refs/heads/trunk Commit: a982836df6fad9a8d648c6bcc5b1852b2be4d7de Parents: 592609b Author: Siddharth Wagle <swa...@hortonworks.com> Authored: Fri Mar 27 15:09:09 2015 -0700 Committer: Siddharth Wagle <swa...@hortonworks.com> Committed: Fri Mar 27 16:49:49 2015 -0700 ---------------------------------------------------------------------- .../server/api/services/AmbariMetaInfo.java | 10 + .../internal/StackArtifactResourceProvider.java | 77 +++++++- .../ambari/server/stack/ServiceDirectory.java | 20 ++ .../ambari/server/stack/ServiceModule.java | 4 + .../ambari/server/stack/StackDirectory.java | 18 ++ .../apache/ambari/server/stack/StackModule.java | 5 + .../apache/ambari/server/state/ServiceInfo.java | 14 ++ .../apache/ambari/server/state/StackInfo.java | 11 ++ .../ambari/server/state/stack/WidgetLayout.java | 69 +++++++ .../server/state/stack/WidgetLayoutInfo.java | 115 +++++++++++ .../HBASE/0.96.0.2.0/metrics.json | 70 +++++++ .../HBASE/0.96.0.2.0/widgets.json | 192 +++++++++++++++++++ .../StackArtifactResourceProviderTest.java | 44 +++++ .../OTHER/2.0/services/HBASE/widgets.json | 192 +++++++++++++++++++ 14 files changed, 834 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java index 8952153..143022e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java @@ -102,6 +102,16 @@ public class AmbariMetaInfo { public static final String KERBEROS_DESCRIPTOR_FILE_NAME = "kerberos.json"; /** + * The filename name for a Widgets descriptor file at either the stack or service level + */ + public static final String WIDGETS_DESCRIPTOR_FILE_NAME = "widgets.json"; + + /** + * Filename for theme file at service layer + */ + public static final String SERVICE_THEME_FILE_NAME = "theme.json"; + + /** * This string is used in placeholder in places that are common for * all operating systems or in situations where os type is not important. */ http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java index b7530a0..53734aa 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java @@ -18,6 +18,8 @@ package org.apache.ambari.server.controller.internal; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.google.inject.Inject; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.StackAccessException; @@ -42,9 +44,13 @@ import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory; import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor; import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptorFactory; import org.apache.ambari.server.state.stack.MetricDefinition; +import org.apache.ambari.server.state.stack.WidgetLayout; +import org.apache.commons.lang.StringUtils; import java.io.File; +import java.io.FileReader; import java.io.IOException; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -144,6 +150,9 @@ public class StackArtifactResourceProvider extends AbstractControllerResourcePro @Inject private static KerberosServiceDescriptorFactory kerberosServiceDescriptorFactory; + Type widgetLayoutType = new TypeToken<Map<String, List<WidgetLayout>>>(){}.getType(); + Gson gson = new Gson(); + /** * set resource properties, pk and fk's */ @@ -185,6 +194,7 @@ public class StackArtifactResourceProvider extends AbstractControllerResourcePro resources.addAll(getKerberosDescriptors(request, predicate)); resources.addAll(getMetricsDescriptors(request, predicate)); + resources.addAll(getWidgetsDescriptors(request, predicate)); // add other artifacts types here if (resources.isEmpty()) { @@ -342,8 +352,8 @@ public class StackArtifactResourceProvider extends AbstractControllerResourcePro } catch (IOException e) { - LOG.error("Unable to process Kerberos Descriptor. Properties: " + properties, e); - throw new SystemException("An internal exception occurred while attempting to build a Kerberos Descriptor " + + LOG.error("Unable to process Metrics Descriptor. Properties: " + properties, e); + throw new SystemException("An internal exception occurred while attempting to build a Metrics Descriptor " + "artifact. See ambari server logs for more information", e); } @@ -370,24 +380,24 @@ public class StackArtifactResourceProvider extends AbstractControllerResourcePro for (Map<String, Object> properties : getPropertyMaps(predicate)) { String artifactName = (String) properties.get(ARTIFACT_NAME_PROPERTY_ID); - if (artifactName == null || artifactName.equals(KERBEROS_DESCRIPTOR_NAME)) { + if (artifactName == null || artifactName.equals(WIDGETS_DESCRIPTOR_NAME)) { String stackName = (String) properties.get(STACK_NAME_PROPERTY_ID); String stackVersion = (String) properties.get(STACK_VERSION_PROPERTY_ID); String stackService = (String) properties.get(STACK_SERVICE_NAME_PROPERTY_ID); Map<String, Object> descriptor; try { - descriptor = getKerberosDescriptor(stackName, stackVersion, stackService); + descriptor = getWidgetsDescriptor(stackName, stackVersion, stackService); } catch (IOException e) { - LOG.error("Unable to process Kerberos Descriptor. Properties: " + properties, e); - throw new SystemException("An internal exception occurred while attempting to build a Kerberos Descriptor " + + LOG.error("Unable to process Widgets Descriptor. Properties: " + properties, e); + throw new SystemException("An internal exception occurred while attempting to build a Widgets Descriptor " + "artifact. See ambari server logs for more information", e); } if (descriptor != null) { Resource resource = new ResourceImpl(Resource.Type.StackArtifact); Set<String> requestedIds = getRequestPropertyIds(request, predicate); - setResourceProperty(resource, ARTIFACT_NAME_PROPERTY_ID, KERBEROS_DESCRIPTOR_NAME, requestedIds); + setResourceProperty(resource, ARTIFACT_NAME_PROPERTY_ID, WIDGETS_DESCRIPTOR_NAME, requestedIds); setResourceProperty(resource, ARTIFACT_DATA_PROPERTY_ID, descriptor, requestedIds); setResourceProperty(resource, STACK_NAME_PROPERTY_ID, stackName, requestedIds); setResourceProperty(resource, STACK_VERSION_PROPERTY_ID, stackVersion, requestedIds); @@ -401,6 +411,59 @@ public class StackArtifactResourceProvider extends AbstractControllerResourcePro return resources; } + private Map<String, Object> getWidgetsDescriptor(String stackName, + String stackVersion, String serviceName) + throws NoSuchParentResourceException, IOException { + + AmbariManagementController controller = getManagementController(); + StackInfo stackInfo; + try { + stackInfo = controller.getAmbariMetaInfo().getStack(stackName, stackVersion); + } catch (StackAccessException e) { + throw new NoSuchParentResourceException(String.format( + "Parent stack resource doesn't exist: stackName='%s', stackVersion='%s'", stackName, stackVersion)); + } + + if (StringUtils.isEmpty(serviceName)) { + return getWidgetsDescriptorForCluster(stackInfo); + } else { + return getWidgetsDescriptorForService(stackInfo, serviceName); + } + } + + private Map<String, Object> getWidgetsDescriptorForService(StackInfo stackInfo, String serviceName) + throws NoSuchParentResourceException, IOException { + + Map<String, Object> widgetDescriptor = null; + + ServiceInfo serviceInfo = stackInfo.getService(serviceName); + if (serviceInfo == null) { + throw new NoSuchParentResourceException("Service not found. serviceName" + " = " + serviceName); + } + + File widgetDescriptorFile = serviceInfo.getWidgetsDescriptorFile(); + if (widgetDescriptorFile != null && widgetDescriptorFile.exists()) { + widgetDescriptor = gson.fromJson(new FileReader(widgetDescriptorFile), widgetLayoutType); + } + + return widgetDescriptor; + } + + private Map<String, Object> getWidgetsDescriptorForCluster(StackInfo stackInfo) + throws NoSuchParentResourceException, IOException { + + Map<String, Object> widgetDescriptor = null; + + String widgetDescriptorFileLocation = stackInfo.getWidgetsDescriptorFileLocation(); + if (widgetDescriptorFileLocation != null) { + File widgetDescriptorFile = new File(widgetDescriptorFileLocation); + if (widgetDescriptorFile.exists()) { + widgetDescriptor = gson.fromJson(new FileReader(widgetDescriptorFile), widgetLayoutType); + } + } + + return widgetDescriptor; + } /** * Get a kerberos descriptor. http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java index e7f27ee..e1fa524 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java @@ -52,6 +52,11 @@ public abstract class ServiceDirectory extends StackDefinitionDirectory { private File kerberosDescriptorFile; /** + * widgets descriptor file + */ + private File widgetsDescriptorFile; + + /** * package directory path */ protected String packageDir; @@ -109,6 +114,12 @@ public abstract class ServiceDirectory extends StackDefinitionDirectory { + File.separator + AmbariMetaInfo.KERBEROS_DESCRIPTOR_FILE_NAME); kerberosDescriptorFile = kdf.exists() ? kdf : null; + File wdf = new File(directory.getAbsolutePath() + + File.separator + AmbariMetaInfo.WIDGETS_DESCRIPTOR_FILE_NAME); + widgetsDescriptorFile = wdf.exists() ? wdf : null; + + File themeFile = new File(directory.getAbsolutePath() + File.separator + AmbariMetaInfo.SERVICE_THEME_FILE_NAME); + this.themeFile = themeFile.exists() ? themeFile : null; } /** @@ -156,6 +167,15 @@ public abstract class ServiceDirectory extends StackDefinitionDirectory { } /** + * Obtain the Widgets Descriptor file. + * + * @return Widgets Descriptor file + */ + public File getWidgetsDescriptorFile() { + return widgetsDescriptorFile; + } + + /** * Obtain the service metainfo file object representation. * * @return http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java index ef16e88..1e4a773 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java @@ -111,6 +111,7 @@ public class ServiceModule extends BaseModule<ServiceModule, ServiceInfo> implem serviceInfo.setMetricsFile(serviceDirectory.getMetricsFile()); serviceInfo.setAlertsFile(serviceDirectory.getAlertsFile()); serviceInfo.setKerberosDescriptorFile(serviceDirectory.getKerberosDescriptorFile()); + serviceInfo.setWidgetsDescriptorFile(serviceDirectory.getWidgetsDescriptorFile()); serviceInfo.setSchemaVersion(AmbariMetaInfo.SCHEMA_VERSION_2); serviceInfo.setServicePackageFolder(serviceDirectory.getPackageDir()); @@ -177,6 +178,9 @@ public class ServiceModule extends BaseModule<ServiceModule, ServiceInfo> implem if (serviceInfo.getThemesMap().isEmpty()) { serviceInfo.setThemesMap(parent.getThemesMap()); } + if (serviceInfo.getWidgetsDescriptorFile() == null) { + serviceInfo.setWidgetsDescriptorFile(parent.getWidgetsDescriptorFile()); + } mergeCustomCommands(parent.getCustomCommands(), serviceInfo.getCustomCommands()); mergeConfigDependencies(parent); http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java index d38cee9..89c10c6 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java @@ -68,6 +68,11 @@ public class StackDirectory extends StackDefinitionDirectory { private String kerberosDescriptorFilePath; /** + * kerberos descriptor file path + */ + private String widgetsDescriptorFilePath; + + /** * repository file */ private RepositoryXml repoFile; @@ -196,6 +201,15 @@ public class StackDirectory extends StackDefinitionDirectory { } /** + * Obtain the path to the (stack-level) widgets descriptor file + * + * @return the path to the (stack-level) widgets descriptor file + */ + public String getWidgetsDescriptorFilePath() { + return widgetsDescriptorFilePath; + } + + /** * Obtain the repository directory path. * * @return repository directory path @@ -277,6 +291,10 @@ public class StackDirectory extends StackDefinitionDirectory { kerberosDescriptorFilePath = getAbsolutePath() + File.separator + AmbariMetaInfo.KERBEROS_DESCRIPTOR_FILE_NAME; } + if (subDirs.contains(AmbariMetaInfo.WIDGETS_DESCRIPTOR_FILE_NAME)) { + widgetsDescriptorFilePath = getAbsolutePath() + File.separator + AmbariMetaInfo.WIDGETS_DESCRIPTOR_FILE_NAME; + } + parseUpgradePacks(subDirs); parseServiceDirectories(subDirs); parseRepoFile(subDirs); http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java index e0480c8..0b27ae5 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java @@ -224,6 +224,10 @@ public class StackModule extends BaseModule<StackModule, StackInfo> implements V stackInfo.setKerberosDescriptorFileLocation(parentStack.getModuleInfo().getKerberosDescriptorFileLocation()); } + if (stackInfo.getWidgetsDescriptorFileLocation() == null) { + stackInfo.setWidgetsDescriptorFileLocation(parentStack.getModuleInfo().getWidgetsDescriptorFileLocation()); + } + mergeServicesWithParent(parentStack, allStacks, commonServices); } @@ -412,6 +416,7 @@ public class StackModule extends BaseModule<StackModule, StackInfo> implements V stackInfo.setStackHooksFolder(stackDirectory.getHooksDir()); stackInfo.setRcoFileLocation(stackDirectory.getRcoFilePath()); stackInfo.setKerberosDescriptorFileLocation(stackDirectory.getKerberosDescriptorFilePath()); + stackInfo.setWidgetsDescriptorFileLocation(stackDirectory.getWidgetsDescriptorFilePath()); stackInfo.setUpgradesFolder(stackDirectory.getUpgradesDir()); stackInfo.setUpgradePacks(stackDirectory.getUpgradePacks()); stackInfo.setRoleCommandOrder(stackDirectory.getRoleCommandOrder()); http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java index 67342e3..6959b83 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java @@ -116,6 +116,9 @@ public class ServiceInfo implements Validable{ @XmlTransient private File kerberosDescriptorFile = null; + + @XmlTransient + private File widgetsDescriptorFile = null; @XmlTransient private boolean valid = true; @@ -615,6 +618,17 @@ public class ServiceInfo implements Validable{ } /** + * @return the widgets descriptor file, or <code>null</code> if none exists + */ + public File getWidgetsDescriptorFile() { + return widgetsDescriptorFile; + } + + public void setWidgetsDescriptorFile(File widgetsDescriptorFile) { + this.widgetsDescriptorFile = widgetsDescriptorFile; + } + + /** * @return config types this service contains configuration for, but which are primarily related to another service */ public Set<String> getExcludedConfigTypes() { http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java index 4b6898a..2aa89cc 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java @@ -40,6 +40,7 @@ public class StackInfo implements Comparable<StackInfo>, Validable{ private boolean active; private String rcoFileLocation; private String kerberosDescriptorFileLocation; + private String widgetsDescriptorFileLocation; private List<RepositoryInfo> repositories; private Collection<ServiceInfo> services; private String parentStackVersion; @@ -234,6 +235,8 @@ public class StackInfo implements Comparable<StackInfo>, Validable{ // Get the stack-level Kerberos descriptor file path String stackDescriptorFileFilePath = getKerberosDescriptorFileLocation(); + String widgetDescriptorFilePath = getWidgetsDescriptorFileLocation(); + // Collect the services' Kerberos descriptor files Collection<ServiceInfo> serviceInfos = getServices(); // The collection of service descriptor files. A Set is being used because some Kerberos descriptor @@ -316,6 +319,14 @@ public class StackInfo implements Comparable<StackInfo>, Validable{ this.kerberosDescriptorFileLocation = kerberosDescriptorFileLocation; } + public String getWidgetsDescriptorFileLocation() { + return widgetsDescriptorFileLocation; + } + + public void setWidgetsDescriptorFileLocation(String widgetsDescriptorFileLocation) { + this.widgetsDescriptorFileLocation = widgetsDescriptorFileLocation; + } + public String getStackHooksFolder() { return stackHooksFolder; } http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/state/stack/WidgetLayout.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/WidgetLayout.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/WidgetLayout.java new file mode 100644 index 0000000..d730adf --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/WidgetLayout.java @@ -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. + */ +package org.apache.ambari.server.state.stack; + +import com.google.gson.annotations.SerializedName; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.List; +import java.util.Map; + +public class WidgetLayout { + @SerializedName("layout_name") + private String layoutName; + @SerializedName("section_name") + private String sectionName; + @SerializedName("widgetLayoutInfo") + private List<WidgetLayoutInfo> widgetLayoutInfoList; + + @JsonProperty("layout_name") + public String getLayoutName() { + return layoutName; + } + + public void setLayoutName(String layoutName) { + this.layoutName = layoutName; + } + + public String getSectionName() { + return sectionName; + } + + @JsonProperty("section_name") + public void setSectionName(String sectionName) { + this.sectionName = sectionName; + } + + @JsonProperty("widgetLayoutInfo") + public List<WidgetLayoutInfo> getWidgetLayoutInfoList() { + return widgetLayoutInfoList; + } + + public void setWidgetLayoutInfoList(List<WidgetLayoutInfo> widgetLayoutInfoList) { + this.widgetLayoutInfoList = widgetLayoutInfoList; + } + + @Override + public String toString() { + return "WidgetLayout{" + + "layoutName='" + layoutName + '\'' + + ", sectionName='" + sectionName + '\'' + + ", widgetLayoutInfoList=" + widgetLayoutInfoList + + '}'; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/java/org/apache/ambari/server/state/stack/WidgetLayoutInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/WidgetLayoutInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/WidgetLayoutInfo.java new file mode 100644 index 0000000..d3d317d --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/WidgetLayoutInfo.java @@ -0,0 +1,115 @@ +/** + * 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.stack; + +import com.google.gson.annotations.SerializedName; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.List; +import java.util.Map; + +public class WidgetLayoutInfo { + @SerializedName("widget_name") + private String widgetName; + @SerializedName("display_name") + private String displayName; + @SerializedName("description") + private String description; + @SerializedName("widget_type") + private String type; + @SerializedName("is_visible") + private boolean visibility; + @SerializedName("metrics") + private List<Map<String, String>> metricsInfo; + @SerializedName("values") + private List<Map<String, String>> values; + @SerializedName("properties") + private Map<String, String> properties; + + @JsonProperty("widget_name") + public String getWidgetName() { + return widgetName; + } + + public void setWidgetName(String widgetName) { + this.widgetName = widgetName; + } + + @JsonProperty("display_name") + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + @JsonProperty("description") + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @JsonProperty("widget_type") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @JsonProperty("is_visible") + public boolean getVisibility() { + return visibility; + } + + public void setVisibility(boolean visibility) { + this.visibility = visibility; + } + + @JsonProperty("metrics") + public List<Map<String, String>> getMetricsInfo() { + return metricsInfo; + } + + public void setMetricsInfo(List<Map<String, String>> metricsInfo) { + this.metricsInfo = metricsInfo; + } + + @JsonProperty("values") + public List<Map<String, String>> getValues() { + return values; + } + + public void setValues(List<Map<String, String>> values) { + this.values = values; + } + + @JsonProperty("properties") + public Map<String, String> getProperties() { + return properties; + } + + public void setProperties(Map<String, String> properties) { + this.properties = properties; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json index 4f99b25..1c25729 100644 --- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json +++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json @@ -655,6 +655,76 @@ "pointInTime": false, "temporal": true }, + "metrics/hbase/regionserver/Server/Get_num_ops": { + "metric": "regionserver.Server.Get_num_ops", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/Append_num_ops": { + "metric": "regionserver.Server.Append_num_ops", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/Delete_num_ops": { + "metric": "regionserver.Server.Delete_num_ops", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/Mutate_num_ops": { + "metric": "regionserver.Server.Mutate_num_ops", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/Get_95th_percentile": { + "metric": "regionserver.Server.Get_95th_percentile", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/Mutate_95th_percentile": { + "metric": "regionserver.Server.Mutate_95th_percentile", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/Increment_95th_percentile": { + "metric": "regionserver.Server.Increment_95th_percentile", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/Append_95th_percentile": { + "metric": "regionserver.Server.Append_95th_percentile", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/Delete_95th_percentile": { + "metric": "regionserver.Server.Delete_95th_percentile", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/percentFilesLocal": { + "metric": "regionserver.Server.percentFilesLocal", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/regionserver/Server/updatesBlockedTime": { + "metric": "regionserver.Server.updatesBlockedTime", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/ipc/IPC/numOpenConnections": { + "metric": "ipc.IPC.numOpenConnections", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/ipc/IPC/numActiveHandler": { + "metric": "ipc.IPC.numActiveHandler", + "pointInTime": false, + "temporal": true + }, + "metrics/hbase/ipc/IPC/numCallsInGeneralQueue": { + "metric": "ipc.IPC.numCallsInGeneralQueue", + "pointInTime": false, + "temporal": true + }, "metrics/rpc/enableTable_avg_time": { "metric": "rpc.rpc.enableTable_avg_time", "pointInTime": true, http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json new file mode 100644 index 0000000..a64a2c8 --- /dev/null +++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json @@ -0,0 +1,192 @@ +{ + "layouts": [ + { + "layout_name": "default_hbase_layout", + "section_name": "HBASE_SUMMARY", + "widgetLayoutInfo": [ + { + "widget_name": "RS_READS_WRITES", + "display_name": "RegionServer Reads and Writes", + "description": "This widget shows all the read requests and write requests on all regions for a RegionServer", + "widget_type": "GRAPH", + "is_visible": true, + "metrics": [ + { + "name": "regionserver.Server.Get_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Get_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER", + "host_component_criteria": "isActive=true" + }, + { + "name": "regionserver.Server.Scan_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Scan_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "regionserver.Server.Append_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Append_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "regionserver.Server.Delete_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Delete_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "regionserver.Server.Increment_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Increment_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "regionserver.Server.Mutate_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Mutate_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Read Requests", + "value": "`${regionserver.Server.Get_num_ops + regionserver.Server.Scan_num_ops}`" + }, + { + "name": "Write Requests", + "value": "`${metrics.hbase.regionserver.Server.Append_num_ops + metrics.hbase.regionserver.Server.Delete_num_ops + metrics.hbase.regionserver.Server.Increment_num_ops + metrics.hbase.regionserver.Server.Mutate_num_ops}`" + } + ], + "properties": { + "display_unit": "Requests", + "graph_type": "LINE", + "time_ranger": "1 week" + } + }, + { + "widget_name": "OPEN_CONNECTIONS", + "display_name": "Open Connections", + "description": "This widget shows number of current open connections", + "widget_type": "GRAPH", + "is_visible": true, + "metrics": [ + { + "name": "ipc.IPC.numOpenConnections", + "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Open Connections", + "value": "`${ipc.IPC.numOpenConnections}`" + } + ], + "properties": { + "display_unit": "Connections", + "graph_type": "STACK", + "time_ranger": "1 hour" + } + }, + { + "widget_name": "ACTIVE_HANDLER", + "display_name": "Active Handlers vs Calls in General Queue", + "widget_type": "GRAPH", + "is_visible": true, + "metrics": [ + { + "name": "ipc.IPC.numOpenConnections", + "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "ipc.IPC.numCallsInGeneralQueue", + "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Active Handlers", + "value": "`${ipc.IPC.numActiveHandler}`" + }, + { + "name": "Calls in General Queue", + "value": "`${ipc.IPC.numCallsInGeneralQueue}`" + } + ], + "properties": { + "graph_type": "LINE", + "time_ranger": "1 hour" + } + }, + { + "widget_name": "FILES_LOCAL", + "display_name": "Files Local", + "description": "This widget shows percentage of files local.", + "widget_type": "NUMBER", + "is_visible": true, + "metrics": [ + { + "name": "regionserver.Server.percentFilesLocal", + "ambari_id": "metrics/hbase/regionserver/percentFilesLocal", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Files Local", + "value": "`${regionserver.Server.percentFilesLocal}`" + } + ], + "properties": { + "display_unit": "%" + } + }, + { + "widget_name": "UPDATED_BLOCKED_TIME", + "display_name": "Updated Blocked Time", + "description": "", + "widget_type": "GRAPH", + "is_visible": true, + "metrics": [ + { + "name": "regionserver.Server.updatesBlockedTime", + "ambari_id": "metrics/hbase/regionserver/Server/updatesBlockedTime", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Updated Blocked Time", + "value": "`${regionserver.Server.updatesBlockedTime}`" + } + ], + "properties": { + "display_unit": "seconds", + "graph_type": "LINE", + "time_ranger": "1 day" + } + } + ] + } +] +} http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java index b3e7e51..1251d99 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java @@ -30,12 +30,14 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.orm.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; import org.apache.ambari.server.state.stack.MetricDefinition; +import org.apache.ambari.server.state.stack.WidgetLayout; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import static org.apache.ambari.server.controller.internal.StackArtifactResourceProvider.ARTIFACT_DATA_PROPERTY_ID; @@ -116,8 +118,50 @@ public class StackArtifactResourceProviderTest { MetricDefinition md = (MetricDefinition) ((ArrayList) descriptor.get ("Component")).iterator().next(); Assert.assertEquals(326, md.getMetrics().size()); + verify(managementController); } + @Test + @SuppressWarnings("unchecked") + public void testGetWidgetDescriptorForService() throws Exception { + AmbariManagementController managementController = createNiceMock(AmbariManagementController.class); + + expect(managementController.getAmbariMetaInfo()).andReturn(metaInfo).anyTimes(); + + replay(managementController); + + StackArtifactResourceProvider resourceProvider = getStackArtifactResourceProvider(managementController); + + Set<String> propertyIds = new HashSet<String>(); + propertyIds.add(ARTIFACT_NAME_PROPERTY_ID); + propertyIds.add(STACK_NAME_PROPERTY_ID); + propertyIds.add(STACK_VERSION_PROPERTY_ID); + propertyIds.add(STACK_SERVICE_NAME_PROPERTY_ID); + propertyIds.add(ARTIFACT_DATA_PROPERTY_ID); + + Request request = PropertyHelper.getReadRequest(propertyIds); + + Predicate predicate = new PredicateBuilder().property + (ARTIFACT_NAME_PROPERTY_ID).equals("widgets_descriptor").and().property + (STACK_NAME_PROPERTY_ID).equals("OTHER").and().property + (STACK_VERSION_PROPERTY_ID).equals("2.0").and().property + (STACK_SERVICE_NAME_PROPERTY_ID).equals("HBASE").toPredicate(); + + Set<Resource> resources = resourceProvider.getResources(request, predicate); + + Assert.assertEquals(1, resources.size()); + Resource resource = resources.iterator().next(); + Map<String, Map<String, Object>> propertyMap = resource.getPropertiesMap(); + Map<String, Object> descriptor = propertyMap.get(ARTIFACT_DATA_PROPERTY_ID); + Assert.assertNotNull(descriptor); + Assert.assertEquals(1, ((List<Object>) descriptor.get("layouts")).size()); + WidgetLayout layout = ((List<WidgetLayout>) descriptor.get("layouts")).iterator().next(); + Assert.assertEquals("default_hbase_layout", layout.getLayoutName()); + Assert.assertEquals("HBASE_SUMMARY", layout.getSectionName()); + Assert.assertEquals(5, layout.getWidgetLayoutInfoList().size()); + + verify(managementController); + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/a982836d/ambari-server/src/test/resources/stacks/OTHER/2.0/services/HBASE/widgets.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/OTHER/2.0/services/HBASE/widgets.json b/ambari-server/src/test/resources/stacks/OTHER/2.0/services/HBASE/widgets.json new file mode 100644 index 0000000..705c3eb --- /dev/null +++ b/ambari-server/src/test/resources/stacks/OTHER/2.0/services/HBASE/widgets.json @@ -0,0 +1,192 @@ +{ + "layouts": [ + { + "layout_name": "default_hbase_layout", + "section_name": "HBASE_SUMMARY", + "widgetLayoutInfo": [ + { + "widget_name": "RS_READS_WRITES", + "display_name": "RegionServer Reads and Writes", + "description": "This widget shows all the read requests and write requests on all regions for a RegionServer", + "widget_type": "GRAPH", + "is_visible": true, + "metrics": [ + { + "name": "regionserver.Server.Get_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Get_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER", + "host_component_criteria": "isActive=true" + }, + { + "name": "regionserver.Server.Scan_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Scan_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "regionserver.Server.Append_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Append_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "regionserver.Server.Delete_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Delete_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "regionserver.Server.Increment_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Increment_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "regionserver.Server.Mutate_num_ops", + "ambari_id": "metrics/hbase/regionserver/Server/Mutate_num_ops", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Read Requests", + "value": "`${regionserver.Server.Get_num_ops + regionserver.Server.Scan_num_ops}`" + }, + { + "name": "Write Requests", + "value": "`${metrics.hbase.regionserver.Server.Append_num_ops + metrics.hbase.regionserver.Server.Delete_num_ops + metrics.hbase.regionserver.Server.Increment_num_ops + metrics.hbase.regionserver.Server.Mutate_num_ops}`" + } + ], + "properties": { + "display_unit": "Requests", + "graph_type": "LINE", + "time_ranger": "1 week" + } + }, + { + "widget_name": "OPEN_CONNECTIONS", + "display_name": "Open Connections", + "description": "This widget shows number of current open connections", + "widget_type": "GRAPH", + "is_visible": true, + "metrics": [ + { + "name": "ipc.IPC.numOpenConnections", + "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Open Connections", + "value": "`${ipc.IPC.numOpenConnections}`" + } + ], + "properties": { + "display_unit": "Connections", + "graph_type": "STACK", + "time_ranger": "1 hour" + } + }, + { + "widget_name": "ACTIVE_HANDLER", + "display_name": "Active Handlers vs Calls in General Queue", + "widget_type": "GRAPH", + "is_visible": true, + "metrics": [ + { + "name": "ipc.IPC.numOpenConnections", + "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + }, + { + "name": "ipc.IPC.numCallsInGeneralQueue", + "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Active Handlers", + "value": "`${ipc.IPC.numActiveHandler}`" + }, + { + "name": "Calls in General Queue", + "value": "`${ipc.IPC.numCallsInGeneralQueue}`" + } + ], + "properties": { + "graph_type": "LINE", + "time_ranger": "1 hour" + } + }, + { + "widget_name": "FILES_LOCAL", + "display_name": "Files Local", + "description": "This widget shows percentage of files local.", + "widget_type": "NUMBER", + "is_visible": true, + "metrics": [ + { + "name": "regionserver.Server.percentFilesLocal", + "ambari_id": "metrics/hbase/regionserver/percentFilesLocal", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Files Local", + "value": "`${regionserver.Server.percentFilesLocal}`" + } + ], + "properties": { + "display_unit": "%" + } + }, + { + "widget_name": "UPDATED_BLOCKED_TIME", + "display_name": "Updated Blocked Time", + "description": "", + "widget_type": "GRAPH", + "is_visible": true, + "metrics": [ + { + "name": "regionserver.Server.updatesBlockedTime", + "ambari_id": "metrics/hbase/regionserver/Server/updatesBlockedTime", + "category": "", + "service_name": "HBASE", + "component_name": "HBASE_REGIONSERVER" + } + ], + "values": [ + { + "name": "Updated Blocked Time", + "value": "`${regionserver.Server.updatesBlockedTime}`" + } + ], + "properties": { + "display_unit": "seconds", + "graph_type": "LINE", + "time_ranger": "1 day" + } + } + ] + } + ] +}