http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResouceContentCacheFactory.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResouceContentCacheFactory.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResouceContentCacheFactory.java deleted file mode 100644 index 2facf16..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResouceContentCacheFactory.java +++ /dev/null @@ -1,63 +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.application; - -import org.apache.slider.server.appmaster.state.StateAccessForProviders; -import org.apache.slider.server.appmaster.web.rest.application.resources.AggregateModelRefresher; -import org.apache.slider.server.appmaster.web.rest.application.resources.AppconfRefresher; -import org.apache.slider.server.appmaster.web.rest.application.resources.CachedContent; -import org.apache.slider.server.appmaster.web.rest.application.resources.ContentCache; -import org.apache.slider.server.appmaster.web.rest.application.resources.LiveComponentsRefresher; -import org.apache.slider.server.appmaster.web.rest.application.resources.LiveContainersRefresher; -import org.apache.slider.server.appmaster.web.rest.application.resources.LiveNodesRefresher; -import org.apache.slider.server.appmaster.web.rest.application.resources.LiveResourcesRefresher; -import org.apache.slider.server.appmaster.web.rest.application.resources.LiveStatisticsRefresher; - -import static org.apache.slider.server.appmaster.web.rest.RestPaths.*; - -public class ApplicationResouceContentCacheFactory { - public static final int LIFESPAN = 500; - - /** - * Build the content cache - * @param state state view - */ - public static ContentCache createContentCache( - StateAccessForProviders state) { - ContentCache cache = new ContentCache(); - cache.put(LIVE_RESOURCES, new CachedContent<>(LIFESPAN, new LiveResourcesRefresher(state))); - cache.put(LIVE_CONTAINERS, new CachedContent<>(LIFESPAN, new LiveContainersRefresher(state))); - cache.put(LIVE_COMPONENTS, new CachedContent<>(LIFESPAN, new LiveComponentsRefresher(state))); - cache.put(LIVE_NODES, new CachedContent<>(LIFESPAN, new LiveNodesRefresher(state))); - cache.put(MODEL_DESIRED, - new CachedContent<>(LIFESPAN, new AggregateModelRefresher(state, false))); - cache.put(MODEL_RESOLVED, - new CachedContent<>(LIFESPAN, new AggregateModelRefresher(state, true))); - cache.put(MODEL_RESOLVED_APPCONF, - new CachedContent<>(LIFESPAN, new AppconfRefresher(state, false, false))); - cache.put(MODEL_RESOLVED_RESOURCES, - new CachedContent<>(LIFESPAN, new AppconfRefresher(state, false, true))); - cache.put(MODEL_DESIRED_APPCONF, - new CachedContent<>(LIFESPAN, new AppconfRefresher(state, true, false))); - cache.put(MODEL_DESIRED_RESOURCES, - new CachedContent<>(LIFESPAN, new AppconfRefresher(state, true, true))); - cache.put(LIVE_STATISTICS, new CachedContent<>(LIFESPAN, new LiveStatisticsRefresher(state))); - return cache; - } -}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java deleted file mode 100644 index 52068d6..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java +++ /dev/null @@ -1,516 +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.application; - -import com.google.common.collect.Lists; -import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; -import org.apache.hadoop.yarn.webapp.BadRequestException; -import org.apache.hadoop.yarn.webapp.NotFoundException; -import org.apache.slider.api.types.ApplicationLivenessInformation; -import org.apache.slider.api.types.ComponentInformation; -import org.apache.slider.api.types.ContainerInformation; -import org.apache.slider.api.types.NodeInformation; -import org.apache.slider.api.types.NodeInformationList; -import org.apache.slider.core.conf.AggregateConf; -import org.apache.slider.core.conf.ConfTree; -import org.apache.slider.core.exceptions.NoSuchNodeException; -import org.apache.slider.core.persist.ConfTreeSerDeser; -import org.apache.slider.server.appmaster.actions.ActionFlexCluster; -import org.apache.slider.server.appmaster.actions.AsyncAction; -import org.apache.slider.server.appmaster.actions.QueueAccess; -import org.apache.slider.server.appmaster.state.RoleInstance; -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 static org.apache.slider.server.appmaster.web.rest.RestPaths.*; - -import org.apache.slider.server.appmaster.web.rest.application.actions.RestActionStop; -import org.apache.slider.server.appmaster.web.rest.application.actions.StopResponse; -import org.apache.slider.server.appmaster.web.rest.application.resources.ContentCache; -import org.apache.slider.server.appmaster.web.rest.application.actions.RestActionPing; -import org.apache.slider.api.types.PingInformation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.inject.Singleton; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.HEAD; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -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 static javax.ws.rs.core.MediaType.*; - -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -@Singleton -@SuppressWarnings("unchecked") -public class ApplicationResource extends AbstractSliderResource { - private static final Logger log = - LoggerFactory.getLogger(ApplicationResource.class); - - public static final List<String> LIVE_ENTRIES = toJsonList("resources", - "containers", - "components", - "nodes", - "statistics", - "internal"); - - public static final List<String> ROOT_ENTRIES = - toJsonList("model", "live", "actions"); - - public static final List<String> MODEL_ENTRIES = - toJsonList("desired", "resolved"); - - /** - * This is the cache of all content ... each entry is - * designed to be self-refreshing on get operations, - * so is never very out of date, yet many GETs don't - * overload the rest of the system. - */ - private final ContentCache cache; - private final StateAccessForProviders state; - private final QueueAccess actionQueues; - - public ApplicationResource(WebAppApi slider) { - super(slider); - state = slider.getAppState(); - cache = slider.getContentCache(); - actionQueues = slider.getQueues(); - } - - /** - * Build a new JSON-marshallable list of string elements - * @param elements elements - * @return something that can be returned - */ - private static List<String> toJsonList(String... elements) { - return Lists.newArrayList(elements); - } - - @GET - @Path("/") - @Produces({APPLICATION_JSON}) - public List<String> getRoot() { - markGet(SLIDER_SUBPATH_APPLICATION); - return ROOT_ENTRIES; - } - - /** - * Enum model values: desired and resolved - * @return the desired and resolved model - */ - @GET - @Path(MODEL) - @Produces({APPLICATION_JSON}) - public List<String> getModel() { - markGet(SLIDER_SUBPATH_APPLICATION, MODEL); - return MODEL_ENTRIES; - } - - @GET - @Path(MODEL_DESIRED) - @Produces({APPLICATION_JSON}) - public AggregateConf getModelDesired() { - markGet(SLIDER_SUBPATH_APPLICATION, MODEL_DESIRED); - return lookupAggregateConf(MODEL_DESIRED); - } - - @GET - @Path(MODEL_DESIRED_APPCONF) - @Produces({APPLICATION_JSON}) - public ConfTree getModelDesiredAppconf() { - markGet(SLIDER_SUBPATH_APPLICATION, MODEL_DESIRED_APPCONF); - return lookupConfTree(MODEL_DESIRED_APPCONF); - } - - @GET - @Path(MODEL_DESIRED_RESOURCES) - @Produces({APPLICATION_JSON}) - public ConfTree getModelDesiredResources() { - markGet(SLIDER_SUBPATH_APPLICATION, MODEL_DESIRED_RESOURCES); - return lookupConfTree(MODEL_DESIRED_RESOURCES); - } - -/* - @PUT - @Path(MODEL_DESIRED_RESOURCES) -// @Consumes({APPLICATION_JSON, TEXT_PLAIN}) - @Consumes({TEXT_PLAIN}) - @Produces({APPLICATION_JSON}) -*/ - public ConfTree setModelDesiredResources( - String json) { - markPut(SLIDER_SUBPATH_APPLICATION, MODEL_DESIRED_RESOURCES); - int size = json != null ? json.length() : 0; - log.info("PUT {} {} bytes:\n{}", MODEL_DESIRED_RESOURCES, - size, - json); - if (size == 0) { - log.warn("No JSON in PUT request; rejecting"); - throw new BadRequestException("No JSON in PUT"); - } - - try { - ConfTreeSerDeser serDeser = new ConfTreeSerDeser(); - ConfTree updated = serDeser.fromJson(json); - queue(new ActionFlexCluster("flex", - 1, TimeUnit.MILLISECONDS, - updated)); - // return the updated value, even though it potentially hasn't yet - // been executed - return updated; - } catch (Exception e) { - throw buildException("PUT to "+ MODEL_DESIRED_RESOURCES , e); - } - } - @PUT - @Path(MODEL_DESIRED_RESOURCES) - @Consumes({APPLICATION_JSON}) - @Produces({APPLICATION_JSON}) - public ConfTree setModelDesiredResources( - ConfTree updated) { - try { - queue(new ActionFlexCluster("flex", - 1, TimeUnit.MILLISECONDS, - updated)); - // return the updated value, even though it potentially hasn't yet - // been executed - return updated; - } catch (Exception e) { - throw buildException("PUT to "+ MODEL_DESIRED_RESOURCES , e); - } - } - - - - @GET - @Path(MODEL_RESOLVED) - @Produces({APPLICATION_JSON}) - public AggregateConf getModelResolved() { - markGet(SLIDER_SUBPATH_APPLICATION, MODEL_RESOLVED); - return lookupAggregateConf(MODEL_RESOLVED); - } - - @GET - @Path(MODEL_RESOLVED_APPCONF) - @Produces({APPLICATION_JSON}) - public ConfTree getModelResolvedAppconf() { - markGet(SLIDER_SUBPATH_APPLICATION, MODEL_RESOLVED_APPCONF); - return lookupConfTree(MODEL_RESOLVED_APPCONF); - } - - @GET - @Path(MODEL_RESOLVED_RESOURCES) - @Produces({APPLICATION_JSON}) - public ConfTree getModelResolvedResources() { - markGet(SLIDER_SUBPATH_APPLICATION, MODEL_RESOLVED_RESOURCES); - return lookupConfTree(MODEL_RESOLVED_RESOURCES); - } - - @GET - @Path(LIVE) - @Produces({APPLICATION_JSON}) - public List<String> getLive() { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE); - return LIVE_ENTRIES; - } - - @GET - @Path(LIVE_RESOURCES) - @Produces({APPLICATION_JSON}) - public ConfTree getLiveResources() { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_RESOURCES); - return lookupConfTree(LIVE_RESOURCES); - } - - @GET - @Path(LIVE_CONTAINERS) - @Produces({APPLICATION_JSON}) - public Map<String, ContainerInformation> getLiveContainers() { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_CONTAINERS); - try { - return (Map<String, ContainerInformation>)cache.lookup( - LIVE_CONTAINERS); - } catch (Exception e) { - throw buildException(LIVE_CONTAINERS, e); - } - } - - @GET - @Path(LIVE_CONTAINERS + "/{containerId}") - @Produces({APPLICATION_JSON}) - public ContainerInformation getLiveContainer( - @PathParam("containerId") String containerId) { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_CONTAINERS); - try { - RoleInstance id = state.getLiveInstanceByContainerID(containerId); - return id.serialize(); - } catch (NoSuchNodeException e) { - throw new NotFoundException("Unknown container: " + containerId); - } catch (Exception e) { - throw buildException(LIVE_CONTAINERS + "/"+ containerId, e); - } - } - - @GET - @Path(LIVE_COMPONENTS) - @Produces({APPLICATION_JSON}) - public Map<String, ComponentInformation> getLiveComponents() { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_COMPONENTS); - try { - return (Map<String, ComponentInformation>) cache.lookup(LIVE_COMPONENTS); - } catch (Exception e) { - throw buildException(LIVE_COMPONENTS, e); - } - } - - @GET - @Path(LIVE_COMPONENTS + "/{component}") - @Produces({APPLICATION_JSON}) - public ComponentInformation getLiveComponent( - @PathParam("component") String component) { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_COMPONENTS); - try { - return state.getComponentInformation(component); - } catch (YarnRuntimeException e) { - throw new NotFoundException("Unknown component: " + component); - } catch (Exception e) { - throw buildException(LIVE_CONTAINERS +"/" + component, e); - } - } - - /** - * Liveness information for the application as a whole - * @return snapshot of liveness - */ - @GET - @Path(LIVE_LIVENESS) - @Produces({APPLICATION_JSON}) - public ApplicationLivenessInformation getLivenessInformation() { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_LIVENESS); - try { - return state.getApplicationLivenessInformation(); - } catch (Exception e) { - throw buildException(LIVE_CONTAINERS, e); - } - } - -/* -TODO: decide what structure to return here, then implement - - @GET - @Path(LIVE_LIVENESS + "/{component}") - @Produces({APPLICATION_JSON}) - public ApplicationLivenessInformation getLivenessForComponent( - @PathParam("component") String component) { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_COMPONENTS); - try { - RoleStatus roleStatus = state.lookupRoleStatus(component); - ApplicationLivenessInformation info = new ApplicationLivenessInformation(); - info.requested = roleStatus.getRequested(); - info.allRequestsSatisfied = info.requested == 0; - return info; - } catch (YarnRuntimeException e) { - throw new NotFoundException("Unknown component: " + component); - } catch (Exception e) { - throw buildException(LIVE_LIVENESS + "/" + component, e); - } - } -*/ - - - @GET - @Path(LIVE_NODES) - @Produces({APPLICATION_JSON}) - public NodeInformationList getLiveNodes() { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_COMPONENTS); - try { - return (NodeInformationList) cache.lookup(LIVE_NODES); - } catch (Exception e) { - throw buildException(LIVE_COMPONENTS, e); - } - } - - @GET - @Path(LIVE_NODES + "/{hostname}") - @Produces({APPLICATION_JSON}) - public NodeInformation getLiveNode(@PathParam("hostname") String hostname) { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_COMPONENTS); - try { - NodeInformation ni = state.getNodeInformation(hostname); - if (ni != null) { - return ni; - } else { - throw new NotFoundException("Unknown node: " + hostname); - } - } catch (NotFoundException e) { - throw e; - } catch (Exception e) { - throw buildException(LIVE_COMPONENTS + "/" + hostname, e); - } - } - - /** - * Statistics of the application - * @return snapshot statistics - */ - @GET - @Path(LIVE_STATISTICS) - @Produces({APPLICATION_JSON}) - public Map<String, Integer> getLiveStatistics() { - markGet(SLIDER_SUBPATH_APPLICATION, LIVE_LIVENESS); - try { - return (Map<String, Integer>) cache.lookup(LIVE_STATISTICS); - } catch (Exception e) { - throw buildException(LIVE_STATISTICS, e); - } - } - - /** - * Helper method; look up an aggregate configuration in the cache from - * a key, or raise an exception - * @param key key to resolve - * @return the configuration - * @throws WebApplicationException on a failure - */ - protected AggregateConf lookupAggregateConf(String key) { - try { - return (AggregateConf) cache.lookup(key); - } catch (Exception e) { - throw buildException(key, e); - } - } - - - /** - * Helper method; look up an conf tree in the cache from - * a key, or raise an exception - * @param key key to resolve - * @return the configuration - * @throws WebApplicationException on a failure - */ - protected ConfTree lookupConfTree(String key) { - try { - return (ConfTree) cache.lookup(key); - } catch (Exception e) { - throw buildException(key, e); - } - } - - /* ************************************************************************ - - ACTION PING - - **************************************************************************/ - - @GET - @Path(ACTION_PING) - @Produces({APPLICATION_JSON}) - public PingInformation actionPingGet(@Context HttpServletRequest request, - @Context UriInfo uriInfo) { - markGet(SLIDER_SUBPATH_APPLICATION, ACTION_PING); - return new RestActionPing().ping(request, uriInfo, ""); - } - - @POST - @Path(ACTION_PING) - @Produces({APPLICATION_JSON}) - public PingInformation actionPingPost(@Context HttpServletRequest request, - @Context UriInfo uriInfo, - String body) { - markPost(SLIDER_SUBPATH_APPLICATION, ACTION_PING); - return new RestActionPing().ping(request, uriInfo, body); - } - - @PUT - @Path(ACTION_PING) - @Consumes({TEXT_PLAIN}) - @Produces({APPLICATION_JSON}) - public PingInformation actionPingPut(@Context HttpServletRequest request, - @Context UriInfo uriInfo, - String body) { - markPut(SLIDER_SUBPATH_APPLICATION, ACTION_PING); - return new RestActionPing().ping(request, uriInfo, body); - } - - @DELETE - @Path(ACTION_PING) - @Consumes({APPLICATION_JSON}) - @Produces({APPLICATION_JSON}) - public PingInformation actionPingDelete(@Context HttpServletRequest request, - @Context UriInfo uriInfo) { - markDelete(SLIDER_SUBPATH_APPLICATION, ACTION_PING); - return new RestActionPing().ping(request, uriInfo, ""); - } - - @HEAD - @Path(ACTION_PING) - public Object actionPingHead(@Context HttpServletRequest request, - @Context UriInfo uriInfo) { - mark("HEAD", SLIDER_SUBPATH_APPLICATION, ACTION_PING); - return new RestActionPing().ping(request, uriInfo, ""); - } - - /* ************************************************************************ - - ACTION STOP - - **************************************************************************/ - - - @POST - @Path(ACTION_STOP) - @Produces({APPLICATION_JSON}) - public StopResponse actionStop(@Context HttpServletRequest request, - @Context UriInfo uriInfo, - String body) { - markPost(SLIDER_SUBPATH_APPLICATION, ACTION_STOP); - return new RestActionStop(slider).stop(request, uriInfo, body); - } - - /** - * Schedule an action - * @param action for delayed execution - */ - public void schedule(AsyncAction action) { - actionQueues.schedule(action); - } - - /** - * Put an action on the immediate queue -to be executed when the queue - * reaches it. - * @param action action to queue - */ - public void queue(AsyncAction action) { - actionQueues.put(action); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/RestActionPing.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/RestActionPing.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/RestActionPing.java deleted file mode 100644 index 96b4f75..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/RestActionPing.java +++ /dev/null @@ -1,50 +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.application.actions; - -import org.apache.slider.api.types.PingInformation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.UriInfo; -import java.util.Locale; - -public class RestActionPing { - private static final Logger log = - LoggerFactory.getLogger(RestActionPing.class); - - public RestActionPing() { - } - - public PingInformation ping(HttpServletRequest request, UriInfo uriInfo, String body) { - String verb = request.getMethod(); - log.info("Ping {}", verb); - PingInformation pingInformation = new PingInformation(); - pingInformation.time = System.currentTimeMillis(); - pingInformation.verb = verb; - pingInformation.body = body; - String text = - String.format(Locale.ENGLISH, - "Ping verb %s received at %tc", - verb, pingInformation.time); - pingInformation.text = text; - return pingInformation; - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/RestActionStop.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/RestActionStop.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/RestActionStop.java deleted file mode 100644 index 544f589..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/RestActionStop.java +++ /dev/null @@ -1,67 +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.application.actions; - -import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; -import org.apache.slider.core.main.LauncherExitCodes; -import org.apache.slider.server.appmaster.actions.ActionStopSlider; -import org.apache.slider.server.appmaster.web.WebAppApi; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.UriInfo; -import java.util.Locale; -import java.util.concurrent.TimeUnit; - -public class RestActionStop { - private static final Logger log = - LoggerFactory.getLogger(RestActionStop.class); - - private final WebAppApi slider; - - public RestActionStop(WebAppApi slider) { - this.slider = slider; - } - - public StopResponse stop(HttpServletRequest request, UriInfo uriInfo, String body) { - String verb = request.getMethod(); - log.info("Ping {}", verb); - StopResponse response = new StopResponse(); - response.verb = verb; - long time = System.currentTimeMillis(); - String text = - String.format(Locale.ENGLISH, - "Stopping action %s received at %tc", - verb, time); - response.text = text; - log.info(text); - ActionStopSlider stopSlider = - new ActionStopSlider(text, - 1000, - TimeUnit.MILLISECONDS, - LauncherExitCodes.EXIT_SUCCESS, - FinalApplicationStatus.SUCCEEDED, - text); - log.info("SliderAppMasterApi.stopCluster: {}", stopSlider); - slider.getQueues().schedule(stopSlider); - - return response; - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/StopResponse.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/StopResponse.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/StopResponse.java deleted file mode 100644 index 9af6a22..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/actions/StopResponse.java +++ /dev/null @@ -1,29 +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.application.actions; - -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.map.annotate.JsonSerialize; - -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class StopResponse { - String verb; - public String text; -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/package-info.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/package-info.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/package-info.java deleted file mode 100644 index 34eb82c..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/package-info.java +++ /dev/null @@ -1,24 +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. - */ - - -/** - * This package contains resources related to the application - * REST API - */ -package org.apache.slider.server.appmaster.web.rest.application; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/AggregateModelRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/AggregateModelRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/AggregateModelRefresher.java deleted file mode 100644 index ee28abf..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/AggregateModelRefresher.java +++ /dev/null @@ -1,47 +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.application.resources; - -import org.apache.slider.core.conf.AggregateConf; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; - -/** - * Refresh the aggregate desired model via - * {@link StateAccessForProviders#getInstanceDefinitionSnapshot()} - */ -public class AggregateModelRefresher - implements ResourceRefresher<AggregateConf> { - - private final StateAccessForProviders state; - private final boolean resolved; - - public AggregateModelRefresher(StateAccessForProviders state, - boolean resolved) { - this.state = state; - this.resolved = resolved; - } - - @Override - public AggregateConf refresh() throws Exception { - return - resolved ? - state.getInstanceDefinitionSnapshot() - : state.getUnresolvedInstanceDefinition(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/AppconfRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/AppconfRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/AppconfRefresher.java deleted file mode 100644 index 06460cc..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/AppconfRefresher.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.rest.application.resources; - -import org.apache.slider.core.conf.AggregateConf; -import org.apache.slider.core.conf.ConfTree; -import org.apache.slider.core.persist.ConfTreeSerDeser; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; - -/** - * refresher for resources and application configuration - */ -public class AppconfRefresher - implements ResourceRefresher<ConfTree> { - - private final StateAccessForProviders state; - private final boolean unresolved; - private final boolean resources; - - public AppconfRefresher(StateAccessForProviders state, - boolean unresolved, - boolean resources) { - this.state = state; - this.unresolved = unresolved; - this.resources = resources; - } - - - @Override - public ConfTree refresh() throws Exception { - AggregateConf aggregateConf = - unresolved ? - state.getUnresolvedInstanceDefinition(): - state.getInstanceDefinitionSnapshot(); - ConfTree ct = resources ? aggregateConf.getResources() - : aggregateConf.getAppConf(); - return new ConfTreeSerDeser().fromInstance(ct); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/CachedContent.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/CachedContent.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/CachedContent.java deleted file mode 100644 index 22fd0fe..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/CachedContent.java +++ /dev/null @@ -1,121 +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.application.resources; - -import com.google.common.base.Preconditions; -import org.apache.hadoop.util.Time; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A cached resource is one that can be stored and served up, with a refresh - * only taking place when the expiry happens. - * - * The refresh check/refresh is synchronized. - * @param <T> type to return - */ -public class CachedContent<T> { - private static final Logger log = - LoggerFactory.getLogger(CachedContent.class); - private T cachedValue; - private long expires; - private final long lifespan; - private final ResourceRefresher<T> refresh; - private int refreshCounter; - - public CachedContent(long lifespan, - ResourceRefresher<T> refresh) { - this.lifespan = lifespan; - this.refresh = refresh; - } - - /** - * Get the value, triggering a refresh if needed - * @return the cached or latest value. - */ - public T get() throws Exception { - maybeRefresh(); - return getCachedValue(); - } - - /** - * Get the cached value without any expiry check - * @return the last value set. May be null. - */ - public synchronized T getCachedValue() { - return cachedValue; - } - - public synchronized int getRefreshCounter() { - return refreshCounter; - } - - /** - * Get the lifespan in millis of the cached value - * @return the lifespan - */ - public long getLifespan() { - return lifespan; - } - - /** - * Maybe refresh the content - * @return true if a refresh took place. - */ - public synchronized boolean maybeRefresh() throws Exception { - long now = now(); - if (cachedValue == null || now >= expires) { - log.debug("Refreshing at time {}", now); - forceRefresh(); - log.debug("Refreshed value now {}", cachedValue); - return true; - } - return false; - } - - protected long now() { - return Time.monotonicNow(); - } - - /** - * Force a refresh and reset the expiry counter - * @return the new value - */ - protected synchronized T forceRefresh() throws Exception { - refreshCounter ++; - T updated = refresh.refresh(); - Preconditions.checkNotNull(updated); - cachedValue = updated; - expires = now() + lifespan; - return cachedValue; - } - - @Override - public String toString() { - final StringBuilder sb = - new StringBuilder("CachedContent{"); - sb.append(" expires=").append(expires); - sb.append(", lifespan=").append(lifespan); - sb.append(", refresh=").append(refresh); - sb.append(", refreshCounter=").append(refreshCounter); - sb.append(", cached=").append(cachedValue); - sb.append('}'); - return sb.toString(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ContentCache.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ContentCache.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ContentCache.java deleted file mode 100644 index 8f026a1..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ContentCache.java +++ /dev/null @@ -1,67 +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.application.resources; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Cache of content - */ -public class ContentCache extends ConcurrentHashMap<String, CachedContent> { - - public ContentCache(int initialCapacity) { - super(initialCapacity); - } - - public ContentCache() { - } - - - public Object lookup(String key) throws Exception { - CachedContent content = get(key); - if (content == null) { - throw new FileNotFoundException("no content for path " + key); - } - return content.get(); - } - - - /** - * Lookup a cached item. If an exception is raised on the refresh... - * <ol> - * <li>IOExceptions are thrown directly</li> - * <li>Other exceptions are wrapped with an IOExceptions</li> - * </ol> - * @param key - * @return - * @throws IOException - */ - public Object lookupWithIOE(String key) throws IOException { - try { - return lookup(key); - } catch (IOException e) { - throw e; - } catch (Exception e) { - throw new IOException("Looking up " + key + ": " + e, e); - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveComponentsRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveComponentsRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveComponentsRefresher.java deleted file mode 100644 index b6627a7..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveComponentsRefresher.java +++ /dev/null @@ -1,39 +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.application.resources; - -import org.apache.slider.api.types.ComponentInformation; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; - -import java.util.Map; - -public class LiveComponentsRefresher - implements ResourceRefresher<Map<String, ComponentInformation>> { - - private final StateAccessForProviders state; - - public LiveComponentsRefresher(StateAccessForProviders state) { - this.state = state; - } - - @Override - public Map<String, ComponentInformation> refresh() { - return state.getComponentInfoSnapshot(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveContainersRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveContainersRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveContainersRefresher.java deleted file mode 100644 index 68bd8a2..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveContainersRefresher.java +++ /dev/null @@ -1,52 +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.application.resources; - -import org.apache.slider.api.types.ContainerInformation; -import org.apache.slider.server.appmaster.state.RoleInstance; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Refresh the container list. - */ -public class LiveContainersRefresher implements ResourceRefresher<Map<String, ContainerInformation>> { - - private final StateAccessForProviders state; - - public LiveContainersRefresher(StateAccessForProviders state) { - this.state = state; - } - - @Override - public Map<String, ContainerInformation> refresh() throws - Exception { - List<RoleInstance> containerList = state.cloneOwnedContainerList(); - - Map<String, ContainerInformation> map = new HashMap<>(); - for (RoleInstance instance : containerList) { - ContainerInformation serialized = instance.serialize(); - map.put(serialized.containerId, serialized); - } - return map; - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveNodesRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveNodesRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveNodesRefresher.java deleted file mode 100644 index aeb7a11..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveNodesRefresher.java +++ /dev/null @@ -1,41 +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.application.resources; - -import org.apache.slider.api.types.NodeInformationList; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; - -/** - * Update the live nodes map - */ -public class LiveNodesRefresher - implements ResourceRefresher<NodeInformationList> { - - private final StateAccessForProviders state; - - public LiveNodesRefresher(StateAccessForProviders state) { - this.state = state; - } - - @Override - public NodeInformationList refresh() { - - return new NodeInformationList(state.getNodeInformationSnapshot().values()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveResourcesRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveResourcesRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveResourcesRefresher.java deleted file mode 100644 index f988297..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveResourcesRefresher.java +++ /dev/null @@ -1,68 +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.application.resources; - -import org.apache.slider.api.StatusKeys; -import org.apache.slider.core.conf.ConfTree; -import org.apache.slider.core.conf.ConfTreeOperations; -import org.apache.slider.server.appmaster.state.RoleStatus; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; - -import java.util.Map; - -public class LiveResourcesRefresher implements ResourceRefresher<ConfTree> { - - private final StateAccessForProviders state; - - public LiveResourcesRefresher(StateAccessForProviders state) { - this.state = state; - } - - @Override - public ConfTree refresh() throws Exception { - - // snapshot resources - ConfTreeOperations resources = state.getResourcesSnapshot(); - // then add actual values - Map<Integer, RoleStatus> roleStatusMap = state.getRoleStatusMap(); - - for (RoleStatus status : roleStatusMap.values()) { - String name = status.getName(); - resources.setComponentOpt(name, - StatusKeys.COMPONENT_INSTANCES_REQUESTING, - status.getRequested()); - resources.setComponentOpt(name, - StatusKeys.COMPONENT_INSTANCES_ACTUAL, - status.getActual()); - resources.setComponentOpt(name, - StatusKeys.COMPONENT_INSTANCES_RELEASING, - status.getReleasing()); - resources.setComponentOpt(name, - StatusKeys.COMPONENT_INSTANCES_FAILED, - status.getFailed()); - resources.setComponentOpt(name, - StatusKeys.COMPONENT_INSTANCES_COMPLETED, - status.getCompleted()); - resources.setComponentOpt(name, - StatusKeys.COMPONENT_INSTANCES_STARTED, - status.getStarted()); - } - return resources.getConfTree(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveStatisticsRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveStatisticsRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveStatisticsRefresher.java deleted file mode 100644 index d31b455..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveStatisticsRefresher.java +++ /dev/null @@ -1,39 +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.application.resources; - -import org.apache.slider.server.appmaster.state.StateAccessForProviders; - -import java.util.Map; - -public class LiveStatisticsRefresher implements ResourceRefresher<Map<String,Integer>> { - - private final StateAccessForProviders state; - - public LiveStatisticsRefresher(StateAccessForProviders state) { - this.state = state; - } - - @Override - public Map<String, Integer> refresh() throws Exception { - - // snapshot resources - return state.getLiveStatistics(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ResourceRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ResourceRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ResourceRefresher.java deleted file mode 100644 index 35f0367..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ResourceRefresher.java +++ /dev/null @@ -1,31 +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.application.resources; - -/** - * Interface which must be implemented to act as a source for cached content. - * @param <T> type to return - */ -public interface ResourceRefresher<T> { - /** - * Build an up to date version of the data - * @return a new instance of the (JSON serializable) data - */ - T refresh() throws Exception; -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ResourceSnapshotRefresher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ResourceSnapshotRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ResourceSnapshotRefresher.java deleted file mode 100644 index c16912a..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ResourceSnapshotRefresher.java +++ /dev/null @@ -1,40 +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.application.resources; - -import org.apache.slider.core.conf.ConfTree; -import org.apache.slider.core.conf.ConfTreeOperations; -import org.apache.slider.server.appmaster.state.StateAccessForProviders; - -public class ResourceSnapshotRefresher implements ResourceRefresher<ConfTree> { - - private final StateAccessForProviders state; - - public ResourceSnapshotRefresher(StateAccessForProviders state) { - this.state = state; - } - - @Override - public ConfTree refresh() throws Exception { - - // snapshot resources - ConfTreeOperations resources = state.getResourcesSnapshot(); - return resources.getConfTree(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/ManagementResource.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/ManagementResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/ManagementResource.java deleted file mode 100644 index f27711a..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/ManagementResource.java +++ /dev/null @@ -1,93 +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.management; - -import org.apache.slider.core.conf.AggregateConf; -import org.apache.slider.server.appmaster.web.WebAppApi; -import org.apache.slider.server.appmaster.web.rest.AbstractSliderResource; -import org.apache.slider.server.appmaster.web.rest.RestPaths; -import org.apache.slider.server.appmaster.web.rest.management.resources.AggregateConfResource; -import org.apache.slider.server.appmaster.web.rest.management.resources.ConfTreeResource; -import org.apache.slider.server.appmaster.web.rest.management.resources.ResourceFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.http.HttpServletRequest; -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.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import java.net.URI; -import java.net.URL; - -/** - * - */ -public class ManagementResource extends AbstractSliderResource { - protected static final Logger log = - LoggerFactory.getLogger(ManagementResource.class); - public static final String CONFIG = "config"; - public static final String APP_UNDER_MANAGEMENT = "/app"; - - public ManagementResource(WebAppApi slider) { - super(slider); - } - - private void init(HttpServletResponse res) { - res.setContentType(null); - } - - @GET - public Response getWadl (@Context HttpServletRequest request) { - return redirectToAppWadl(request); - } - - @GET - @Path("/app") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - public AggregateConfResource getAggregateConfiguration(@Context UriInfo uriInfo, - @Context HttpServletResponse res) { - init(res); - return ResourceFactory.createAggregateConfResource(getAggregateConf(), - uriInfo.getAbsolutePathBuilder()); - } - - @GET - @Path(APP_UNDER_MANAGEMENT+"/configurations/{config}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - public ConfTreeResource getConfTreeResource(@PathParam(CONFIG) String config, - @Context UriInfo uriInfo, - @Context HttpServletResponse res) { - init(res); - AggregateConfResource aggregateConf = - ResourceFactory.createAggregateConfResource(getAggregateConf(), - uriInfo.getBaseUriBuilder() - .path(RestPaths.SLIDER_CONTEXT_ROOT) - .path(RestPaths.MANAGEMENT + APP_UNDER_MANAGEMENT)); - return aggregateConf.getConfTree(config); - } - - protected AggregateConf getAggregateConf() { - return slider.getAppState().getInstanceDefinitionSnapshot(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ActionsResource.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ActionsResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ActionsResource.java deleted file mode 100644 index 9b340fa..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ActionsResource.java +++ /dev/null @@ -1,22 +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.management.resources; - -public class ActionsResource { -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/AggregateConfResource.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/AggregateConfResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/AggregateConfResource.java deleted file mode 100644 index 794daf9..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/AggregateConfResource.java +++ /dev/null @@ -1,90 +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.management.resources; - -import org.apache.slider.core.conf.AggregateConf; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.map.annotate.JsonSerialize; - -import javax.ws.rs.core.UriBuilder; -import java.util.HashMap; -import java.util.Map; - -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class AggregateConfResource { - private String href; - private final ConfTreeResource resources; - private final ConfTreeResource internal; - private final ConfTreeResource appConf; - @JsonIgnore - private Map<String, ConfTreeResource> confMap; - - public AggregateConfResource(AggregateConf conf, UriBuilder uriBuilder) { - if (uriBuilder != null) { - this.href = uriBuilder.build().toASCIIString(); - resources = ResourceFactory.createConfTreeResource(conf.getResources(), - uriBuilder.clone().path("configurations").path("resources")); - internal = ResourceFactory.createConfTreeResource(conf.getInternal(), - uriBuilder.clone().path("configurations").path("internal")); - appConf = ResourceFactory.createConfTreeResource(conf.getAppConf(), - uriBuilder.clone().path("configurations").path("appConf")); - initConfMap(); - } else { - resources = null; - internal = null; - appConf = null; - } - } - - private void initConfMap() { - confMap = new HashMap<>(); - confMap.put("internal", internal); - confMap.put("resources", resources); - confMap.put("appConf", appConf); - } - - public AggregateConfResource() { - this(null, null); - } - - public ConfTreeResource getConfTree(String name) { - return confMap.get(name); - } - - public String getHref() { - return href; - } - - public void setHref(String href) { - this.href = href; - } - - public ConfTreeResource getResources() { - return resources; - } - - public ConfTreeResource getInternal() { - return internal; - } - - public ConfTreeResource getAppConf() { - return appConf; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ComponentResource.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ComponentResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ComponentResource.java deleted file mode 100644 index a44448e..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ComponentResource.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.rest.management.resources; - -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.map.annotate.JsonSerialize; - -import javax.ws.rs.core.UriBuilder; -import java.util.Map; - -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class ComponentResource { - private final Map<String, String> props; - private String href; - - public ComponentResource() { - this(null, null, null, null); - } - - public ComponentResource(String name, - Map<String, String> props, - UriBuilder uriBuilder, - Map<String, Object> pathElems) { - this.props = props; - } - - public Map<String, String> getProps() { - return props; - } - - public String getHref() { - return href; - } - - public void setHref(String href) { - this.href = href; - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ConfTreeResource.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ConfTreeResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ConfTreeResource.java deleted file mode 100644 index 407bab6..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ConfTreeResource.java +++ /dev/null @@ -1,69 +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.management.resources; - -import org.apache.slider.core.conf.ConfTree; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.map.annotate.JsonSerialize; - -import javax.ws.rs.core.UriBuilder; -import java.util.Map; - -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class ConfTreeResource { - - private final String href; - private final Map<String, Object> metadata; - private final Map<String, String> global; - private final Map<String, Map<String, String>> components; - - public ConfTreeResource() { - this(null, null); - } - - public ConfTreeResource(ConfTree confTree, - UriBuilder uriBuilder) { - if (uriBuilder != null && confTree != null) { - metadata = confTree.metadata; - global = confTree.global; - components = confTree.components; - this.href = uriBuilder.build().toASCIIString(); - } else { - this.href = null; - this.metadata = null; - this.global = null; - this.components = null; - } - } - - public Map<String, Object> getMetadata() { - return metadata; - } - - public Map<String, String> getGlobal() { - return global; - } - - public Map<String, Map<String, String>> getComponents() { - return components; - } - - public String getHref() { - return href; - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ResourceFactory.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ResourceFactory.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ResourceFactory.java deleted file mode 100644 index 9876412..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/management/resources/ResourceFactory.java +++ /dev/null @@ -1,47 +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.management.resources; - -import org.apache.slider.core.conf.AggregateConf; -import org.apache.slider.core.conf.ConfTree; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.map.annotate.JsonSerialize; - -import javax.ws.rs.core.UriBuilder; -import java.util.Map; - -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class ResourceFactory { - - public static AggregateConfResource createAggregateConfResource(AggregateConf conf, - UriBuilder uriBuilder) { - return new AggregateConfResource(conf, uriBuilder); - } - - public static ConfTreeResource createConfTreeResource(ConfTree confTree, - UriBuilder uriBuilder) { - return new ConfTreeResource(confTree, uriBuilder); - } - - public static ComponentResource createComponentResource(String name, - Map<String, String> props, - UriBuilder uriBuilder, - Map<String, Object> pathElems) { - return new ComponentResource(name, props, uriBuilder, pathElems); - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/publisher/PublisherResource.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/publisher/PublisherResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/publisher/PublisherResource.java deleted file mode 100644 index c727581..0000000 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/publisher/PublisherResource.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.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.HttpServletRequest; -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.Response; -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.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -import static org.apache.slider.server.appmaster.web.rest.RestPaths.*; - -/** - * 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 Set<URL> getAMClassPath() { - URL[] urls = ((URLClassLoader) getClass().getClassLoader()).getURLs(); - return new LinkedHashSet<URL>(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; - } - -}