http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/publisher/PublisherResource.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/publisher/PublisherResource.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/publisher/PublisherResource.java deleted file mode 100644 index 3e9b764..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/publisher/PublisherResource.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * 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.server.appmaster.web.rest.publisher; - -import org.apache.hadoop.yarn.webapp.NotFoundException; -import org.apache.slider.core.registry.docstore.ConfigFormat; -import org.apache.slider.core.registry.docstore.PublishedConfigSet; -import org.apache.slider.core.registry.docstore.PublishedConfiguration; -import org.apache.slider.core.registry.docstore.PublishedConfigurationOutputter; -import org.apache.slider.core.registry.docstore.PublishedExports; -import org.apache.slider.core.registry.docstore.PublishedExportsSet; -import org.apache.slider.core.registry.docstore.UriMap; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; -import org.apache.slider.server.appmaster.web.WebAppApi; -import org.apache.slider.server.appmaster.web.rest.AbstractSliderResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; -import java.io.IOException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.apache.slider.server.appmaster.web.rest.RestPaths.PUBLISHED_CONFIGURATION_REGEXP; -import static org.apache.slider.server.appmaster.web.rest.RestPaths.PUBLISHED_CONFIGURATION_SET_REGEXP; - -/** - * This publishes configuration sets - */ -public class PublisherResource extends AbstractSliderResource { - protected static final Logger log = - LoggerFactory.getLogger(PublisherResource.class); - public static final String EXPORTS_NAME = "exports"; - public static final String EXPORTS_RESOURCES_PATH = "/" + EXPORTS_NAME; - public static final String EXPORT_RESOURCE_PATH = EXPORTS_RESOURCES_PATH + "/{exportname}" ; - public static final String SET_NAME = - "{setname: " + PUBLISHED_CONFIGURATION_SET_REGEXP + "}"; - public static final String SETNAME = "setname"; - public static final String CLASSPATH = "/classpath"; - public static final String CONFIG = "config"; - - public static final String SETNAME_PATTERN = - "{"+ SETNAME+": " + PUBLISHED_CONFIGURATION_SET_REGEXP + "}"; - private static final String CONFIG_PATTERN = - SETNAME_PATTERN + "/{"+ CONFIG +": " + PUBLISHED_CONFIGURATION_REGEXP + "}"; - private final StateAccessForProviders appState; - - public PublisherResource(WebAppApi slider) { - super(slider); - appState = slider.getAppState(); - } - - private void init(HttpServletResponse res, UriInfo uriInfo) { - res.setContentType(null); - log.debug(uriInfo.getRequestUri().toString()); - } - - /** - * Get a named config set - * @param setname name of the config set - * @return the config set - * @throws NotFoundException if there was no matching set - */ - private PublishedConfigSet getConfigSet(String setname) { - PublishedConfigSet configSet = - appState.getPublishedConfigSet(setname); - if (configSet == null) { - throw new NotFoundException("Not found: " + setname); - } - return configSet; - } - - @GET - @Path("/") - @Produces({MediaType.APPLICATION_JSON}) - public UriMap enumConfigSets( - @Context UriInfo uriInfo, - @Context HttpServletResponse res) { - init(res, uriInfo); - String baseURL = uriInfo.getRequestUri().toString(); - if (!baseURL.endsWith("/")) { - baseURL += "/"; - } - UriMap uriMap = new UriMap(); - for (String name : appState.listConfigSets()) { - uriMap.put(name, baseURL + name); - log.info("registering config set {} at {}", name, baseURL); - } - uriMap.put(EXPORTS_NAME, baseURL + EXPORTS_NAME); - return uriMap; - } - - @GET - @Path(CLASSPATH) - @Produces({MediaType.APPLICATION_JSON}) - public List<URL> getAMClassPath() { - URL[] urls = ((URLClassLoader) getClass().getClassLoader()).getURLs(); - return Arrays.asList(urls); - } - - @GET - @Path(EXPORTS_RESOURCES_PATH) - @Produces({MediaType.APPLICATION_JSON}) - public PublishedExportsSet gePublishedExports() { - - return appState.getPublishedExportsSet(); - } - - @GET - @Path(EXPORT_RESOURCE_PATH) - @Produces({MediaType.APPLICATION_JSON}) - public PublishedExports getAMExports2(@PathParam("exportname") String exportname, - @Context UriInfo uriInfo, - @Context HttpServletResponse res) { - init(res, uriInfo); - PublishedExportsSet set = appState.getPublishedExportsSet(); - return set.get(exportname); - } - - @GET - @Path("/"+ SETNAME_PATTERN) - @Produces({MediaType.APPLICATION_JSON}) - public PublishedConfigSet getPublishedConfiguration( - @PathParam(SETNAME) String setname, - @Context UriInfo uriInfo, - @Context HttpServletResponse res) { - init(res, uriInfo); - - logRequest(uriInfo); - PublishedConfigSet publishedConfigSet = getConfigSet(setname); - log.debug("Number of configurations: {}", publishedConfigSet.size()); - return publishedConfigSet.shallowCopy(); - } - - private void logRequest(UriInfo uriInfo) { - log.info(uriInfo.getRequestUri().toString()); - } - - @GET - @Path("/" + CONFIG_PATTERN) - @Produces({MediaType.APPLICATION_JSON}) - public PublishedConfiguration getConfigurationInstance( - @PathParam(SETNAME) String setname, - @PathParam(CONFIG) String config, - @Context UriInfo uriInfo, - @Context HttpServletResponse res) { - init(res, uriInfo); - - PublishedConfiguration publishedConfig = - getPublishedConfiguration(setname, config); - if (publishedConfig == null) { - log.info("Configuration {} not found", config); - throw new NotFoundException("Not found: " + uriInfo.getAbsolutePath()); - } - return publishedConfig; - } - - /** - * Get a configuration - * @param setname name of the config set - * @param config config - * @return null if there was a config, but not a set - * @throws NotFoundException if there was no matching set - */ - public PublishedConfiguration getPublishedConfiguration(String setname, - String config) { - return getConfigSet(setname).get(config); - } - - @GET - @Path("/" + CONFIG_PATTERN + ".json") - @Produces({MediaType.APPLICATION_JSON}) - public String getConfigurationContentJson( - @PathParam(SETNAME) String setname, - - @PathParam(CONFIG) String config, - @Context UriInfo uriInfo, - @Context HttpServletResponse res) throws IOException { - return getStringRepresentation(setname, config, uriInfo, res, - ConfigFormat.JSON); - } - - @GET - @Path("/" + CONFIG_PATTERN + ".xml") - @Produces({MediaType.APPLICATION_XML}) - public String getConfigurationContentXML( - @PathParam(SETNAME) String setname, - @PathParam(CONFIG) String config, - @Context UriInfo uriInfo, - @Context HttpServletResponse res) throws IOException { - return getStringRepresentation(setname, config, uriInfo, res, - ConfigFormat.XML); - } - - @GET - @Path("/" + CONFIG_PATTERN + ".properties") - @Produces({MediaType.APPLICATION_XML}) - public String getConfigurationContentProperties( - @PathParam(SETNAME) String setname, - - @PathParam(CONFIG) String config, - @Context UriInfo uriInfo, - @Context HttpServletResponse res) throws IOException { - - return getStringRepresentation(setname, config, uriInfo, res, - ConfigFormat.PROPERTIES); - } - - public String getStringRepresentation(String setname, - String config, - UriInfo uriInfo, - HttpServletResponse res, ConfigFormat format) throws IOException { - // delegate (including init) - PublishedConfiguration publishedConfig = - getConfigurationInstance(setname, config, uriInfo, res); - PublishedConfigurationOutputter outputter = - publishedConfig.createOutputter(format); - return outputter.asString(); - } - - @GET - @Path("/" + CONFIG_PATTERN +"/{propertyName}") - @Produces({MediaType.APPLICATION_JSON}) - public Map<String,String> getConfigurationProperty( - @PathParam(SETNAME) String setname, - @PathParam(CONFIG) String config, - @PathParam("propertyName") String propertyName, - @Context UriInfo uriInfo, - @Context HttpServletResponse res) { - PublishedConfiguration publishedConfig = - getConfigurationInstance(setname, config, uriInfo, res); - String propVal = publishedConfig.entries.get(propertyName); - if (propVal == null) { - log.debug("Configuration property {} not found in configuration {}", - propertyName, config); - throw new NotFoundException("Property not found: " + propertyName); - } - Map<String, String> rtnVal = new HashMap<>(); - rtnVal.put(propertyName, propVal); - - return rtnVal; - } - -}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/registry/PathEntryResource.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/registry/PathEntryResource.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/registry/PathEntryResource.java deleted file mode 100644 index efb09a8..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/registry/PathEntryResource.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.server.appmaster.web.rest.registry; - -import org.apache.hadoop.registry.client.types.ServiceRecord; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.map.annotate.JsonSerialize; - -import java.util.List; - -/** - * Representation of a path entry - */ -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class PathEntryResource { - - /** - * Child nodes: as the short path to each element - */ - public List<String> nodes; - - /** - * Service record: if null âthere is no resolvable service - * record at this node. - */ - public ServiceRecord service; - -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/registry/RegistryResource.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/registry/RegistryResource.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/registry/RegistryResource.java deleted file mode 100644 index c824848..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/registry/RegistryResource.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * 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.server.appmaster.web.rest.registry; - -import com.google.inject.Singleton; -import org.apache.hadoop.fs.PathNotFoundException; -import org.apache.hadoop.registry.client.api.RegistryOperations; -import org.apache.hadoop.registry.client.exceptions.AuthenticationFailedException; -import org.apache.hadoop.registry.client.exceptions.InvalidRecordException; -import org.apache.hadoop.registry.client.exceptions.NoPathPermissionsException; -import org.apache.hadoop.registry.client.exceptions.NoRecordException; -import org.apache.hadoop.yarn.webapp.ForbiddenException; -import org.apache.hadoop.yarn.webapp.NotFoundException; -import org.apache.slider.server.appmaster.web.WebAppApi; -import org.apache.slider.server.appmaster.web.rest.AbstractSliderResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; -import java.io.IOException; - -/** - * This is the read-only view of the YARN registry. - * - * Model: - * <ol> - * <li>a tree of nodes</li> - * <li>Default view is of children + record</li> - * </ol> - * - */ -@Singleton -public class RegistryResource extends AbstractSliderResource { - protected static final Logger log = - LoggerFactory.getLogger(RegistryResource.class); - public static final String SERVICE_PATH = - "/{path:.*}"; - - private final RegistryOperations registry; - - /** - * Construct an instance bonded to a registry - * @param slider slider API - */ - public RegistryResource(WebAppApi slider) { - super(slider); - this.registry = slider.getRegistryOperations(); - } - - - /** - * Internal init code, per request - * @param request incoming request - * @param uriInfo URI details - */ - private void init(HttpServletRequest request, UriInfo uriInfo) { - log.debug(uriInfo.getRequestUri().toString()); - } - - @GET - @Produces({MediaType.APPLICATION_JSON}) - public PathEntryResource getRoot(@Context HttpServletRequest request, - @Context UriInfo uriInfo) { - return lookup("/", request, uriInfo); - } - -// {path:.*} - - @Path(SERVICE_PATH) - @GET - @Produces({MediaType.APPLICATION_JSON}) - public PathEntryResource lookup( - @PathParam("path") String path, - @Context HttpServletRequest request, - @Context UriInfo uriInfo) { - init(request, uriInfo); - return resolvePath(path); - } - - /** - * Do the actual processing of requests to responses; can be directly - * invoked for testing. - * @param path path to query - * @return the entry - * @throws WebApplicationException on any failure. - */ - public PathEntryResource resolvePath(String path) throws - WebApplicationException { - try { - PathEntryResource pathEntry = - fromRegistry(path); - if (log.isDebugEnabled()) { - log.debug("Resolved:\n{}", pathEntry); - } - return pathEntry; - - } catch (Exception e) { - throw buildException(path, e); - } - } - - - /** - * Build from the registry, filling up the children and service records. - * If there is no service record at the end of the path, that entry is - * null - * @param path path to query - * @return the built up record - * @throws IOException problems - * - */ - private PathEntryResource fromRegistry(String path) throws IOException { - PathEntryResource entry = new PathEntryResource(); - try { - entry.service = registry.resolve(path); - } catch (NoRecordException e) { - // ignoring - log.debug("No record at {}", path); - } catch (InvalidRecordException e) { - // swallowing this exception, the sign of "no entry present" - // "nothing parseable" - log.warn("Failed to resolve {}: {}", path, e, e); - } - entry.nodes = registry.list(path); - return entry; - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/ClusterSpecificationBlock.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/ClusterSpecificationBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/ClusterSpecificationBlock.java deleted file mode 100644 index 79b687f..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/ClusterSpecificationBlock.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.server.appmaster.web.view; - -import com.google.inject.Inject; -import org.apache.hadoop.yarn.webapp.hamlet.Hamlet; -import org.apache.slider.server.appmaster.web.WebAppApi; - -/** - * - */ -public class ClusterSpecificationBlock extends SliderHamletBlock { - - @Inject - public ClusterSpecificationBlock(WebAppApi slider) { - super(slider); - } - - @Override - protected void render(Block html) { - doRender(html); - } - - // An extra method to make testing easier since you can't make an instance of Block - protected void doRender(Hamlet html) { - html. - div("cluster_json"). - h2("JSON Cluster Specification"). - pre(). - _(getJson())._()._(); - } - - /** - * Get the JSON, catching any exceptions and returning error text instead - * @return - */ - private String getJson() { - return appState.getApplication().toString(); - } - -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/ContainerStatsBlock.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/ContainerStatsBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/ContainerStatsBlock.java deleted file mode 100644 index 4796d6c..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/ContainerStatsBlock.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * 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.server.appmaster.web.view; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; -import com.google.inject.Inject; -import org.apache.commons.lang.StringUtils; -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.TABLE; -import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TBODY; -import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TR; -import org.apache.slider.api.ClusterNode; -import org.apache.slider.api.resource.Application; -import org.apache.slider.api.types.ComponentInformation; -import org.apache.slider.server.appmaster.state.RoleInstance; -import org.apache.slider.server.appmaster.web.WebAppApi; - -import javax.annotation.Nonnull; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -/** - * - */ -public class ContainerStatsBlock extends SliderHamletBlock { - - private static final String EVEN = "even", ODD = "odd", BOLD = "bold", SCHEME = "http://", PATH = "/node/container/"; - - // Some functions that help transform the data into an object we can use to abstract presentation specifics - protected static final Function<Entry<String,Integer>,Entry<TableContent,Integer>> stringIntPairFunc = toTableContentFunction(); - protected static final Function<Entry<String,Long>,Entry<TableContent,Long>> stringLongPairFunc = toTableContentFunction(); - protected static final Function<Entry<String,String>,Entry<TableContent,String>> stringStringPairFunc = toTableContentFunction(); - - @Inject - public ContainerStatsBlock(WebAppApi slider) { - super(slider); - } - - /** - * Sort a collection of ClusterNodes by name - */ - protected static class ClusterNodeNameComparator implements Comparator<ClusterNode>, - Serializable { - - @Override - public int compare(ClusterNode node1, ClusterNode node2) { - if (null == node1 && null != node2) { - return -1; - } else if (null != node1 && null == node2) { - return 1; - } else if (null == node1) { - return 0; - } - - final String name1 = node1.name, name2 = node2.name; - if (null == name1 && null != name2) { - return -1; - } else if (null != name1 && null == name2) { - return 1; - } else if (null == name1) { - return 0; - } - - return name1.compareTo(name2); - } - - } - - @Override - protected void render(Block html) { - final Map<String,RoleInstance> containerInstances = getContainerInstances( - appState.cloneOwnedContainerList()); - - Map<String, Map<String, ClusterNode>> clusterNodeMap = - appState.getRoleClusterNodeMapping(); - Map<String, ComponentInformation> componentInfoMap = appState.getComponentInfoSnapshot(); - - for (Entry<String, Map<String, ClusterNode>> entry : clusterNodeMap.entrySet()) { - final String name = entry.getKey(); - Map<String, ClusterNode> clusterNodesInRole = entry.getValue(); - //final RoleStatus roleStatus = entry.getValue(); - - DIV<Hamlet> div = html.div("role-info ui-widget-content ui-corner-all"); - - List<ClusterNode> nodesInRole = - new ArrayList<>(clusterNodesInRole.values()); - - div.h2(BOLD, StringUtils.capitalize(name)); - - // Generate the details on this role - ComponentInformation componentInfo = componentInfoMap.get(name); - if (componentInfo != null) { - Iterable<Entry<String,Integer>> stats = componentInfo.buildStatistics().entrySet(); - generateRoleDetails(div,"role-stats-wrap", "Specifications", - Iterables.transform(stats, stringIntPairFunc)); - } - - // Sort the ClusterNodes by their name (containerid) - Collections.sort(nodesInRole, new ClusterNodeNameComparator()); - - // Generate the containers running this role - generateRoleDetails(div, "role-stats-containers", "Containers", - Iterables.transform(nodesInRole, new Function<ClusterNode,Entry<TableContent,String>>() { - - @Override - public Entry<TableContent,String> apply(ClusterNode input) { - final String containerId = input.name; - - if (containerInstances.containsKey(containerId)) { - RoleInstance roleInst = containerInstances.get(containerId); - if (roleInst.container.getNodeHttpAddress() != null) { - return Maps.<TableContent,String> immutableEntry( - new TableAnchorContent(containerId, - buildNodeUrlForContainer(roleInst.container.getNodeHttpAddress(), containerId)), null); - } - } - return Maps.immutableEntry(new TableContent(input.name), null); - } - - })); - - Application application = appState.getApplication(); - Iterable<Entry<TableContent, String>> tableContent; - tableContent = Collections.emptySet(); - - // Generate the options used by this role - generateRoleDetails(div, "role-options-wrap", "Role Options", tableContent); - - // Close the div for this role - div._(); - } - } - - protected static <T> Function<Entry<String,T>,Entry<TableContent,T>> toTableContentFunction() { - return new Function<Entry<String,T>,Entry<TableContent,T>>() { - @Override - public Entry<TableContent,T> apply(@Nonnull Entry<String,T> input) { - return Maps.immutableEntry(new TableContent(input.getKey()), input.getValue()); - } - }; - } - - protected Map<String,RoleInstance> getContainerInstances(List<RoleInstance> roleInstances) { - Map<String,RoleInstance> map = Maps.newHashMapWithExpectedSize(roleInstances.size()); - for (RoleInstance roleInstance : roleInstances) { - // UUID is the containerId - map.put(roleInstance.id, roleInstance); - } - return map; - } - - /** - * Given a div, a name for this data, and some pairs of data, generate a nice HTML table. If contents is empty (of size zero), then a mesage will be printed - * that there were no items instead of an empty table. - * - */ - protected <T1 extends TableContent,T2> void generateRoleDetails(DIV<Hamlet> parent, String divSelector, String detailsName, Iterable<Entry<T1,T2>> contents) { - final DIV<DIV<Hamlet>> div = parent.div(divSelector).h3(BOLD, detailsName); - - int offset = 0; - TABLE<DIV<DIV<Hamlet>>> table = null; - TBODY<TABLE<DIV<DIV<Hamlet>>>> tbody = null; - for (Entry<T1,T2> content : contents) { - if (null == table) { - table = div.table("ui-widget-content ui-corner-bottom"); - tbody = table.tbody(); - } - - TR<TBODY<TABLE<DIV<DIV<Hamlet>>>>> row = tbody.tr(offset % 2 == 0 ? EVEN : ODD); - - // Defer to the implementation of the TableContent for what the cell should contain - content.getKey().printCell(row); - - // Only add the second column if the element is non-null - // This also lets us avoid making a second method if we're only making a one-column table - if (null != content.getValue()) { - row.td(content.getValue().toString()); - } - - row._(); - - offset++; - } - - // If we made a table, close it out - if (null != table) { - tbody._()._(); - } else { - // Otherwise, throw in a nice "no content" message - div.p("no-table-contents")._("None")._(); - } - - // Close out the initial div - div._(); - } - - /** - * Build a URL from the address:port and container ID directly to the NodeManager service - * @param nodeAddress - * @param containerId - * @return - */ - protected String buildNodeUrlForContainer(String nodeAddress, String containerId) { - StringBuilder sb = new StringBuilder(SCHEME.length() + nodeAddress.length() + PATH.length() + containerId.length()); - - sb.append(SCHEME).append(nodeAddress).append(PATH).append(containerId); - - return sb.toString(); - } - - /** - * Creates a table cell with the provided String as content. - */ - protected static class TableContent { - private String cell; - - public TableContent(String cell) { - this.cell = cell; - } - - public String getCell() { - return cell; - } - - /** - * Adds a td to the given tr. The tr is not closed - * @param tableRow - */ - public void printCell(TR<?> tableRow) { - tableRow.td(this.cell); - } - } - - /** - * Creates a table cell with an anchor to the given URL with the provided String as content. - */ - protected static class TableAnchorContent extends TableContent { - private String anchorUrl; - - public TableAnchorContent(String cell, String anchorUrl) { - super(cell); - this.anchorUrl = anchorUrl; - } - - /* (non-javadoc) - * @see org.apache.slider.server.appmaster.web.view.ContainerStatsBlock$TableContent#printCell() - */ - @Override - public void printCell(TR<?> tableRow) { - tableRow.td().a(anchorUrl, getCell())._(); - } - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java deleted file mode 100644 index c0a120d..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * 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.server.appmaster.web.view; - -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.types.ApplicationLivenessInformation; -import org.apache.slider.common.tools.SliderUtils; -import org.apache.slider.core.registry.docstore.ExportEntry; -import org.apache.slider.core.registry.docstore.PublishedExports; -import org.apache.slider.core.registry.docstore.PublishedExportsSet; -import org.apache.hadoop.yarn.service.metrics.ServiceMetrics; -import org.apache.slider.server.appmaster.state.RoleStatus; -import org.apache.slider.server.appmaster.web.WebAppApi; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map.Entry; -import java.util.Set; - -import static org.apache.slider.server.appmaster.web.rest.RestPaths.LIVE_COMPONENTS; - -/** - * The main content on the Slider AM web page - */ -public class IndexBlock extends SliderHamletBlock { - private static final Logger log = LoggerFactory.getLogger(IndexBlock.class); - - /** - * Message printed when application is at full size. - * - * {@value} - */ - public static final String ALL_CONTAINERS_ALLOCATED = "all containers allocated"; - - @Inject - public IndexBlock(WebAppApi slider) { - super(slider); - } - - @Override - protected void render(Block html) { - doIndex(html, getProviderName()); - } - - // An extra method to make testing easier since you can't make an instance of Block - @VisibleForTesting - protected void doIndex(Hamlet html, String providerName) { - String name = appState.getApplicationName(); - if (name != null && (name.startsWith(" ") || name.endsWith(" "))) { - name = "'" + name + "'"; - } - DIV<Hamlet> div = html.div("general_info") - .h1("index_header", - "Application: " + name); - - ApplicationLivenessInformation liveness = - appState.getApplicationLivenessInformation(); - String livestatus = liveness.allRequestsSatisfied - ? ALL_CONTAINERS_ALLOCATED - : String.format("Awaiting %d containers", liveness.requestsOutstanding); - Hamlet.TABLE<DIV<Hamlet>> table1 = div.table(); - table1.tr() - .td("Status") - .td(livestatus) - ._(); - table1.tr() - .td("Total number of containers") - .td(Integer.toString(appState.getNumOwnedContainers())) - ._(); - table1.tr() - .td("Create time: ") - .td("N/A") - ._(); - table1.tr() - .td("Running since: ") - .td("N/A") - ._(); - table1.tr() - .td("Time last flexed: ") - .td("N/A") - ._(); - table1.tr() - .td("Application storage path: ") - .td("N/A") - ._(); - table1.tr() - .td("Application configuration path: ") - .td("N/A") - ._(); - table1._(); - div._(); - div = null; - - DIV<Hamlet> containers = html.div("container_instances") - .h3("Component Instances"); - - int aaRoleWithNoSuitableLocations = 0; - int aaRoleWithOpenRequest = 0; - int roleWithOpenRequest = 0; - - Hamlet.TABLE<DIV<Hamlet>> table = containers.table(); - Hamlet.TR<Hamlet.THEAD<Hamlet.TABLE<DIV<Hamlet>>>> header = table.thead().tr(); - trb(header, "Component"); - trb(header, "Desired"); - trb(header, "Actual"); - trb(header, "Outstanding Requests"); - trb(header, "Failed"); - trb(header, "Failed to start"); - trb(header, "Placement"); - header._()._(); // tr & thead - - List<RoleStatus> roleStatuses = - new ArrayList<>(appState.getRoleStatusMap().values()); - Collections.sort(roleStatuses, new RoleStatus.CompareByName()); - for (RoleStatus status : roleStatuses) { - String roleName = status.getName(); - String nameUrl = apiPath(LIVE_COMPONENTS) + "/" + roleName; - String aatext; - if (status.isAntiAffinePlacement()) { - boolean aaRequestOutstanding = status.isAARequestOutstanding(); - int pending = (int)status.getAAPending(); - aatext = buildAADetails(aaRequestOutstanding, pending); - if (SliderUtils.isSet(status.getLabelExpression())) { - aatext += " (label: " + status.getLabelExpression() + ")"; - } - if (pending > 0 && !aaRequestOutstanding) { - aaRoleWithNoSuitableLocations ++; - } else if (aaRequestOutstanding) { - aaRoleWithOpenRequest++; - } - } else { - if (SliderUtils.isSet(status.getLabelExpression())) { - aatext = "label: " + status.getLabelExpression(); - } else { - aatext = ""; - } - if (status.getRequested() > 0) { - roleWithOpenRequest ++; - } - } - ServiceMetrics metrics = status.getComponentMetrics(); - table.tr() - .td().a(nameUrl, roleName)._() - .td(String.format("%d", metrics.containersDesired.value())) - .td(String.format("%d", metrics.containersRunning.value())) - .td(String.format("%d", metrics.containersRequested.value())) - .td(String.format("%d", metrics.containersFailed.value())) - .td(aatext) - ._(); - } - - // empty row for some more spacing - table.tr()._(); - // close table - table._(); - - containers._(); - containers = null; - - // some spacing - html.div()._(); - html.div()._(); - - DIV<Hamlet> diagnostics = html.div("diagnostics"); - - List<String> statusEntries = new ArrayList<>(0); - if (roleWithOpenRequest > 0) { - statusEntries.add(String.format("%d %s with requests unsatisfiable by cluster", - roleWithOpenRequest, plural(roleWithOpenRequest, "component"))); - } - if (aaRoleWithNoSuitableLocations > 0) { - statusEntries.add(String.format("%d anti-affinity %s no suitable nodes in the cluster", - aaRoleWithNoSuitableLocations, - plural(aaRoleWithNoSuitableLocations, "component has", "components have"))); - } - if (aaRoleWithOpenRequest > 0) { - statusEntries.add(String.format("%d anti-affinity %s with requests unsatisfiable by cluster", - aaRoleWithOpenRequest, - plural(aaRoleWithOpenRequest, "component has", "components have"))); - - } - if (!statusEntries.isEmpty()) { - diagnostics.h3("Diagnostics"); - Hamlet.TABLE<DIV<Hamlet>> diagnosticsTable = diagnostics.table(); - for (String entry : statusEntries) { - diagnosticsTable.tr().td(entry)._(); - } - diagnosticsTable._(); - } - diagnostics._(); - - DIV<Hamlet> provider_info = html.div("provider_info"); - provider_info.h3(providerName + " information"); - UL<Hamlet> ul = html.ul(); - //TODO render app/cluster status - ul._(); - provider_info._(); - - DIV<Hamlet> exports = html.div("exports"); - exports.h3("Exports"); - ul = html.ul(); - enumeratePublishedExports(appState.getPublishedExportsSet(), ul); - ul._(); - exports._(); - } - - @VisibleForTesting - String buildAADetails(boolean outstanding, int pending) { - return String.format("Anti-affinity:%s %d pending %s", - (outstanding ? " 1 active request and" : ""), - pending, plural(pending, "request")); - } - - private String plural(int n, String singular) { - return plural(n, singular, singular + "s"); - } - private String plural(int n, String singular, String plural) { - return n == 1 ? singular : plural; - } - - private void trb(Hamlet.TR tr, - String text) { - tr.td().b(text)._(); - } - - private String getProviderName() { - return "docker"; - } - - - protected void enumeratePublishedExports(PublishedExportsSet exports, UL<Hamlet> ul) { - for(String key : exports.keys()) { - PublishedExports export = exports.get(key); - LI<UL<Hamlet>> item = ul.li(); - item.span().$class("bold")._(export.description)._(); - UL sublist = item.ul(); - for (Entry<String, Set<ExportEntry>> entry : export.sortedEntries() - .entrySet()) { - if (SliderUtils.isNotEmpty(entry.getValue())) { - LI sublistItem = sublist.li()._(entry.getKey()); - for (ExportEntry exportEntry : entry.getValue()) { - sublistItem._(exportEntry.getValue()); - } - sublistItem._(); - } - } - sublist._(); - item._(); - } - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/NavBlock.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/NavBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/NavBlock.java deleted file mode 100644 index 069d386..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/NavBlock.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.server.appmaster.web.view; - -import com.google.inject.Inject; -import org.apache.slider.server.appmaster.web.WebAppApi; - -import static org.apache.slider.server.appmaster.web.SliderAMWebApp.*; -import static org.apache.slider.server.appmaster.web.rest.RestPaths.*; - -/** - * - */ -public class NavBlock extends SliderHamletBlock { - - @Inject - public NavBlock(WebAppApi slider) { - super(slider); - } - - @Override - protected void render(Block html) { - html. - div("#nav"). - h3("Slider"). - ul(). - li().a(this.prefix(), "Overview")._(). - li().a(relPath(CONTAINER_STATS), "Statistics")._(). - li().a(relPath(CLUSTER_SPEC), "Specification")._(). - li().a(rootPath(SYSTEM_METRICS_JSON), "Metrics")._(). - li().a(rootPath(SYSTEM_HEALTHCHECK), "Health")._(). - li().a(rootPath(SYSTEM_THREADS), "Threads")._(). - _() - .h3("REST API"). - ul(). - li().a(apiPath(MODEL_DESIRED), "Specified")._(). - li().a(apiPath(MODEL_RESOLVED), "Resolved")._(). - li().a(apiPath(LIVE_RESOURCES), "Resources")._(). - li().a(apiPath(LIVE_COMPONENTS), "Components")._(). - li().a(apiPath(LIVE_CONTAINERS), "Containers")._(). - li().a(apiPath(LIVE_NODES), "Nodes")._(). - li().a(apiPath(LIVE_STATISTICS), "Statistics")._(). - li().a(apiPath(LIVE_LIVENESS), "Liveness")._() - ._() - ._(); - } - -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/SliderHamletBlock.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/SliderHamletBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/SliderHamletBlock.java deleted file mode 100644 index 5f44bda..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/SliderHamletBlock.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.server.appmaster.web.view; - -import org.apache.hadoop.yarn.webapp.view.HtmlBlock; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; -import org.apache.slider.server.appmaster.web.WebAppApi; -import org.apache.slider.server.appmaster.web.rest.RestPaths; - -import static org.apache.hadoop.yarn.util.StringHelper.ujoin; -import static org.apache.slider.server.appmaster.web.rest.RestPaths.SLIDER_PATH_APPLICATION; - -/** - * Anything we want to share across slider hamlet blocks - */ -public abstract class SliderHamletBlock extends HtmlBlock { - - protected final StateAccessForProviders appState; - protected final RestPaths restPaths = new RestPaths(); - - public SliderHamletBlock(WebAppApi slider) { - this.appState = slider.getAppState(); - } - - protected String rootPath(String absolutePath) { - return root_url(absolutePath); - } - - protected String relPath(String... args) { - return ujoin(this.prefix(), args); - } - - protected String apiPath(String api) { - return root_url(SLIDER_PATH_APPLICATION, api); - } - -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/LoadedRoleHistory.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/LoadedRoleHistory.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/LoadedRoleHistory.java deleted file mode 100644 index 77408a5..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/LoadedRoleHistory.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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.server.avro; - -import org.apache.hadoop.fs.Path; -import org.apache.slider.common.tools.SliderUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The role history - */ -public class LoadedRoleHistory { - - private RoleHistoryHeader header; - - private Path path; - - public final Map<String, Integer> roleMap = new HashMap<>(); - - public final List<NodeEntryRecord> records = new ArrayList<>(); - - /** - * Add a record - * @param record - */ - public void add(NodeEntryRecord record) { - records.add(record); - } - - /** - * Number of loaded records - * @return - */ - public int size() { - return records.size(); - } - - public RoleHistoryHeader getHeader() { - return header; - } - - public void setHeader(RoleHistoryHeader header) { - this.header = header; - } - - public Path getPath() { - return path; - } - - public void setPath(Path path) { - this.path = path; - } - - public void buildMapping(Map<CharSequence, Integer> source) { - roleMap.clear(); - for (Map.Entry<CharSequence, Integer> entry : source.entrySet()) { - roleMap.put(SliderUtils.sequenceToString(entry.getKey()), - entry.getValue()); - } - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder( - "LoadedRoleHistory{"); - sb.append("path=").append(path); - sb.append("; number of roles=").append(roleMap.size()); - sb.append("; size=").append(size()); - sb.append('}'); - return sb.toString(); - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/NewerFilesFirst.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/NewerFilesFirst.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/NewerFilesFirst.java deleted file mode 100644 index 2e049cb..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/NewerFilesFirst.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.server.avro; - -import org.apache.hadoop.fs.Path; - -import java.io.Serializable; -import java.util.Comparator; - -/** - * Compare two filenames by name; the more recent one comes first - */ -public class NewerFilesFirst implements Comparator<Path>, Serializable { - - /** - * Takes the ordering of path names from the normal string comparison - * and negates it, so that names that come after other names in - * the string sort come before here - * @param o1 leftmost - * @param o2 rightmost - * @return positive if o1 > o2 - */ - @Override - public int compare(Path o1, Path o2) { - return (o2.getName().compareTo(o1.getName())); - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/OlderFilesFirst.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/OlderFilesFirst.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/OlderFilesFirst.java deleted file mode 100644 index 407aaa6..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/OlderFilesFirst.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.server.avro; - -import org.apache.hadoop.fs.Path; - -import java.io.Serializable; -import java.util.Comparator; - -/** - * Compare two filenames by name; the older ones comes first - */ -public class OlderFilesFirst implements Comparator<Path>, Serializable { - - /** - * Takes the ordering of path names from the normal string comparison - * and negates it, so that names that come after other names in - * the string sort come before here - * @param o1 leftmost - * @param o2 rightmost - * @return positive if o1 > o2 - */ - @Override - public int compare(Path o1, Path o2) { - return (o1.getName().compareTo(o2.getName())); - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/RoleHistoryWriter.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/RoleHistoryWriter.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/RoleHistoryWriter.java deleted file mode 100644 index 52553d0..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/avro/RoleHistoryWriter.java +++ /dev/null @@ -1,449 +0,0 @@ -/* - * 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.server.avro; - -import com.google.common.annotations.VisibleForTesting; -import org.apache.avro.AvroTypeException; -import org.apache.avro.Schema; -import org.apache.avro.io.DatumReader; -import org.apache.avro.io.DatumWriter; -import org.apache.avro.io.Decoder; -import org.apache.avro.io.DecoderFactory; -import org.apache.avro.io.Encoder; -import org.apache.avro.io.EncoderFactory; -import org.apache.avro.specific.SpecificDatumReader; -import org.apache.avro.specific.SpecificDatumWriter; -import org.apache.hadoop.fs.FSDataInputStream; -import org.apache.hadoop.fs.FSDataOutputStream; -import org.apache.hadoop.fs.FileStatus; -import org.apache.hadoop.fs.FileSystem; -import org.apache.hadoop.fs.GlobFilter; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.fs.PathFilter; -import org.apache.hadoop.yarn.service.conf.SliderKeys; -import org.apache.slider.common.tools.SliderUtils; -import org.apache.slider.core.exceptions.BadConfigException; -import org.apache.slider.server.appmaster.state.NodeEntry; -import org.apache.slider.server.appmaster.state.NodeInstance; -import org.apache.slider.server.appmaster.state.RoleHistory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.EOFException; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.ListIterator; -import java.util.Locale; -import java.util.Map; - -/** - * Write out the role history to an output stream. - */ -public class RoleHistoryWriter { - protected static final Logger log = - LoggerFactory.getLogger(RoleHistoryWriter.class); - - /** - * Although Avro is designed to handle some changes, we still keep a version - * marker in the file to catch changes that are fundamentally incompatible - * at the semantic level -changes that require either a different - * parser or get rejected outright. - */ - public static final int ROLE_HISTORY_VERSION = 0x01; - - /** - * Write out the history. - * This does not update the history's dirty/savetime fields - * - * @param out outstream - * @param history history - * @param savetime time in millis for the save time to go in as a record - * @return no of records written - * @throws IOException IO failures - */ - public long write(OutputStream out, RoleHistory history, long savetime) - throws IOException { - try { - DatumWriter<RoleHistoryRecord> writer = - new SpecificDatumWriter<>(RoleHistoryRecord.class); - - RoleHistoryRecord record = createHeaderRecord(savetime, history); - int roles = history.getRoleSize(); - Schema schema = record.getSchema(); - Encoder encoder = EncoderFactory.get().jsonEncoder(schema, out); - writer.write(record, encoder); - // now write the rolemap record - writer.write(createRolemapRecord(history), encoder); - long count = 0; - //now for every role history entry, write out its record - Collection<NodeInstance> instances = history.cloneNodemap().values(); - for (NodeInstance instance : instances) { - for (int role = 0; role < roles; role++) { - NodeEntry nodeEntry = instance.get(role); - - if (nodeEntry != null) { - NodeEntryRecord ner = build(nodeEntry, role, instance.hostname); - record = new RoleHistoryRecord(ner); - writer.write(record, encoder); - count++; - } - } - } - // footer - RoleHistoryFooter footer = new RoleHistoryFooter(); - footer.setCount(count); - writer.write(new RoleHistoryRecord(footer), encoder); - encoder.flush(); - return count; - } finally { - out.close(); - } - } - - /** - * Create the header record - * @param savetime time of save - * @param history history - * @return a record to place at the head of the file - */ - private RoleHistoryRecord createHeaderRecord(long savetime, RoleHistory history) { - RoleHistoryHeader header = new RoleHistoryHeader(); - header.setVersion(ROLE_HISTORY_VERSION); - header.setSaved(savetime); - header.setSavedx(Long.toHexString(savetime)); - header.setSavedate(SliderUtils.toGMTString(savetime)); - header.setRoles(history.getRoleSize()); - return new RoleHistoryRecord(header); - } - - /** - * Create the rolemap record - * @param history history - * @return a record to insert into the file - */ - private RoleHistoryRecord createRolemapRecord(RoleHistory history) { - RoleHistoryMapping entry = new RoleHistoryMapping(); - Map<CharSequence, Integer> mapping = history.buildMappingForHistoryFile(); - entry.setRolemap(mapping); - return new RoleHistoryRecord(entry); - } - - /** - * Write the history information to a file - * - * @param fs filesystem - * @param path path - * @param overwrite overwrite flag - * @param history history - * @param savetime time in millis for the save time to go in as a record - * @return no of records written - * @throws IOException IO failures - */ - public long write(FileSystem fs, - Path path, - boolean overwrite, - RoleHistory history, - long savetime) - throws IOException { - FSDataOutputStream out = fs.create(path, overwrite); - return write(out, history, savetime); - } - - - /** - * Create the filename for a history file - * @param time time value - * @return a filename such that later filenames sort later in the directory - */ - public Path createHistoryFilename(Path historyPath, long time) { - String filename = String.format(Locale.ENGLISH, - SliderKeys.HISTORY_FILENAME_CREATION_PATTERN, - time); - Path path = new Path(historyPath, filename); - return path; - } - - /** - * Build a {@link NodeEntryRecord} from a node entry; include whether - * the node is in use and when it was last used. - * @param entry entry count - * @param role role index - * @param hostname name - * @return the record - */ - private NodeEntryRecord build(NodeEntry entry, int role, String hostname) { - NodeEntryRecord record = new NodeEntryRecord( - hostname, role, entry.getLive() > 0, entry.getLastUsed() - ); - return record; - } - - /** - * Read a history, returning one that is ready to have its onThaw() - * method called - * @param in input source - * @return no. of entries read - * @throws IOException problems - */ - public LoadedRoleHistory read(InputStream in) throws - IOException, - BadConfigException { - try { - LoadedRoleHistory loadedRoleHistory = new LoadedRoleHistory(); - DatumReader<RoleHistoryRecord> reader = - new SpecificDatumReader<>(RoleHistoryRecord.class); - Decoder decoder = - DecoderFactory.get().jsonDecoder(RoleHistoryRecord.getClassSchema(), - in); - - //read header : no entry -> EOF - RoleHistoryRecord record = reader.read(null, decoder); - if (record == null) { - throw new IOException("Role History Header not found at start of file."); - } - Object entry = record.getEntry(); - if (!(entry instanceof RoleHistoryHeader)) { - throw new IOException("Role History Header not found at start of file"); - } - RoleHistoryHeader header = (RoleHistoryHeader) entry; - if (header.getVersion() != ROLE_HISTORY_VERSION) { - throw new IOException( - String.format("Can't read role file version %04x -need %04x", - header.getVersion(), - ROLE_HISTORY_VERSION)); - } - loadedRoleHistory.setHeader(header); - RoleHistoryFooter footer = null; - int records = 0; - //go through reading data - try { - while (footer == null) { - record = reader.read(null, decoder); - if (record == null) { - throw new IOException("Null record after " + records + " records"); - } - entry = record.getEntry(); - - if (entry instanceof RoleHistoryHeader) { - throw new IOException("Duplicate Role History Header found"); - } else if (entry instanceof RoleHistoryMapping) { - // role history mapping entry - if (!loadedRoleHistory.roleMap.isEmpty()) { - // duplicate role maps are viewed as something to warn over, rather than fail - log.warn("Duplicate role map; ignoring"); - } else { - RoleHistoryMapping historyMapping = (RoleHistoryMapping) entry; - loadedRoleHistory.buildMapping(historyMapping.getRolemap()); - } - } else if (entry instanceof NodeEntryRecord) { - // normal record - records++; - NodeEntryRecord nodeEntryRecord = (NodeEntryRecord) entry; - loadedRoleHistory.add(nodeEntryRecord); - } else if (entry instanceof RoleHistoryFooter) { - //tail end of the file - footer = (RoleHistoryFooter) entry; - } else { - // this is to handle future versions, such as when rolling back - // from a later version of slider - log.warn("Discarding unknown record {}", entry); - } - } - } catch (EOFException e) { - EOFException ex = new EOFException( - "End of file reached after " + records + " records"); - ex.initCause(e); - throw ex; - } - // at this point there should be no data left. - // check by reading and expecting a -1 - if (in.read() > 0) { - // footer is in stream before the last record - throw new EOFException( - "File footer reached before end of file -after " + records + - " records"); - } - if (records != footer.getCount()) { - log.warn("mismatch between no of records saved {} and number read {}", - footer.getCount(), records); - } - return loadedRoleHistory; - } finally { - in.close(); - } - - } - - /** - * Read a role history from a path in a filesystem - * @param fs filesystem - * @param path path to the file - * @return the records read - * @throws IOException any problem - */ - public LoadedRoleHistory read(FileSystem fs, Path path) - throws IOException, BadConfigException { - FSDataInputStream instream = fs.open(path); - return read(instream); - } - - /** - * Read from a resource in the classpath -used for testing - * @param resource resource - * @return the records read - * @throws IOException any problem - */ - public LoadedRoleHistory read(String resource) - throws IOException, BadConfigException { - - return read(this.getClass().getClassLoader().getResourceAsStream(resource)); - } - - - /** - * Find all history entries in a dir. The dir is created if it is - * not already defined. - * - * The scan uses the match pattern {@link SliderKeys#HISTORY_FILENAME_MATCH_PATTERN} - * while dropping empty files and directories which match the pattern. - * The list is then sorted with a comparator that sorts on filename, - * relying on the filename of newer created files being later than the old ones. - * - * - * - * @param fs filesystem - * @param dir dir to scan - * @param includeEmptyFiles should empty files be included in the result? - * @return a possibly empty list - * @throws IOException IO problems - * @throws FileNotFoundException if the target dir is actually a path - */ - public List<Path> findAllHistoryEntries(FileSystem fs, - Path dir, - boolean includeEmptyFiles) throws IOException { - assert fs != null; - assert dir != null; - if (!fs.exists(dir)) { - fs.mkdirs(dir); - } else if (!fs.isDirectory(dir)) { - throw new FileNotFoundException("Not a directory " + dir.toString()); - } - - PathFilter filter = new GlobFilter(SliderKeys.HISTORY_FILENAME_GLOB_PATTERN); - FileStatus[] stats = fs.listStatus(dir, filter); - List<Path> paths = new ArrayList<Path>(stats.length); - for (FileStatus stat : stats) { - log.debug("Possible entry: {}", stat.toString()); - if (stat.isFile() && (includeEmptyFiles || stat.getLen() > 0)) { - paths.add(stat.getPath()); - } - } - sortHistoryPaths(paths); - return paths; - } - - @VisibleForTesting - public static void sortHistoryPaths(List<Path> paths) { - Collections.sort(paths, new NewerFilesFirst()); - } - - /** - * Iterate through the paths until one can be loaded - * @param paths paths to load - * @return the loaded history including the path -or null if all failed to load - */ - public LoadedRoleHistory attemptToReadHistory(FileSystem fileSystem, - List<Path> paths) - throws BadConfigException { - ListIterator<Path> pathIterator = paths.listIterator(); - boolean success = false; - LoadedRoleHistory history = null; - while (!success && pathIterator.hasNext()) { - Path path = pathIterator.next(); - try { - history = read(fileSystem, path); - //success - success = true; - history.setPath(path); - } catch (IOException e) { - log.info("Failed to read {}", path, e); - } catch (AvroTypeException e) { - log.warn("Failed to parse {}", path, e); - } catch (Exception e) { - // low level event logged @ warn level - log.warn("Exception while reading {}", path, e); - } - } - return history; - } - - /** - * Try to load the history from a directory -a failure to load a specific - * file is downgraded to a log and the next older path attempted instead - * @param fs filesystem - * @param dir dir to load from - * @return the history loaded, including the path - * @throws IOException if indexing the history directory fails. - */ - public LoadedRoleHistory loadFromHistoryDir(FileSystem fs, Path dir) - throws IOException, BadConfigException { - assert fs != null: "null filesystem"; - List<Path> entries = findAllHistoryEntries(fs, dir, false); - return attemptToReadHistory(fs, entries); - } - - /** - * Delete all old history entries older than the one we want to keep. This - * uses the filename ordering to determine age, not timestamps - * @param fileSystem filesystem - * @param keep path to keep -used in thresholding the files - * @return the number of files deleted - * @throws FileNotFoundException if the path to keep is not present (safety - * check to stop the entire dir being purged) - * @throws IOException IO problems - */ - public int purgeOlderHistoryEntries(FileSystem fileSystem, Path keep) - throws IOException { assert fileSystem != null : "null filesystem"; - if (!fileSystem.exists(keep)) { - throw new FileNotFoundException(keep.toString()); - } - Path dir = keep.getParent(); - log.debug("Purging entries in {} up to {}", dir, keep); - List<Path> paths = findAllHistoryEntries(fileSystem, dir, true); - Collections.sort(paths, new OlderFilesFirst()); - int deleteCount = 0; - for (Path path : paths) { - if (path.equals(keep)) { - break; - } else { - log.debug("Deleting {}", path); - deleteCount++; - fileSystem.delete(path, false); - } - } - return deleteCount; - } - -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/HttpProbe.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/HttpProbe.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/HttpProbe.java deleted file mode 100644 index 5eba622..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/HttpProbe.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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.server.servicemonitor; - -import org.apache.commons.lang.StringUtils; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.yarn.api.records.ContainerStatus; -import org.apache.hadoop.yarn.service.compinstance.ComponentInstance; -import org.apache.slider.common.tools.SliderUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.Map; - -public class HttpProbe extends Probe { - protected static final Logger log = LoggerFactory.getLogger(HttpProbe.class); - - private static final String HOST_TOKEN = "${THIS_HOST}"; - - private final String urlString; - private final int timeout; - private final int min, max; - - - public HttpProbe(String url, int timeout, int min, int max, Configuration - conf) { - super("Http probe of " + url + " [" + min + "-" + max + "]", conf); - this.urlString = url; - this.timeout = timeout; - this.min = min; - this.max = max; - } - - public static HttpProbe create(Map<String, String> props) - throws IOException { - String urlString = getProperty(props, WEB_PROBE_URL, null); - new URL(urlString); - int timeout = getPropertyInt(props, WEB_PROBE_CONNECT_TIMEOUT, - WEB_PROBE_CONNECT_TIMEOUT_DEFAULT); - int minSuccess = getPropertyInt(props, WEB_PROBE_MIN_SUCCESS, - WEB_PROBE_MIN_SUCCESS_DEFAULT); - int maxSuccess = getPropertyInt(props, WEB_PROBE_MAX_SUCCESS, - WEB_PROBE_MAX_SUCCESS_DEFAULT); - return new HttpProbe(urlString, timeout, minSuccess, maxSuccess, null); - } - - - private static HttpURLConnection getConnection(URL url, int timeout) throws - IOException { - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setInstanceFollowRedirects(true); - connection.setConnectTimeout(timeout); - return connection; - } - - @Override - public ProbeStatus ping(ComponentInstance instance) { - ProbeStatus status = new ProbeStatus(); - ContainerStatus containerStatus = instance.getContainerStatus(); - if (containerStatus == null || SliderUtils.isEmpty(containerStatus.getIPs()) - || StringUtils.isEmpty(containerStatus.getHost())) { - status.fail(this, new IOException("IP is not available yet")); - return status; - } - - String ip = containerStatus.getIPs().get(0); - HttpURLConnection connection = null; - try { - URL url = new URL(urlString.replace(HOST_TOKEN, ip)); - connection = getConnection(url, this.timeout); - int rc = connection.getResponseCode(); - if (rc < min || rc > max) { - String error = "Probe " + url + " error code: " + rc; - log.info(error); - status.fail(this, - new IOException(error)); - } else { - status.succeed(this); - } - } catch (Throwable e) { - String error = "Probe " + urlString + " failed for IP " + ip + ": " + e; - log.info(error, e); - status.fail(this, - new IOException(error, e)); - } finally { - if (connection != null) { - connection.disconnect(); - } - } - return status; - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/LogEntryBuilder.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/LogEntryBuilder.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/LogEntryBuilder.java deleted file mode 100644 index a1ad44f..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/LogEntryBuilder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.server.servicemonitor; - -/** - * Build up log entries for ease of splunk - */ -public class LogEntryBuilder { - - private final StringBuilder builder = new StringBuilder(); - - public LogEntryBuilder() { - } - - public LogEntryBuilder(String text) { - elt(text); - } - - - public LogEntryBuilder(String name, Object value) { - entry(name, value); - } - - public LogEntryBuilder elt(String text) { - addComma(); - builder.append(text); - return this; - } - - public LogEntryBuilder elt(String name, Object value) { - addComma(); - entry(name, value); - return this; - } - - private void addComma() { - if (!isEmpty()) { - builder.append(", "); - } - } - - private void entry(String name, Object value) { - builder.append(name).append('='); - if (value != null) { - builder.append('"').append(value.toString()).append('"'); - } else { - builder.append("null"); - } - } - - @Override - public String toString() { - return builder.toString(); - } - - private boolean isEmpty() { - return builder.length() == 0; - } - - -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/MonitorKeys.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/MonitorKeys.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/MonitorKeys.java deleted file mode 100644 index e97ab43..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/MonitorKeys.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.server.servicemonitor; - -/** - * Config keys for monitoring - */ -public interface MonitorKeys { - - /** - * Port probing key : port to attempt to create a TCP connection to {@value}. - */ - String PORT_PROBE_PORT = "port"; - /** - * Port probing key : timeout for the the connection attempt {@value}. - */ - String PORT_PROBE_CONNECT_TIMEOUT = "timeout"; - /** - * Port probing default : timeout for the connection attempt {@value}. - */ - int PORT_PROBE_CONNECT_TIMEOUT_DEFAULT = 1000; - - /** - * Web probing key : URL {@value}. - */ - String WEB_PROBE_URL = "url"; - /** - * Web probing key : min success code {@value}. - */ - String WEB_PROBE_MIN_SUCCESS = "min.success"; - /** - * Web probing key : max success code {@value}. - */ - String WEB_PROBE_MAX_SUCCESS = "max.success"; - /** - * Web probing default : min successful response code {@value}. - */ - int WEB_PROBE_MIN_SUCCESS_DEFAULT = 200; - /** - * Web probing default : max successful response code {@value}. - */ - int WEB_PROBE_MAX_SUCCESS_DEFAULT = 299; - /** - * Web probing key : timeout for the connection attempt {@value} - */ - String WEB_PROBE_CONNECT_TIMEOUT = "timeout"; - /** - * Port probing default : timeout for the connection attempt {@value}. - */ - int WEB_PROBE_CONNECT_TIMEOUT_DEFAULT = 1000; -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/2b3aff2f/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/MonitorUtils.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/MonitorUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/MonitorUtils.java deleted file mode 100644 index 1e5c94c..0000000 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/servicemonitor/MonitorUtils.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * 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.server.servicemonitor; - -import org.apache.slider.api.resource.ReadinessCheck; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Formatter; -import java.util.Locale; - -/** - * Various utils to work with the monitor - */ -public final class MonitorUtils { - protected static final Logger LOG = LoggerFactory.getLogger(MonitorUtils - .class); - - private MonitorUtils() { - } - - public static String toPlural(int val) { - return val != 1 ? "s" : ""; - } - - /** - * Convert milliseconds to human time -the exact format is unspecified - * @param milliseconds a time in milliseconds - * @return a time that is converted to human intervals - */ - public static String millisToHumanTime(long milliseconds) { - StringBuilder sb = new StringBuilder(); - // Send all output to the Appendable object sb - Formatter formatter = new Formatter(sb, Locale.US); - - long s = Math.abs(milliseconds / 1000); - long m = Math.abs(milliseconds % 1000); - if (milliseconds > 0) { - formatter.format("%d.%03ds", s, m); - } else if (milliseconds == 0) { - formatter.format("0"); - } else { - formatter.format("-%d.%03ds", s, m); - } - return sb.toString(); - } - - public static Probe getProbe(ReadinessCheck readinessCheck) { - if (readinessCheck == null) { - return null; - } - if (readinessCheck.getType() == null) { - return null; - } - try { - switch (readinessCheck.getType()) { - case HTTP: - return HttpProbe.create(readinessCheck.getProps()); - case PORT: - return PortProbe.create(readinessCheck.getProps()); - default: - return null; - } - } catch (Throwable t) { - throw new IllegalArgumentException("Error creating readiness check " + - t); - } - } -} --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org