SLIDER-711 components/ and components/$component
diff --git a/slider-core/src/main/java/org/apache/slider/api/types/SerializedComponentInformation.java b/slider-core/src/main/java/org/apache/slider/api/types/SerializedComponentInformation.java
new file mode 100644
index 0000000..8eac3db
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/api/types/SerializedComponentInformation.java
@@ -0,0 +1,41 @@
+/*
+ * 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.api.types;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import java.util.List;
+
+/**
+ * Serializable version of component data
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+
+public class SerializedComponentInformation {
+  
+  public String name;
+  public int priority;
+  public int desired, actual, requested, releasing;
+  public int failed, started, startFailed, completed, totalRequested;
+  public String failureMessage;
+  public int placementPolicy;
+  public List<String> containers;
+}
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/RoleLaunchService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/RoleLaunchService.java
index 7701cfe..4333a09 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/RoleLaunchService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/RoleLaunchService.java
@@ -131,7 +131,7 @@
       new RoleLaunchService.RoleLauncher(container,
          role.getProviderRole(),
          clusterSpec,
-         clusterSpec.getResourceOperations() .getOrAddComponent(roleName),
+         clusterSpec.getResourceOperations().getOrAddComponent(roleName),
          clusterSpec.getAppConfOperations().getOrAddComponent(roleName));
     execute(launcher);
   }
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
index e9d0371..9ae20a5 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
@@ -839,8 +839,7 @@
     }
     return rs;
   }
-
-
+  
   public RoleStatus lookupRoleStatus(Container c) throws YarnRuntimeException {
     return lookupRoleStatus(ContainerPriority.extractRole(c));
   }
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
index 3c860d6..74a1c9c 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
@@ -19,6 +19,7 @@
 package org.apache.slider.server.appmaster.state;
 
 import org.apache.slider.api.StatusKeys;
+import org.apache.slider.api.types.SerializedComponentInformation;
 import org.apache.slider.providers.PlacementPolicy;
 import org.apache.slider.providers.ProviderRole;
 
@@ -37,8 +38,7 @@
   private final String name;
 
   /**
-   * Role key in the container details stored in the AM,
-   * currently mapped to priority
+   * Role priority
    */
   private final int key;
 
@@ -47,23 +47,6 @@
   private int desired, actual, requested, releasing;
   private int failed, started, startFailed, completed, totalRequested;
 
-  /**
-   * value to use when specifiying "no limit" for instances: {@value}
-   */
-  public static final int UNLIMITED_INSTANCES = 1;
-
-  /**
-   * minimum number of instances of a role permitted in a valid
-   * configuration. Default: 0.
-   */
-  private int minimum = 0;
-
-  /**
-   * maximum number of instances of a role permitted in a valid
-   * configuration. Default: unlimited.
-   */
-  private int maximum = UNLIMITED_INSTANCES;
-  
   private String failureMessage = "";
 
   public RoleStatus(ProviderRole providerRole) {
@@ -260,8 +243,6 @@
     return "RoleStatus{" +
            "name='" + name + '\'' +
            ", key=" + key +
-           ", minimum=" + minimum +
-           ", maximum=" + maximum +
            ", desired=" + desired +
            ", actual=" + actual +
            ", requested=" + requested +
@@ -304,6 +285,22 @@
     return stats;
   }
 
+  public SerializedComponentInformation serialize() {
+    SerializedComponentInformation info = new SerializedComponentInformation();
+    info.name = name;
+    info.priority = getPriority();
+    info.desired = desired;
+    info.actual = actual;
+    info.requested = requested;
+    info.releasing = releasing;
+    info.failed = failed;
+    info.startFailed = startFailed;
+    info.requested = requested;
+    info.placementPolicy = getPlacementPolicy();
+    info.failureMessage = failureMessage;
+    return info;
+  }
+  
   /**
    * Compare two role status entries by name
    */
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/AbstractSliderResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/AbstractSliderResource.java
index ede46f0..dc07c10 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/AbstractSliderResource.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/AbstractSliderResource.java
@@ -30,6 +30,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Response;
+import java.io.FileNotFoundException;
 import java.net.URI;
 import java.net.URL;
 
@@ -79,6 +80,8 @@
     } catch (WebApplicationException e) {
       // rethrow direct
       throw e;
+    } catch (FileNotFoundException e) {
+      return new NotFoundException("Not found: " + path);
     } catch (PathNotFoundException e) {
       return new NotFoundException("Not found: " + path);
     } catch (AuthenticationFailedException e) {
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/RestPaths.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/RestPaths.java
index 28c0fab..011ec3a 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/RestPaths.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/RestPaths.java
@@ -130,8 +130,10 @@
 
 
   public static final String APPLICATION_WADL = "/application.wadl";
+  public static final String LIVE = "/live";
   public static final String LIVE_RESOURCES = "/live/resources";
   public static final String LIVE_CONTAINERS = "/live/containers";
+  public static final String LIVE_COMPONENTS = "/live/components";
   public static final String MODEL_DESIRED = "/model/desired";
   public static final String MODEL_DESIRED_APPCONF = MODEL_DESIRED +"/appconf";
   public static final String MODEL_DESIRED_RESOURCES = MODEL_DESIRED +"/resources";
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 e4be96f..9419765 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,15 +19,23 @@
 package org.apache.slider.server.appmaster.web.rest.application;
 
 import com.google.common.collect.Lists;
+import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
+import org.apache.hadoop.yarn.webapp.NotFoundException;
+import org.apache.slider.api.types.SerializedComponentInformation;
 import org.apache.slider.api.types.SerializedContainerInformation;
 import org.apache.slider.core.conf.ConfTree;
+import org.apache.slider.core.exceptions.NoSuchNodeException;
+import org.apache.slider.server.appmaster.state.RoleInstance;
+import org.apache.slider.server.appmaster.state.RoleStatus;
 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.LiveContainersRefresher;
 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.LiveResourcesRefresher;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,28 +43,43 @@
 import javax.inject.Singleton;
 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.MediaType;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 @Singleton
+@SuppressWarnings("unchecked")
 public class ApplicationResource extends AbstractSliderResource {
   private static final Logger log =
       LoggerFactory.getLogger(ApplicationResource.class);
 
   public static final int LIFESPAN = 1000;
+  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");
   private final ContentCache cache = new ContentCache();
+  private final StateAccessForProviders state;
 
   public ApplicationResource(WebAppApi slider) {
     super(slider);
-    StateAccessForProviders state = slider.getAppState();
+    state = slider.getAppState();
     cache.put(RestPaths.LIVE_RESOURCES,
         new CachedContent<ConfTree>(LIFESPAN,
             new LiveResourcesRefresher(state)));
     cache.put(RestPaths.LIVE_CONTAINERS,
         new CachedContent<Map<String, SerializedContainerInformation>>(LIFESPAN,
-            new ContainerListRefresher(state)));
+            new LiveContainersRefresher(state)));
+    cache.put(RestPaths.LIVE_COMPONENTS,
+        new CachedContent<Map<String, SerializedComponentInformation>> (LIFESPAN,
+            new LiveComponentsRefresher(state)));
   }
 
   /**
@@ -64,7 +87,7 @@
    * @param elements elements
    * @return something that can be returned
    */
-  private List<String> toJsonList(String... elements) {
+  private static List<String> toJsonList(String... elements) {
     return Lists.newArrayList(elements);
   }
 
@@ -72,7 +95,7 @@
   @Path("/")
   @Produces({MediaType.APPLICATION_JSON})
   public List<String> getRoot() {
-    return toJsonList("model", "live", "actions");
+    return ROOT_ENTRIES;
   }
 
   @GET
@@ -86,12 +109,7 @@
   @Path("/live")
   @Produces({MediaType.APPLICATION_JSON})
   public List<String> getLive() {
-    return toJsonList("resources",
-        "containers",
-        "components",
-        "nodes",
-        "statistics",
-        "internal");
+    return LIVE_ENTRIES;
   }
 
   @GET
@@ -104,6 +122,7 @@
       throw buildException(RestPaths.LIVE_RESOURCES, e);
     }
   }
+  
   @GET
   @Path(RestPaths.LIVE_CONTAINERS)
   @Produces({MediaType.APPLICATION_JSON})
@@ -116,4 +135,65 @@
     }
   }
 
+  @GET
+  @Path(RestPaths.LIVE_CONTAINERS + "/{containerId}")
+  @Produces({MediaType.APPLICATION_JSON})
+  public SerializedContainerInformation getLiveContainer(
+      @PathParam("containerId") String containerId) {
+    try {
+      RoleInstance id = state.getLiveInstanceByContainerID(containerId);
+      return id.serialize();
+    } catch (NoSuchNodeException e) {
+      throw new NotFoundException("Unknown container: " + containerId);
+    } catch (Exception e) {
+      throw buildException(RestPaths.LIVE_CONTAINERS + "/"+ containerId, e);
+    }
+  }
+
+  @GET
+  @Path(RestPaths.LIVE_COMPONENTS)
+  @Produces({MediaType.APPLICATION_JSON})
+  public Map<String, SerializedComponentInformation> getLiveComponents() {
+    try {
+      return (Map<String, SerializedComponentInformation>) cache.lookup(
+          RestPaths.LIVE_COMPONENTS);
+    } catch (Exception e) {
+      throw buildException(RestPaths.LIVE_COMPONENTS, e);
+    }
+  }
+  
+  @GET
+  @Path(RestPaths.LIVE_COMPONENTS+"/{component}")
+  @Produces({MediaType.APPLICATION_JSON})
+  public SerializedComponentInformation getLiveComponent(
+      @PathParam("component") String component) {
+    try {
+      RoleStatus roleStatus = state.lookupRoleStatus(component);
+      SerializedComponentInformation info = roleStatus.serialize();
+      List<RoleInstance> containers = lookupRoleContainers(component);
+      info.containers = new ArrayList<String>(containers.size());
+      for (RoleInstance container : containers) {
+        info.containers.add(container.id);
+      }
+      return info;
+    } catch (YarnRuntimeException e) {
+      throw new NotFoundException("Unknown component: " + component);
+    } catch (Exception e) {
+      throw buildException(RestPaths.LIVE_CONTAINERS, e);
+    }
+  }
+  
+  List<RoleInstance> lookupRoleContainers(String component) {
+    RoleStatus roleStatus = state.lookupRoleStatus(component);
+    List<RoleInstance> ownedContainerList = state.cloneOwnedContainerList();
+    List<RoleInstance> matching = new ArrayList<RoleInstance>(ownedContainerList.size());
+    int roleId = roleStatus.getPriority();
+    for (RoleInstance instance : ownedContainerList) {
+      if (instance.roleId == roleId) {
+        matching.add(instance);
+      }
+    }
+    return matching;
+  }
+  
 }
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
new file mode 100644
index 0000000..e543265
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveComponentsRefresher.java
@@ -0,0 +1,52 @@
+/*
+ * 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.SerializedComponentInformation;
+import org.apache.slider.server.appmaster.state.RoleStatus;
+import org.apache.slider.server.appmaster.state.StateAccessForProviders;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class LiveComponentsRefresher
+    implements ResourceRefresher<Map<String, SerializedComponentInformation>> {
+
+  private final StateAccessForProviders state;
+
+  public LiveComponentsRefresher(StateAccessForProviders state) {
+    this.state = state;
+  }
+
+  @Override
+  public Map<String, SerializedComponentInformation> refresh() {
+
+    Map<Integer, RoleStatus> roleStatusMap = state.getRoleStatusMap();
+    Map<String, SerializedComponentInformation> results =
+        new HashMap<String, SerializedComponentInformation>(
+            roleStatusMap.size());
+
+    for (RoleStatus status : roleStatusMap.values()) {
+      String name = status.getName();
+      SerializedComponentInformation info = status.serialize();
+      results.put(name, info);
+    }
+    return results;
+  }
+}
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ContainerListRefresher.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveContainersRefresher.java
similarity index 90%
rename from slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ContainerListRefresher.java
rename to slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveContainersRefresher.java
index 7e74062..39a543b 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/ContainerListRefresher.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/resources/LiveContainersRefresher.java
@@ -29,11 +29,11 @@
 /**
  * Refresh the container list.
  */
-public class ContainerListRefresher implements ResourceRefresher<Map<String, SerializedContainerInformation>> {
+public class LiveContainersRefresher implements ResourceRefresher<Map<String, SerializedContainerInformation>> {
 
   private final StateAccessForProviders state;
 
-  public ContainerListRefresher(StateAccessForProviders state) {
+  public LiveContainersRefresher(StateAccessForProviders state) {
     this.state = state;
   }
 
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy
index 4312cf3..2ad7129 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy
@@ -21,9 +21,12 @@
 import groovy.transform.CompileStatic
 import groovy.util.logging.Slf4j
 import org.apache.hadoop.yarn.api.records.ApplicationReport
+import org.apache.hadoop.yarn.webapp.NotFoundException
 import org.apache.slider.agent.AgentMiniClusterTestBase
 import org.apache.slider.api.StateValues
+import org.apache.slider.api.types.SerializedComponentInformation
 import org.apache.slider.api.types.SerializedContainerInformation
+import org.apache.slider.server.appmaster.web.rest.application.ApplicationResource
 
 import static org.apache.slider.api.ResourceKeys.*
 import static org.apache.slider.api.StatusKeys.*
@@ -118,21 +121,65 @@
 
     describe "Application REST ${LIVE_CONTAINERS}"
 
-    Map<String, SerializedContainerInformation> map =
+    Map<String, SerializedContainerInformation> containers =
         fetchType(HashMap, appmaster, LIVE_CONTAINERS)
-    assert map.size() == 1
-    log.info "${map}"
-    SerializedContainerInformation info = (SerializedContainerInformation) map.values()[0]
-    assert info.containerId
-    assert map[info.containerId]
+    assert containers.size() == 1
+    log.info "${containers}"
+    SerializedContainerInformation amContainerInfo = (SerializedContainerInformation) containers.values()[0]
+    assert amContainerInfo.containerId
 
-    assert info.component == COMPONENT_AM
-    assert info.createTime > 0
-    assert info.exitCode == null
-    assert info.output == null
-    assert info.released == null
-    assert info.state == StateValues.STATE_LIVE
+    def amContainerId = amContainerInfo.containerId
+    assert containers[amContainerId]
+
+    assert amContainerInfo.component == COMPONENT_AM
+    assert amContainerInfo.createTime > 0
+    assert amContainerInfo.exitCode == null
+    assert amContainerInfo.output == null
+    assert amContainerInfo.released == null
+    assert amContainerInfo.state == StateValues.STATE_LIVE
+   
+    describe "base entry lists"
+    def list = fetchType(ArrayList, appmaster, LIVE)
+
+    def live_entries = ApplicationResource.LIVE_ENTRIES
+    assert list.size() == live_entries.size()
+    live_entries.containsAll(list)
     
+    describe "containers"
+
+    SerializedContainerInformation retrievedContainerInfo =
+        fetchType(SerializedContainerInformation, appmaster,
+            LIVE_CONTAINERS +"/${amContainerId}")
+    assert retrievedContainerInfo.containerId == amContainerId
+    
+    // fetch missing
+    try {
+      def result = fetchType(SerializedContainerInformation, appmaster,
+          LIVE_CONTAINERS + "/unknown")
+      fail("expected an error, got $result")
+    } catch (NotFoundException e) {
+      // expected
+    }
+
+    describe "components"
+
+    Map<String, SerializedComponentInformation> components =
+        fetchType(HashMap, appmaster, LIVE_COMPONENTS)
+    // two components
+    assert components.size() == 1
+    log.info "${components}"
+
+    SerializedComponentInformation amComponentInfo =
+        (SerializedComponentInformation)components[COMPONENT_AM]
+
+    SerializedComponentInformation amFullInfo = fetchType(
+        SerializedComponentInformation,
+        appmaster,
+        LIVE_COMPONENTS +"/${COMPONENT_AM}")
+
+    assert amFullInfo.containers.size() == 1
+    assert amFullInfo.containers[0] == amContainerId
+
   }
 
 
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 c188b9c..712445d 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,10 +19,6 @@
 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
@@ -36,7 +32,7 @@
 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.LiveContainersRefresher
 import org.apache.slider.server.appmaster.web.rest.application.resources.ContentCache
 import org.apache.slider.server.appmaster.web.rest.application.resources.ResourceRefresher
 import org.junit.Test
@@ -73,7 +69,7 @@
 
   @Test
   public void testContainerListRefresher() throws Throwable {
-    ContainerListRefresher clr = new ContainerListRefresher(stateAccess)
+    LiveContainersRefresher clr = new LiveContainersRefresher(stateAccess)
     def map = clr.refresh()
     assert map.size() == 0
     List<RoleInstance> instances = startNodes()