You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by st...@apache.org on 2014/12/18 22:32:54 UTC
[46/50] incubator-slider git commit: SLIDER-711 live/containers
resource
SLIDER-711 live/containers resource
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/9dffb405
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/9dffb405
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/9dffb405
Branch: refs/heads/feature/SLIDER-151_REST_API
Commit: 9dffb40590a96bac96fd411564fe09f9ae77e134
Parents: a5d1f5e
Author: Steve Loughran <st...@apache.org>
Authored: Thu Dec 18 13:48:15 2014 +0000
Committer: Steve Loughran <st...@apache.org>
Committed: Thu Dec 18 13:48:15 2014 +0000
----------------------------------------------------------------------
.../server/appmaster/web/WebAppApiImpl.java | 4 +-
.../rest/application/ApplicationResource.java | 19 +++-
.../application/resources/ContentCache.java | 9 ++
.../appstate/StubSliderClusterProtocol.groovy | 108 +++++++++++++++++++
.../TestMockAppStateAppRestIntegration.groovy | 54 ++++++++--
5 files changed, 178 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9dffb405/slider-core/src/main/java/org/apache/slider/server/appmaster/web/WebAppApiImpl.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/WebAppApiImpl.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/WebAppApiImpl.java
index 36d4a8f..d5532ea 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/WebAppApiImpl.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/WebAppApiImpl.java
@@ -52,11 +52,11 @@ public class WebAppApiImpl implements WebAppApi {
CertificateManager certificateManager,
RegistryOperations registryOperations,
MetricsAndMonitoring metricsAndMonitoring) {
- this.registryOperations = registryOperations;
checkNotNull(clusterProto);
checkNotNull(appState);
checkNotNull(provider);
-
+
+ this.registryOperations = registryOperations;
this.clusterProto = clusterProto;
this.appState = appState;
this.provider = provider;
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9dffb405/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
index 374e8de..e4be96f 100644
--- 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
@@ -19,11 +19,14 @@
package org.apache.slider.server.appmaster.web.rest.application;
import com.google.common.collect.Lists;
+import org.apache.slider.api.types.SerializedContainerInformation;
import org.apache.slider.core.conf.ConfTree;
+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.apache.slider.server.appmaster.web.rest.RestPaths;
import org.apache.slider.server.appmaster.web.rest.application.resources.CachedContent;
+import org.apache.slider.server.appmaster.web.rest.application.resources.ContainerListRefresher;
import org.apache.slider.server.appmaster.web.rest.application.resources.ContentCache;
import org.apache.slider.server.appmaster.web.rest.application.resources.LiveResourcesRefresher;
import org.slf4j.Logger;
@@ -35,6 +38,7 @@ import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.List;
+import java.util.Map;
@Singleton
public class ApplicationResource extends AbstractSliderResource {
@@ -46,9 +50,13 @@ public class ApplicationResource extends AbstractSliderResource {
public ApplicationResource(WebAppApi slider) {
super(slider);
+ StateAccessForProviders state = slider.getAppState();
cache.put(RestPaths.LIVE_RESOURCES,
new CachedContent<ConfTree>(LIFESPAN,
- new LiveResourcesRefresher(slider.getAppState())));
+ new LiveResourcesRefresher(state)));
+ cache.put(RestPaths.LIVE_CONTAINERS,
+ new CachedContent<Map<String, SerializedContainerInformation>>(LIFESPAN,
+ new ContainerListRefresher(state)));
}
/**
@@ -91,7 +99,7 @@ public class ApplicationResource extends AbstractSliderResource {
@Produces({MediaType.APPLICATION_JSON})
public Object getLiveResources() {
try {
- return cache.get(RestPaths.LIVE_RESOURCES).get();
+ return cache.lookup(RestPaths.LIVE_RESOURCES);
} catch (Exception e) {
throw buildException(RestPaths.LIVE_RESOURCES, e);
}
@@ -99,11 +107,12 @@ public class ApplicationResource extends AbstractSliderResource {
@GET
@Path(RestPaths.LIVE_CONTAINERS)
@Produces({MediaType.APPLICATION_JSON})
- public Object getLiveContainers() {
+ public Map<String, SerializedContainerInformation> getLiveContainers() {
try {
- return cache.get(RestPaths.LIVE_RESOURCES).get();
+ return (Map<String, SerializedContainerInformation>)cache.lookup(
+ RestPaths.LIVE_CONTAINERS);
} catch (Exception e) {
- throw buildException(RestPaths.LIVE_RESOURCES, e);
+ throw buildException(RestPaths.LIVE_CONTAINERS, e);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9dffb405/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
index f309570..6ee9604 100644
--- 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
@@ -18,6 +18,9 @@
package org.apache.slider.server.appmaster.web.rest.application.resources;
+import com.google.common.base.Preconditions;
+import org.apache.slider.server.appmaster.web.rest.RestPaths;
+
import java.util.concurrent.ConcurrentHashMap;
/**
@@ -31,4 +34,10 @@ public class ContentCache extends ConcurrentHashMap<String, CachedContent> {
public ContentCache() {
}
+
+ public Object lookup(String key) {
+ CachedContent content = get(key);
+ Preconditions.checkNotNull(content, "no content for path " + key);
+ return content.get();
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9dffb405/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/StubSliderClusterProtocol.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/StubSliderClusterProtocol.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/StubSliderClusterProtocol.groovy
new file mode 100644
index 0000000..0836dcb
--- /dev/null
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/StubSliderClusterProtocol.groovy
@@ -0,0 +1,108 @@
+/*
+ * 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.model.appstate
+
+import org.apache.hadoop.ipc.ProtocolSignature
+import org.apache.hadoop.yarn.exceptions.YarnException
+import org.apache.slider.api.SliderClusterProtocol
+import org.apache.slider.api.proto.Messages
+
+class StubSliderClusterProtocol implements SliderClusterProtocol {
+ @Override
+ Messages.StopClusterResponseProto stopCluster(
+ Messages.StopClusterRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.FlexClusterResponseProto flexCluster(
+ Messages.FlexClusterRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.GetJSONClusterStatusResponseProto getJSONClusterStatus(
+ Messages.GetJSONClusterStatusRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.ListNodeUUIDsByRoleResponseProto listNodeUUIDsByRole(
+ Messages.ListNodeUUIDsByRoleRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.GetNodeResponseProto getNode(Messages.GetNodeRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.GetClusterNodesResponseProto getClusterNodes(
+ Messages.GetClusterNodesRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.EchoResponseProto echo(Messages.EchoRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.KillContainerResponseProto killContainer(
+ Messages.KillContainerRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.AMSuicideResponseProto amSuicide(
+ Messages.AMSuicideRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ Messages.GetInstanceDefinitionResponseProto getInstanceDefinition(
+ Messages.GetInstanceDefinitionRequestProto request)
+ throws IOException, YarnException {
+ throw new UnsupportedOperationException()
+ }
+
+ @Override
+ long getProtocolVersion(String protocol, long clientVersion)
+ throws IOException {
+ return 0
+ }
+
+ @Override
+ ProtocolSignature getProtocolSignature(
+ String protocol,
+ long clientVersion,
+ int clientMethodsHash) throws IOException {
+ throw new UnsupportedOperationException()
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9dffb405/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAppRestIntegration.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAppRestIntegration.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAppRestIntegration.groovy
index aefeecf..c188b9c 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAppRestIntegration.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAppRestIntegration.groovy
@@ -19,13 +19,22 @@
package org.apache.slider.server.appmaster.model.appstate
import groovy.util.logging.Slf4j
+import org.apache.hadoop.ipc.ProtocolSignature
+import org.apache.hadoop.yarn.exceptions.YarnException
+import org.apache.slider.api.SliderClusterProtocol
+import org.apache.slider.api.proto.Messages
import org.apache.slider.api.types.SerializedContainerInformation
import org.apache.slider.core.persist.JsonSerDeser
+import org.apache.slider.server.appmaster.management.MetricsAndMonitoring
import org.apache.slider.server.appmaster.model.mock.BaseMockAppStateTest
+import org.apache.slider.server.appmaster.model.mock.MockProviderService
import org.apache.slider.server.appmaster.model.mock.MockRoles
import org.apache.slider.server.appmaster.state.ProviderAppState
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.WebAppApiImpl
+import org.apache.slider.server.appmaster.web.rest.application.ApplicationResource
import org.apache.slider.server.appmaster.web.rest.application.resources.CachedContent
import org.apache.slider.server.appmaster.web.rest.application.resources.ContainerListRefresher
import org.apache.slider.server.appmaster.web.rest.application.resources.ContentCache
@@ -64,18 +73,11 @@ class TestMockAppStateAppRestIntegration extends BaseMockAppStateTest implements
@Test
public void testContainerListRefresher() throws Throwable {
- int r0 = 1
- int r1 = 2
- int r2 = 3
- role0Status.desired = r0
- role1Status.desired = r1
- role2Status.desired = r2
ContainerListRefresher clr = new ContainerListRefresher(stateAccess)
def map = clr.refresh()
assert map.size() == 0
- List<RoleInstance> instances = createAndStartNodes()
+ List<RoleInstance> instances = startNodes()
map = clr.refresh()
- assert instances.size() == r0 + r1 + r2
assert map.size() == instances.size()
log.info("$map")
JsonSerDeser<SerializedContainerInformation> serDeser =
@@ -85,11 +87,45 @@ class TestMockAppStateAppRestIntegration extends BaseMockAppStateTest implements
}
}
- public ProviderAppState getStateAccess() {
+ public List<RoleInstance> startNodes() {
+ int r0 = 1
+ int r1 = 2
+ int r2 = 3
+ role0Status.desired = r0
+ role1Status.desired = r1
+ role2Status.desired = r2
+ List<RoleInstance> instances = createAndStartNodes()
+ assert instances.size() == r0 + r1 + r2
+ return instances
+ }
+
+ @Test
+ public void testApplicationResource() throws Throwable {
+ def instances = startNodes()
+ ApplicationResource applicationResource =
+ new ApplicationResource(webAppApi)
+ def containers = applicationResource.liveContainers
+ assert containers.size() == instances.size()
+
+ }
+ /**
+ * Get a state accessor for the appState field
+ * @return something to hand down to refreshers and resources
+ */
+ public StateAccessForProviders getStateAccess() {
StateAccessForProviders state = new ProviderAppState("name", appState)
return state
}
+ public WebAppApi getWebAppApi() {
+ WebAppApi api = new WebAppApiImpl(new StubSliderClusterProtocol(),
+ stateAccess,
+ new MockProviderService(),
+ null, null,
+ new MetricsAndMonitoring("metrics"))
+ return api
+ }
+
/**
* Little class to do integer refreshing & so test refresh logic
*/