SLIDER-1040 Better formatting on the AM's web ui.
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/92484311 Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/92484311 Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/92484311 Branch: refs/heads/develop Commit: 924843114b7c0d194e762c4f7a3314e99abbfe7b Parents: c5f7ff9 Author: Josh Elser <els...@apache.org> Authored: Tue Dec 29 20:34:34 2015 -0500 Committer: Josh Elser <els...@apache.org> Committed: Wed Dec 30 16:20:58 2015 -0500 ---------------------------------------------------------------------- .../providers/AbstractProviderService.java | 8 ++-- .../apache/slider/providers/MonitorDetail.java | 43 ++++++++++++++++++++ .../slider/providers/ProviderService.java | 4 +- .../providers/agent/AgentProviderService.java | 12 +++--- .../server/appmaster/web/view/IndexBlock.java | 20 ++++++--- .../src/main/resources/webapps/static/yarn.css | 4 +- 6 files changed, 73 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/92484311/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java index c701a55..61b2655 100644 --- a/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java +++ b/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java @@ -335,8 +335,8 @@ public abstract class AbstractProviderService in the external view */ @Override - public Map<String, String> buildMonitorDetails(ClusterDescription clusterDesc) { - Map<String, String> details = new LinkedHashMap<String, String>(); + public Map<String, MonitorDetail> buildMonitorDetails(ClusterDescription clusterDesc) { + Map<String, MonitorDetail> details = new LinkedHashMap<String, MonitorDetail>(); // add in all the endpoints buildEndpointDetails(details); @@ -345,7 +345,7 @@ public abstract class AbstractProviderService } @Override - public void buildEndpointDetails(Map<String, String> details) { + public void buildEndpointDetails(Map<String, MonitorDetail> details) { ServiceRecord self = yarnRegistry.getSelfRegistration(); List<Endpoint> externals = self.external; @@ -355,7 +355,7 @@ public abstract class AbstractProviderService try { List<URL> urls = RegistryTypeUtils.retrieveAddressURLs(endpoint); if (!urls.isEmpty()) { - details.put(endpoint.api, urls.get(0).toString()); + details.put(endpoint.api, new MonitorDetail(urls.get(0).toString(), true)); } } catch (InvalidRecordException | MalformedURLException ignored) { // Ignored http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/92484311/slider-core/src/main/java/org/apache/slider/providers/MonitorDetail.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/MonitorDetail.java b/slider-core/src/main/java/org/apache/slider/providers/MonitorDetail.java new file mode 100644 index 0000000..27d3415 --- /dev/null +++ b/slider-core/src/main/java/org/apache/slider/providers/MonitorDetail.java @@ -0,0 +1,43 @@ +/* + * 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.slider.providers; + +/** + * Details about some exported information from a provider to the AM web UI. + */ +public class MonitorDetail { + + private final String value; + private final boolean isUrl; + + public MonitorDetail(String value, boolean isUrl) { + this.value = value; + this.isUrl = isUrl; + } + + public String getValue() { + return value; + } + + public boolean isUrl() { + return isUrl; + } + + public String toString() { + return "MonitorDetail[" + value + " isUrl=" + isUrl + "]"; + } +} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/92484311/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java index 1a18db6..4689ae8 100644 --- a/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java +++ b/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java @@ -154,7 +154,7 @@ public interface ProviderService extends ProviderCore, * If no anchor is needed/desired, insert the key with a null value. * @return the details */ - Map<String, String> buildMonitorDetails(ClusterDescription clusterSpec); + Map<String, MonitorDetail> buildMonitorDetails(ClusterDescription clusterSpec); /** * Get a human friendly name for web UIs and messages @@ -182,7 +182,7 @@ public interface ProviderService extends ProviderCore, * Build up the endpoint details for this service * @param details */ - void buildEndpointDetails(Map<String, String> details); + void buildEndpointDetails(Map<String, MonitorDetail> details); /** * Prior to going live -register the initial service registry data http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/92484311/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java index cc089d0..0a1a98f 100644 --- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java +++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java @@ -62,6 +62,7 @@ import org.apache.slider.core.registry.docstore.PublishedConfiguration; import org.apache.slider.core.registry.docstore.PublishedExports; import org.apache.slider.core.registry.info.CustomRegistryConstants; import org.apache.slider.providers.AbstractProviderService; +import org.apache.slider.providers.MonitorDetail; import org.apache.slider.providers.ProviderCore; import org.apache.slider.providers.ProviderRole; import org.apache.slider.providers.ProviderUtils; @@ -1135,8 +1136,8 @@ public class AgentProviderService extends AbstractProviderService implements } @Override - public Map<String, String> buildMonitorDetails(ClusterDescription clusterDesc) { - Map<String, String> details = super.buildMonitorDetails(clusterDesc); + public Map<String, MonitorDetail> buildMonitorDetails(ClusterDescription clusterDesc) { + Map<String, MonitorDetail> details = super.buildMonitorDetails(clusterDesc); buildRoleHostDetails(details); return details; } @@ -2848,12 +2849,11 @@ public class AgentProviderService extends AbstractProviderService implements } } - private void buildRoleHostDetails(Map<String, String> details) { + private void buildRoleHostDetails(Map<String, MonitorDetail> details) { for (Map.Entry<String, Map<String, ClusterNode>> entry : getRoleClusterNodeMapping().entrySet()) { - details.put(entry.getKey() + " Host(s)/Container(s): " + - getHostsList(entry.getValue().values(), false), - ""); + details.put(entry.getKey() + " Host(s)/Container(s)", + new MonitorDetail(getHostsList(entry.getValue().values(), false).toString(), false)); } } } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/92484311/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java index b3be3bf..e118896 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java @@ -20,12 +20,14 @@ import com.google.common.annotations.VisibleForTesting; import com.google.inject.Inject; import org.apache.hadoop.yarn.webapp.hamlet.Hamlet; import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.DIV; +import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.LI; import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.UL; import org.apache.slider.api.ClusterDescription; import org.apache.slider.api.StatusKeys; import org.apache.slider.api.types.ApplicationLivenessInformation; import org.apache.slider.api.types.RoleStatistics; import org.apache.slider.common.tools.SliderUtils; +import org.apache.slider.providers.MonitorDetail; import org.apache.slider.providers.ProviderService; import org.apache.slider.server.appmaster.state.RoleStatus; import org.apache.slider.server.appmaster.web.WebAppApi; @@ -249,16 +251,24 @@ public class IndexBlock extends SliderHamletBlock { protected void addProviderServiceOptions(ProviderService provider, UL ul, ClusterDescription clusterStatus) { - Map<String, String> details = provider.buildMonitorDetails( + Map<String, MonitorDetail> details = provider.buildMonitorDetails( clusterStatus); if (null == details) { return; } // Loop over each entry, placing the text in the UL, adding an anchor when the URL is non-null/empty - for (Entry<String, String> entry : details.entrySet()) { - String url = entry.getValue(); - if (SliderUtils.isSet(url) ) { - ul.li()._(entry.getKey()).a(url, url)._(); + for (Entry<String, MonitorDetail> entry : details.entrySet()) { + MonitorDetail detail = entry.getValue(); + if (SliderUtils.isSet(detail.getValue()) ) { + LI item = ul.li(); + item.span().$class("bold")._(entry.getKey())._(); + item._(" - "); + if (detail.isUrl()) { + // Render an anchor if the value is a URL + item.a(detail.getValue(), detail.getValue())._(); + } else { + item._(detail.getValue())._(); + } } else { ul.li(entry.getKey()); } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/92484311/slider-core/src/main/resources/webapps/static/yarn.css ---------------------------------------------------------------------- diff --git a/slider-core/src/main/resources/webapps/static/yarn.css b/slider-core/src/main/resources/webapps/static/yarn.css index ba12acb..1e9ca94 100644 --- a/slider-core/src/main/resources/webapps/static/yarn.css +++ b/slider-core/src/main/resources/webapps/static/yarn.css @@ -58,6 +58,8 @@ div.role-options-wrap table { margin-left: 0.5em; } h1.index_header { margin-bottom: 15px; } div.general_info { margin-bottom: 15px; } -div.provder_info { margin-bottom: 15px; } +div.container_instances { margin-bottom: 15px; } +div.diagnostics { margin-bottom: 15px; } +div.provider_info { margin-bottom: 15px; } div.cluster_json pre { white-space: pre-wrap; }