You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ad...@apache.org on 2017/05/23 10:34:36 UTC

[38/49] ambari git commit: AMBARI-20994. Integrate RootServiceService with Swagger (adoroszlai)

AMBARI-20994. Integrate RootServiceService with Swagger (adoroszlai)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/228b9289
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/228b9289
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/228b9289

Branch: refs/heads/trunk
Commit: 228b9289755c33342586d8cbe209b5341d7380d0
Parents: 580067f
Author: Attila Doroszlai <ad...@hortonworks.com>
Authored: Tue May 16 11:02:06 2017 +0200
Committer: Attila Doroszlai <ad...@hortonworks.com>
Committed: Tue May 16 11:02:06 2017 +0200

----------------------------------------------------------------------
 .../ambari/server/api/services/BaseService.java |   2 +
 .../server/api/services/RootServiceService.java | 363 ++++++++++++++-----
 .../AmbariManagementControllerImpl.java         |   5 -
 .../RootServiceComponentResponse.java           |  56 ++-
 .../RootServiceHostComponentResponse.java       |  72 ++--
 .../server/controller/RootServiceResponse.java  |  24 +-
 .../controller/RootServiceResponseFactory.java  |  30 +-
 .../internal/HostResourceProvider.java          |   8 +-
 .../RootServiceComponentResourceProvider.java   |  63 ++--
 ...ootServiceHostComponentResourceProvider.java |  70 ++--
 .../internal/RootServiceResourceProvider.java   |  20 +-
 .../api/services/RootServiceServiceTest.java    |  11 +-
 .../RootServiceResponseFactoryTest.java         |   9 +-
 ...ootServiceComponentResourceProviderTest.java |  21 +-
 14 files changed, 456 insertions(+), 298 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java
index 2808911..5f6474c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java
@@ -86,6 +86,8 @@ public abstract class BaseService {
   static final String PARAM_TYPE_BODY = "body";
 
 
+  static final String FIELDS_SEPARATOR = ", ";
+
   /**
    * Logger instance.
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java
index ce9240c..5afb7dc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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
@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.ws.rs.GET;
@@ -28,137 +29,325 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.controller.ApiModel;
+import org.apache.ambari.server.controller.HostResponse;
+import org.apache.ambari.server.controller.RootServiceComponentResponse;
+import org.apache.ambari.server.controller.RootServiceHostComponentResponse;
+import org.apache.ambari.server.controller.RootServiceResponse;
+import org.apache.ambari.server.controller.internal.HostResourceProvider;
+import org.apache.ambari.server.controller.internal.RootServiceComponentResourceProvider;
+import org.apache.ambari.server.controller.internal.RootServiceHostComponentResourceProvider;
+import org.apache.ambari.server.controller.internal.RootServiceResourceProvider;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.http.HttpStatus;
 
-@Path("/services/")
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
+@Path("/services")
+@Api(value = "/services", description = "Endpoint for querying root-level services, ie. Ambari Server and Ambari Agents")
 public class RootServiceService extends BaseService {
-  
-  @GET
-  @Produces("text/plain")
-  public Response getServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
 
-    return handleRequest(headers, body, ui, Request.Type.GET,
-      createServiceResource(null));
+  private static final String KEY_COMPONENTS = "components";
+  private static final String KEY_HOST_COMPONENTS = "hostComponents";
+
+  private static final String DEFAULT_FIELDS_ROOT_SERVICES =
+    RootServiceResourceProvider.SERVICE_NAME_PROPERTY_ID;
+
+  private static final String DEFAULT_FIELDS_ROOT_SERVICE =
+    RootServiceResourceProvider.SERVICE_NAME_PROPERTY_ID + FIELDS_SEPARATOR +
+      KEY_COMPONENTS + PropertyHelper.EXTERNAL_PATH_SEP + RootServiceComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID + FIELDS_SEPARATOR +
+      KEY_COMPONENTS + PropertyHelper.EXTERNAL_PATH_SEP + RootServiceComponentResourceProvider.SERVICE_NAME_PROPERTY_ID;
+
+  private static final String DEFAULT_FIELDS_ROOT_SERVICE_COMPONENTS =
+    RootServiceComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID + FIELDS_SEPARATOR +
+    RootServiceComponentResourceProvider.SERVICE_NAME_PROPERTY_ID;
+
+  private static final String DEFAULT_FIELDS_ROOT_SERVICE_COMPONENT =
+    RootServiceComponentResourceProvider.ALL_PROPERTIES + FIELDS_SEPARATOR +
+    KEY_HOST_COMPONENTS + PropertyHelper.EXTERNAL_PATH_SEP + RootServiceHostComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID + FIELDS_SEPARATOR +
+    KEY_HOST_COMPONENTS + PropertyHelper.EXTERNAL_PATH_SEP + RootServiceHostComponentResourceProvider.HOST_NAME_PROPERTY_ID + FIELDS_SEPARATOR +
+    KEY_HOST_COMPONENTS + PropertyHelper.EXTERNAL_PATH_SEP + RootServiceHostComponentResourceProvider.SERVICE_NAME_PROPERTY_ID;
+
+  private static final String DEFAULT_FIELDS_ROOT_SERVICE_HOST_COMPONENT =
+    RootServiceHostComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID + FIELDS_SEPARATOR +
+    RootServiceHostComponentResourceProvider.HOST_NAME_PROPERTY_ID + FIELDS_SEPARATOR +
+    RootServiceHostComponentResourceProvider.SERVICE_NAME_PROPERTY_ID;
+
+  private static final String DEFAULT_FIELDS_HOSTS =
+    HostResourceProvider.HOST_HOST_NAME_PROPERTY_ID;
+
+  private static final String DEFAULT_FIELDS_HOST =
+    HostResourceProvider.ALL_PROPERTIES;
+
+  @GET
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns the list of root-level services",
+    response = RootServiceResponseWrapper.class, responseContainer = RESPONSE_CONTAINER_LIST)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_ROOT_SERVICES),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
+  public Response getRootServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
+    ResourceInstance resource = createServiceResource(null);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
   }
   
   @GET
   @Path("{serviceName}")
-  @Produces("text/plain")
-  public Response getService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-      @PathParam("serviceName") String serviceName) {
-
-    return handleRequest(headers, body, ui, Request.Type.GET,
-      createServiceResource(serviceName));
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns information about the given root-level service, including a list of its components",
+    response = RootServiceResponseWithComponentList.class)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_ROOT_SERVICE),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
+  public Response getRootService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+    @ApiParam(value = "service name", required = true) @PathParam("serviceName") String serviceName
+  ) {
+    ResourceInstance resource = createServiceResource(serviceName);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
   }
 
   @GET
-  @Path("{serviceName}/components/{componentName}/hostComponents")
-  @Produces("text/plain")
-  public Response getRootHostComponents(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-      @PathParam("serviceName") String serviceName,
-      @PathParam("componentName") String componentName) {
-
-    return handleRequest(headers, body, ui, Request.Type.GET,
-      createHostComponentResource(serviceName, null, componentName));
-  }
-  
-  
-  @GET
-  @Path("{serviceName}/hosts/")
-  @Produces("text/plain")
+  @Path("{serviceName}/hosts")
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns the list of hosts for the given root-level service",
+    response = HostResponse.Wrapper.class, responseContainer = RESPONSE_CONTAINER_LIST)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_HOSTS),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
   public Response getRootHosts(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
-
-    return handleRequest(headers, body, ui, Request.Type.GET,
-      createHostResource(null));
+    ResourceInstance resource = createHostResource(null);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
   }
   
   @GET
   @Path("{serviceName}/hosts/{hostName}")
-  @Produces("text/plain")
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns information about the given host", response = HostResponse.Wrapper.class)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_HOST),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
   public Response getRootHost(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-      @PathParam("hostName") String hostName) {
-
-    return handleRequest(headers, body, ui, Request.Type.GET,
-      createHostResource(hostName));
+    @ApiParam(value = "host name", required = true) @PathParam("hostName") String hostName
+  ) {
+    ResourceInstance resource = createHostResource(hostName);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
   }
   
+  @GET
+  @Path("{serviceName}/hosts/{hostName}/hostComponents")
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns the list of components for the given root-level service on the given host",
+    response = RootServiceHostComponentResponseWrapper.class, responseContainer = RESPONSE_CONTAINER_LIST)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_ROOT_SERVICE_HOST_COMPONENT),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
+  public Response getRootServiceHostComponents(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+    @ApiParam(value = "service name", required = true) @PathParam("serviceName") String serviceName,
+    @ApiParam(value = "host name", required = true) @PathParam("hostName") String hostName
+  ) {
+    ResourceInstance resource = createHostComponentResource(serviceName, hostName, null);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
+  }
   
-  protected ResourceInstance createHostResource(String hostName) {
-    return createResource(Resource.Type.Host, Collections.singletonMap(Resource.Type.Host, hostName));
+  @GET
+  @Path("{serviceName}/hosts/{hostName}/hostComponents/{hostComponent}")
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns information about the given component for the given root-level service on the given host",
+    response = RootServiceHostComponentResponseWrapper.class)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_ROOT_SERVICE_HOST_COMPONENT),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
+  public Response getRootServiceHostComponent(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+    @ApiParam(value = "service name", required = true) @PathParam("serviceName") String serviceName,
+    @ApiParam(value = "host name", required = true) @PathParam("hostName") String hostName,
+    @ApiParam(value = "component name", required = true) @PathParam("hostComponent") String hostComponent
+  ) {
+    ResourceInstance resource = createHostComponentResource(serviceName, hostName, hostComponent);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
   }
-
   
   @GET
-  @Path("{serviceName}/hosts/{hostName}/hostComponents/")
-  @Produces("text/plain")
-  public Response getRootHostComponent(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-      @PathParam("serviceName") String serviceName,
-      @PathParam("hostName") String hostName) {
-
-    return handleRequest(headers, body, ui, Request.Type.GET,
-      createHostComponentResource(serviceName, hostName, null));
+  @Path("{serviceName}/components")
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns the list of components for the given root-level service",
+    response = RootServiceComponentResponseWrapper.class, responseContainer = RESPONSE_CONTAINER_LIST)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_ROOT_SERVICE_COMPONENTS),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
+  public Response getRootServiceComponents(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+    @ApiParam(value = "service name", required = true) @PathParam("serviceName") String serviceName
+  ) {
+    ResourceInstance resource = createServiceComponentResource(serviceName, null);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
   }
   
   @GET
-  @Path("{serviceName}/hosts/{hostName}/hostComponents/{hostComponent}")
-  @Produces("text/plain")
-  public Response getRootHostComponent(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-      @PathParam("serviceName") String serviceName,
-      @PathParam("hostName") String hostName,
-      @PathParam("hostComponent") String hostComponent) {
+  @Path("{serviceName}/components/{componentName}")
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns information about the given component for the given root-level service",
+    response = RootServiceComponentWithHostComponentList.class)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_ROOT_SERVICE_COMPONENT),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
+  public Response getRootServiceComponent(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+    @ApiParam(value = "service name", required = true) @PathParam("serviceName") String serviceName,
+    @ApiParam(value = "component name", required = true) @PathParam("componentName") String componentName
+  ) {
+    ResourceInstance resource = createServiceComponentResource(serviceName, componentName);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
+  }
+
+  @GET
+  @Path("{serviceName}/components/{componentName}/hostComponents")
+  @Produces(MediaType.TEXT_PLAIN)
+  @ApiOperation(value = "Returns the list of hosts for the given root-level service component",
+    response = RootServiceHostComponentResponseWrapper.class, responseContainer = RESPONSE_CONTAINER_LIST)
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY,
+      defaultValue = DEFAULT_FIELDS_ROOT_SERVICE_HOST_COMPONENT),
+  })
+  @ApiResponses({
+    @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION),
+    @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED),
+    @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED),
+    @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND),
+    @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR),
+  })
+  public Response getRootServiceComponentHosts(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+    @ApiParam(value = "service name", required = true) @PathParam("serviceName") String serviceName,
+    @ApiParam(value = "component name", required = true) @PathParam("componentName") String componentName
+  ) {
+    ResourceInstance resource = createHostComponentResource(serviceName, null, componentName);
+    return handleRequest(headers, body, ui, Request.Type.GET, resource);
+  }
 
-    return handleRequest(headers, body, ui, Request.Type.GET,
-      createHostComponentResource(serviceName, hostName, hostComponent));
+  protected ResourceInstance createServiceResource(String serviceName) {
+    Map<Resource.Type, String> mapIds = Collections.singletonMap(Resource.Type.RootService, serviceName);
+    return createResource(Resource.Type.RootService, mapIds);
   }
   
-  
+  protected ResourceInstance createServiceComponentResource(String serviceName, String componentName) {
+    Map<Resource.Type, String> mapIds = new HashMap<>();
+    mapIds.put(Resource.Type.RootService, serviceName);
+    mapIds.put(Resource.Type.RootServiceComponent, componentName);
+    return createResource(Resource.Type.RootServiceComponent, mapIds);
+  }
+
+  protected ResourceInstance createHostResource(String hostName) {
+    return createResource(Resource.Type.Host, Collections.singletonMap(Resource.Type.Host, hostName));
+  }
+
   protected ResourceInstance createHostComponentResource(String serviceName, String hostName, String componentName) {
-    
-    Map<Resource.Type,String> mapIds = new HashMap<>();
+    Map<Resource.Type, String> mapIds = new HashMap<>();
     mapIds.put(Resource.Type.RootService, serviceName);
     mapIds.put(Resource.Type.Host, hostName);
     mapIds.put(Resource.Type.RootServiceComponent, componentName);
-
     return createResource(Resource.Type.RootServiceHostComponent, mapIds);
   }
 
-  @GET
-  @Path("{serviceName}/components/")
-  @Produces("text/plain")
-  public Response getServiceComponents(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-      @PathParam("serviceName") String serviceName) {
+  private interface RootServiceResponseWrapper extends ApiModel {
+    @ApiModelProperty(name = RootServiceResourceProvider.RESPONSE_KEY)
+    @SuppressWarnings("unused")
+    RootServiceResponse getRootServiceResponse();
+  }
 
-    return handleRequest(headers, body, ui, Request.Type.GET,
-      createServiceComponentResource(serviceName, null));
+  private interface RootServiceResponseWithComponentList extends RootServiceResponseWrapper {
+    @ApiModelProperty(name = KEY_COMPONENTS)
+    @SuppressWarnings("unused")
+    List<RootServiceComponentResponseWrapper> getComponents();
   }
-  
-  @GET
-  @Path("{serviceName}/components/{componentName}")
-  @Produces("text/plain")
-  public Response getServiceComponent(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-      @PathParam("serviceName") String serviceName,
-      @PathParam("componentName") String componentName) {
 
-    return handleRequest(headers, body, ui, Request.Type.GET,
-        createServiceComponentResource(serviceName, componentName));
+  private interface RootServiceComponentResponseWrapper extends ApiModel {
+    @ApiModelProperty(name = RootServiceComponentResourceProvider.RESPONSE_KEY)
+    @SuppressWarnings("unused")
+    RootServiceComponentResponse getRootServiceComponentResponse();
   }
-  
-  protected ResourceInstance createServiceResource(String serviceName) {
-    return createResource(Resource.Type.RootService,
-        Collections.singletonMap(Resource.Type.RootService, serviceName));
+
+  private interface RootServiceComponentWithHostComponentList extends RootServiceComponentResponseWrapper {
+    @ApiModelProperty(name = KEY_HOST_COMPONENTS)
+    @SuppressWarnings("unused")
+    List<RootServiceHostComponentResponseWrapper> getHostComponents();
   }
-  
-  protected ResourceInstance createServiceComponentResource(String serviceName,
-      String componentName) {
-    
-    Map<Resource.Type,String> mapIds = new HashMap<>();
-    mapIds.put(Resource.Type.RootService, serviceName);
-    mapIds.put(Resource.Type.RootServiceComponent, componentName);
 
-    return createResource(Resource.Type.RootServiceComponent, mapIds);
+  private interface RootServiceHostComponentResponseWrapper extends ApiModel {
+    @ApiModelProperty(name = RootServiceHostComponentResourceProvider.RESPONSE_KEY)
+    @SuppressWarnings("unused")
+    RootServiceHostComponentResponse getRootServiceHostComponentResponse();
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 751ce08..4c8154e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -4839,11 +4839,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
       String serviceName  = request.getServiceName();
       try {
         Set<RootServiceComponentResponse> rootServiceComponents = getRootServiceComponents(request);
-
-        for (RootServiceComponentResponse serviceComponentResponse : rootServiceComponents) {
-          serviceComponentResponse.setServiceName(serviceName);
-        }
-
         response.addAll(rootServiceComponents);
       } catch (AmbariException e) {
         if (requests.size() == 1) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java
index 4845c78..11fc0fd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java
@@ -15,71 +15,69 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-
 package org.apache.ambari.server.controller;
 
 import java.util.Map;
+import java.util.Objects;
+
+import org.apache.ambari.server.controller.internal.RootServiceComponentResourceProvider;
+
+import io.swagger.annotations.ApiModelProperty;
 
 public class RootServiceComponentResponse {
 
-  private String serviceName;
-  private String componentName;
-  private Map<String, String> properties;
-  private String componentVersion;
+  private final String serviceName;
+  private final String componentName;
+  private final Map<String, String> properties;
+  private final String componentVersion;
+  private final long serverClock = System.currentTimeMillis() / 1000L;
 
-  public RootServiceComponentResponse(String componentName, String componentVersion, Map<String, String> properties) {
+  public RootServiceComponentResponse(String serviceName, String componentName, String componentVersion, Map<String, String> properties) {
+    this.serviceName = serviceName;
     this.componentName = componentName;
-    this.setComponentVersion(componentVersion); 
-    this.setProperties(properties);
-    
+    this.componentVersion = componentVersion;
+    this.properties = properties;
   }
 
+  @ApiModelProperty(name = RootServiceComponentResourceProvider.SERVICE_NAME)
   public String getServiceName() {
     return serviceName;
   }
 
-  public void setServiceName(String serviceName) {
-    this.serviceName = serviceName;
-  }
-
+  @ApiModelProperty(name = RootServiceComponentResourceProvider.COMPONENT_NAME)
   public String getComponentName() {
     return componentName;
   }
 
+  @ApiModelProperty(name = RootServiceComponentResourceProvider.PROPERTIES)
   public Map<String, String> getProperties() {
     return properties;
   }
 
-  public void setProperties(Map<String, String> properties) {
-    this.properties = properties;
-  }
-  
+  @ApiModelProperty(name = RootServiceComponentResourceProvider.COMPONENT_VERSION)
   public String getComponentVersion() {
     return componentVersion;
   }
 
-  public void setComponentVersion(String componentVersion) {
-    this.componentVersion = componentVersion;
-  }
+  @ApiModelProperty(name = RootServiceComponentResourceProvider.SERVER_CLOCK)
+  public long getServerClock() { return serverClock; }
   
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;
 
-    RootServiceComponentResponse that = (RootServiceComponentResponse) o;
-
-    return !(componentName != null ? !componentName.equals(that.componentName) : that.componentName != null) &&
-        !(componentVersion != null ? !componentVersion.equals(that.componentVersion) : that.componentVersion != null) &&
-        !(properties != null ? !properties.equals(that.properties) : that.properties != null);
+    RootServiceComponentResponse other = (RootServiceComponentResponse) o;
 
+    return Objects.equals(serviceName, other.serviceName) &&
+      Objects.equals(componentName, other.componentName) &&
+      Objects.equals(componentVersion, other.componentVersion) &&
+      Objects.equals(properties, other.properties);
   }
 
   @Override
   public int hashCode() {
-    int result = 31 + (componentName != null ? componentName.hashCode() : 0);
-    result += (componentVersion != null ? componentVersion.hashCode() : 0);
-    return result;
+    return Objects.hash(serviceName, componentName, componentVersion);
   }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java
index 6cbc30c..6f35610 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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
@@ -19,20 +19,25 @@
 package org.apache.ambari.server.controller;
 
 import java.util.Map;
+import java.util.Objects;
 
-public class RootServiceHostComponentResponse {
+import org.apache.ambari.server.controller.internal.RootServiceHostComponentResourceProvider;
+
+import io.swagger.annotations.ApiModelProperty;
 
-  private String serviceName;
-  private String hostName;
-  private String componentName;
-  private String componentState;
-  private String componentVersion;
-  private Map<String, String> properties;
+public class RootServiceHostComponentResponse {
 
+  private final String serviceName;
+  private final String hostName;
+  private final String componentName;
+  private final String componentState;
+  private final String componentVersion;
+  private final Map<String, String> properties;
 
-  public RootServiceHostComponentResponse(String hostName, String componentName, String componentState,
+  public RootServiceHostComponentResponse(String serviceName, String hostName, String componentName, String componentState,
       String componentVersion,
       Map<String, String> properties) {
+    this.serviceName = serviceName;
     this.hostName = hostName;
     this.componentName = componentName;
     this.componentState = componentState;
@@ -40,63 +45,54 @@ public class RootServiceHostComponentResponse {
     this.properties = properties;
   }
 
+  @ApiModelProperty(name = RootServiceHostComponentResourceProvider.SERVICE_NAME)
   public String getServiceName() {
     return serviceName;
   }
 
-  public void setServiceName(String serviceName) {
-    this.serviceName = serviceName;
-  }
-
+  @ApiModelProperty(name = RootServiceHostComponentResourceProvider.HOST_NAME)
   public String getHostName() {
     return hostName;
   }
 
+  @ApiModelProperty(name = RootServiceHostComponentResourceProvider.COMPONENT_NAME)
   public String getComponentName() {
     return componentName;
   }
 
-  public void setComponentName(String componentName) {
-    this.componentName = componentName;
+  @ApiModelProperty(name = RootServiceHostComponentResourceProvider.COMPONENT_STATE)
+  public String getComponentState() {
+    return componentState;
+  }
+
+  @ApiModelProperty(name = RootServiceHostComponentResourceProvider.COMPONENT_VERSION)
+  public String getComponentVersion() {
+    return componentVersion;
   }
 
+  @ApiModelProperty(name = RootServiceHostComponentResourceProvider.PROPERTIES)
   public Map<String, String> getProperties() {
     return properties;
   }
 
-  public void setProperties(Map<String, String> properties) {
-    this.properties = properties;
-  }
-  
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;
 
-    RootServiceHostComponentResponse that = (RootServiceHostComponentResponse) o;
-
-    return !(hostName != null ? !hostName.equals(that.hostName) : that.hostName != null) &&
-        !(componentName != null ? !componentName.equals(that.componentName) : that.componentName != null) &&
-        !(componentState != null ? !componentState.equals(that.componentState) : that.componentState != null) &&
-        !(componentVersion != null ? !componentVersion.equals(that.componentVersion) : that.componentVersion != null) &&
-        !(properties != null ? !properties.equals(that.properties) : that.properties != null);
+    RootServiceHostComponentResponse other = (RootServiceHostComponentResponse) o;
 
+    return Objects.equals(serviceName, other.serviceName) &&
+      Objects.equals(hostName, other.hostName) &&
+      Objects.equals(componentName, other.componentName) &&
+      Objects.equals(componentState, other.componentState) &&
+      Objects.equals(componentVersion, other.componentVersion) &&
+      Objects.equals(properties, other.properties);
   }
 
   @Override
   public int hashCode() {
-    int result = 31 + (hostName != null ? hostName.hashCode() : 0);
-    result = result + (componentName != null ? componentName.hashCode() : 0);
-    result = result + (componentState != null ? componentState.hashCode() : 0);
-    result = result + (componentVersion != null ? componentVersion.hashCode() : 0);
-    return result;
-  }
-
-  public String getComponentState() {
-    return componentState;
+    return Objects.hash(serviceName, hostName, componentName, componentVersion, componentState);
   }
 
-  public String getComponentVersion() {
-    return componentVersion;
-  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponse.java
index 736ffff..43b8950 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponse.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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
@@ -18,14 +18,21 @@
 
 package org.apache.ambari.server.controller;
 
+import java.util.Objects;
+
+import org.apache.ambari.server.controller.internal.RootServiceResourceProvider;
+
+import io.swagger.annotations.ApiModelProperty;
+
 public class RootServiceResponse {
 
-  private String serviceName;
+  private final String serviceName;
 
   public RootServiceResponse(String serviceName) {
     this.serviceName = serviceName;
   }
 
+  @ApiModelProperty(name = RootServiceResourceProvider.SERVICE_NAME)
   public String getServiceName() {
     return serviceName;
   }
@@ -35,21 +42,14 @@ public class RootServiceResponse {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;
 
-    RootServiceResponse that = (RootServiceResponse) o;
+    RootServiceResponse other = (RootServiceResponse) o;
 
-    if (serviceName != null ?
-        !serviceName.equals(that.serviceName) : that.serviceName != null) {
-      return false;
-    }
-    
-    return true;
+    return Objects.equals(serviceName, other.serviceName);
   }
 
   @Override
   public int hashCode() {
-    int result = 1;
-    result = 31 + (serviceName != null ? serviceName.hashCode() : 0);
-    return result;
+    return Objects.hash(serviceName);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java
index 2ceb769..714fbed 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java
@@ -84,7 +84,7 @@ public class RootServiceResponseFactory extends
   public Set<RootServiceComponentResponse> getRootServiceComponents(
       RootServiceComponentRequest request) throws ObjectNotFoundException {
     Set<RootServiceComponentResponse> response = new HashSet<>();
-    
+
     String serviceName = request.getServiceName();
     String componentName = request.getComponentName();
     Services service;
@@ -109,13 +109,13 @@ public class RootServiceResponseFactory extends
       catch (IllegalArgumentException ex) {
         throw new ObjectNotFoundException("Component name: " + componentName);
       }
-      response = Collections.singleton(new RootServiceComponentResponse(component.toString(),
+      response = Collections.singleton(new RootServiceComponentResponse(serviceName, component.toString(),
                                        getComponentVersion(componentName, null),
                                        getComponentProperties(componentName)));
     } else {
     
       for (Components component: service.getComponents())    
-        response.add(new RootServiceComponentResponse(component.toString(),
+        response.add(new RootServiceComponentResponse(serviceName, component.toString(),
                      getComponentVersion(component.name(), null),
                      getComponentProperties(component.name())));
       }
@@ -198,8 +198,10 @@ public class RootServiceResponseFactory extends
   public Set<RootServiceHostComponentResponse> getRootServiceHostComponent(RootServiceHostComponentRequest request, Set<HostResponse> hosts) throws AmbariException {
     Set<RootServiceHostComponentResponse> response = new HashSet<>();
 
-    Set<RootServiceComponentResponse> rootServiceComponents = 
-        getRootServiceComponents(new RootServiceComponentRequest(request.getServiceName(), request.getComponentName()));
+    String serviceName = request.getServiceName();
+    String componentName = request.getComponentName();
+    Set<RootServiceComponentResponse> rootServiceComponents =
+        getRootServiceComponents(new RootServiceComponentRequest(serviceName, componentName));
 
     //Cartesian product with hosts and components
     for (RootServiceComponentResponse component : rootServiceComponents) {
@@ -207,7 +209,7 @@ public class RootServiceResponseFactory extends
       Set<HostResponse> filteredHosts = new HashSet<>(hosts);
       
       //Make some filtering of hosts if need
-      if (component.getComponentName().equals(Components.AMBARI_SERVER.name()))
+      if (component.getComponentName().equals(Components.AMBARI_SERVER.name())) {
         CollectionUtils.filter(filteredHosts, new Predicate() {
           @Override
           public boolean evaluate(Object arg0) {
@@ -215,15 +217,17 @@ public class RootServiceResponseFactory extends
             return hostResponse.getHostname().equals(StageUtils.getHostName());
           }
         });
+      }
       
       for (HostResponse host : filteredHosts) {
-        
-        if (component.getComponentName().equals(Components.AMBARI_SERVER.name()))
-          response.add(new RootServiceHostComponentResponse(host.getHostname(), component.getComponentName(),
-            RUNNING_STATE, getComponentVersion(component.getComponentName(), host), component.getProperties()));
-        else
-          response.add(new RootServiceHostComponentResponse(host.getHostname(), component.getComponentName(),
-            host.getHostState().toString(), getComponentVersion(component.getComponentName(), host), component.getProperties()));
+        String state;
+        if (component.getComponentName().equals(Components.AMBARI_SERVER.name())) {
+          state = RUNNING_STATE;
+        } else {
+          state = host.getHostState().toString();
+        }
+        String componentVersion = getComponentVersion(componentName, host);
+        response.add(new RootServiceHostComponentResponse(serviceName, host.getHostname(), componentName, state, componentVersion, component.getProperties()));
       }
     }
     

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
index 8a78911..747aac3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
@@ -73,6 +73,7 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
@@ -88,6 +89,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
 
   // Hosts
   public static final String RESPONSE_KEY = "Hosts";
+  public static final String ALL_PROPERTIES = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "*";
 
   public static final String CLUSTER_NAME_PROPERTY_ID = "cluster_name";
   public static final String CPU_COUNT_PROPERTY_ID = "cpu_count";
@@ -145,9 +147,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
   protected static final String FORCE_DELETE_COMPONENTS = "force_delete_components";
 
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      HOST_HOST_NAME_PROPERTY_ID}));
+  private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(HOST_HOST_NAME_PROPERTY_ID);
 
   @Inject
   private OsFamily osFamily;
@@ -358,7 +358,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return PK_PROPERTY_IDS;
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
index fe95210..1397182 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -39,26 +38,26 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
-public class RootServiceComponentResourceProvider extends
-    ReadOnlyResourceProvider {
-  
-  public static final String SERVICE_NAME_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceComponents", "service_name");
-  
-  public static final String COMPONENT_NAME_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceComponents", "component_name");
-  
-  public static final String COMPONENT_VERSION_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceComponents", "component_version");
-  
-  public static final String PROPERTIES_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceComponents", "properties");
-  
-  public static final String PROPERTIES_SERVER_CLOCK = PropertyHelper
-      .getPropertyId("RootServiceComponents", "server_clock");
-  
-  private Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{SERVICE_NAME_PROPERTY_ID, COMPONENT_NAME_PROPERTY_ID}));
+import com.google.common.collect.ImmutableSet;
+
+public class RootServiceComponentResourceProvider extends ReadOnlyResourceProvider {
+
+  public static final String RESPONSE_KEY = "RootServiceComponents";
+  public static final String ALL_PROPERTIES = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "*";
+
+  public static final String SERVICE_NAME = "service_name";
+  public static final String COMPONENT_NAME = "component_name";
+  public static final String COMPONENT_VERSION = "component_version";
+  public static final String PROPERTIES = "properties";
+  public static final String SERVER_CLOCK = "server_clock";
+
+  public static final String SERVICE_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + SERVICE_NAME;
+  public static final String COMPONENT_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + COMPONENT_NAME;
+  public static final String COMPONENT_VERSION_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + COMPONENT_VERSION;
+  public static final String PROPERTIES_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + PROPERTIES;
+  public static final String SERVER_CLOCK_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + SERVER_CLOCK;
+
+  private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(SERVICE_NAME_PROPERTY_ID, COMPONENT_NAME_PROPERTY_ID);
 
   protected RootServiceComponentResourceProvider(Set<String> propertyIds,
       Map<Type, String> keyPropertyIds,
@@ -95,21 +94,13 @@ public class RootServiceComponentResourceProvider extends
     for (RootServiceComponentResponse response : responses) {
       Resource resource = new ResourceImpl(Resource.Type.RootServiceComponent);
 
-      setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID,
-          response.getServiceName(), requestedIds);
-      
-      setResourceProperty(resource, COMPONENT_NAME_PROPERTY_ID,
-          response.getComponentName(), requestedIds);
-      
-      setResourceProperty(resource, PROPERTIES_PROPERTY_ID,
-          response.getProperties(), requestedIds);
-      
-      setResourceProperty(resource, COMPONENT_VERSION_PROPERTY_ID,
-          response.getComponentVersion(), requestedIds);
+      setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
+      setResourceProperty(resource, COMPONENT_NAME_PROPERTY_ID, response.getComponentName(), requestedIds);
+      setResourceProperty(resource, PROPERTIES_PROPERTY_ID, response.getProperties(), requestedIds);
+      setResourceProperty(resource, COMPONENT_VERSION_PROPERTY_ID, response.getComponentVersion(), requestedIds);
       
-      if(response.getComponentName().equals(Components.AMBARI_SERVER.name())){
-        setResourceProperty(resource, PROPERTIES_SERVER_CLOCK,
-            System.currentTimeMillis() / 1000L, requestedIds);
+      if (Components.AMBARI_SERVER.name().equals(response.getComponentName())) {
+        setResourceProperty(resource, SERVER_CLOCK_PROPERTY_ID, response.getServerClock(), requestedIds);
       }      
 
       resources.add(resource);
@@ -125,7 +116,7 @@ public class RootServiceComponentResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return PK_PROPERTY_IDS;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
index d5c33c1..591f984 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -40,26 +39,27 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
-public class RootServiceHostComponentResourceProvider extends
-    ReadOnlyResourceProvider {
-  
-  public static final String SERVICE_NAME_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceHostComponents", "service_name");
-  public static final String HOST_NAME_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceHostComponents", "host_name");
-  public static final String COMPONENT_NAME_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceHostComponents", "component_name");
-  public static final String COMPONENT_VERSION_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceHostComponents", "component_version");
-  public static final String COMPONENT_STATE_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceHostComponents", "component_state");
-  public static final String PROPERTIES_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootServiceHostComponents", "properties");
-  
-  
-  private Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{SERVICE_NAME_PROPERTY_ID, HOST_NAME_PROPERTY_ID, COMPONENT_NAME_PROPERTY_ID}));
+import com.google.common.collect.ImmutableSet;
+
+public class RootServiceHostComponentResourceProvider extends ReadOnlyResourceProvider {
+
+  public static final String RESPONSE_KEY = "RootServiceHostComponents";
 
+  public static final String SERVICE_NAME = "service_name";
+  public static final String HOST_NAME = "host_name";
+  public static final String COMPONENT_NAME = "component_name";
+  public static final String COMPONENT_VERSION = "component_version";
+  public static final String COMPONENT_STATE = "component_state";
+  public static final String PROPERTIES = "properties";
+
+  public static final String SERVICE_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + SERVICE_NAME;
+  public static final String HOST_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + HOST_NAME;
+  public static final String COMPONENT_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + COMPONENT_NAME;
+  public static final String COMPONENT_VERSION_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + COMPONENT_VERSION;
+  public static final String COMPONENT_STATE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + COMPONENT_STATE;
+  public static final String PROPERTIES_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + PROPERTIES;
+
+  private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(SERVICE_NAME_PROPERTY_ID, HOST_NAME_PROPERTY_ID, COMPONENT_NAME_PROPERTY_ID);
 
   public RootServiceHostComponentResourceProvider(Set<String> propertyIds,
       Map<Type, String> keyPropertyIds,
@@ -97,23 +97,12 @@ public class RootServiceHostComponentResourceProvider extends
     for (RootServiceHostComponentResponse response : responses) {
       Resource resource = new ResourceImpl(Resource.Type.RootServiceHostComponent);
 
-      setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID,
-          response.getServiceName(), requestedIds);
-      
-      setResourceProperty(resource, HOST_NAME_PROPERTY_ID,
-          response.getHostName(), requestedIds);
-      
-      setResourceProperty(resource, COMPONENT_NAME_PROPERTY_ID,
-          response.getComponentName(), requestedIds);
-      
-      setResourceProperty(resource, COMPONENT_STATE_PROPERTY_ID,
-          response.getComponentState(), requestedIds);
-      
-      setResourceProperty(resource, COMPONENT_VERSION_PROPERTY_ID,
-          response.getComponentVersion(), requestedIds);
-      
-      setResourceProperty(resource, PROPERTIES_PROPERTY_ID,
-          response.getProperties(), requestedIds);
+      setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
+      setResourceProperty(resource, HOST_NAME_PROPERTY_ID, response.getHostName(), requestedIds);
+      setResourceProperty(resource, COMPONENT_NAME_PROPERTY_ID, response.getComponentName(), requestedIds);
+      setResourceProperty(resource, COMPONENT_STATE_PROPERTY_ID, response.getComponentState(), requestedIds);
+      setResourceProperty(resource, COMPONENT_VERSION_PROPERTY_ID, response.getComponentVersion(), requestedIds);
+      setResourceProperty(resource, PROPERTIES_PROPERTY_ID, response.getProperties(), requestedIds);
 
       resources.add(resource);
     }
@@ -129,7 +118,7 @@ public class RootServiceHostComponentResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return PK_PROPERTY_IDS;
   }
 
   // Get the root service host components for the given set of requests
@@ -137,13 +126,8 @@ public class RootServiceHostComponentResourceProvider extends
       Set<RootServiceHostComponentRequest> requests) throws AmbariException {
     Set<RootServiceHostComponentResponse> response = new HashSet<>();
     for (RootServiceHostComponentRequest request : requests) {
-      String serviceName = request.getServiceName();
       try {
         Set<RootServiceHostComponentResponse> rootServiceHostComponents = getRootServiceHostComponents(request);
-        for (RootServiceHostComponentResponse rootServiceHostComponentResponse : rootServiceHostComponents ) {
-          rootServiceHostComponentResponse.setServiceName(serviceName);
-        }
-
         response.addAll(rootServiceHostComponents);
       } catch (AmbariException e) {
         if (requests.size() == 1) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
index 80f720c..f967443 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -38,13 +37,15 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableSet;
+
 public class RootServiceResourceProvider extends ReadOnlyResourceProvider {
-  
-  public static final String SERVICE_NAME_PROPERTY_ID = PropertyHelper
-      .getPropertyId("RootService", "service_name");
 
-  private Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{SERVICE_NAME_PROPERTY_ID}));
+  public static final String RESPONSE_KEY = "RootService";
+  public static final String SERVICE_NAME = "service_name";
+  public static final String SERVICE_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + SERVICE_NAME;
+
+  private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(SERVICE_NAME_PROPERTY_ID);
 
   protected RootServiceResourceProvider(Set<String> propertyIds,
       Map<Type, String> keyPropertyIds,
@@ -80,10 +81,7 @@ public class RootServiceResourceProvider extends ReadOnlyResourceProvider {
 
     for (RootServiceResponse response : responses) {
       Resource resource = new ResourceImpl(Resource.Type.RootService);
-
-      setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID,
-          response.getServiceName(), requestedIds);
-
+      setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
       resources.add(resource);
     }
 
@@ -96,7 +94,7 @@ public class RootServiceResourceProvider extends ReadOnlyResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds ;
+    return PK_PROPERTY_IDS;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/test/java/org/apache/ambari/server/api/services/RootServiceServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/RootServiceServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/RootServiceServiceTest.java
index 64898c8..90725f7 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/RootServiceServiceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/RootServiceServiceTest.java
@@ -42,31 +42,31 @@ public class RootServiceServiceTest extends BaseServiceTest {
     
     //getServices
     RootServiceService service = new TestRootServiceService(null, null, null);
-    Method m = service.getClass().getMethod("getServices", String.class, HttpHeaders.class, UriInfo.class);
+    Method m = service.getClass().getMethod("getRootServices", String.class, HttpHeaders.class, UriInfo.class);
     Object[] args = new Object[] {null, getHttpHeaders(), getUriInfo()};
     listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null));
     
     //getService
     service = new TestRootServiceService("AMBARI", null, null);
-    m = service.getClass().getMethod("getService", String.class, HttpHeaders.class, UriInfo.class, String.class);
+    m = service.getClass().getMethod("getRootService", String.class, HttpHeaders.class, UriInfo.class, String.class);
     args = new Object[] {null, getHttpHeaders(), getUriInfo(), "AMBARI"};
     listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null));
     
     //getServiceComponents
     service = new TestRootServiceService("AMBARI", null, null);
-    m = service.getClass().getMethod("getServiceComponents", String.class, HttpHeaders.class, UriInfo.class, String.class);
+    m = service.getClass().getMethod("getRootServiceComponents", String.class, HttpHeaders.class, UriInfo.class, String.class);
     args = new Object[] {null, getHttpHeaders(), getUriInfo(), "AMBARI"};
     listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null));
     
     //getServiceComponent
     service = new TestRootServiceService("AMBARI", "AMBARI_SERVER", null);
-    m = service.getClass().getMethod("getServiceComponent", String.class, HttpHeaders.class, UriInfo.class, String.class, String.class);
+    m = service.getClass().getMethod("getRootServiceComponent", String.class, HttpHeaders.class, UriInfo.class, String.class, String.class);
     args = new Object[] {null, getHttpHeaders(), getUriInfo(), "AMBARI", "AMBARI_SERVER"};
     listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null));
     
     //getRootHostComponents
     service = new TestRootServiceService("AMBARI", "AMBARI_SERVER", null);
-    m = service.getClass().getMethod("getRootHostComponents", String.class, HttpHeaders.class, UriInfo.class, String.class, String.class);
+    m = service.getClass().getMethod("getRootServiceComponentHosts", String.class, HttpHeaders.class, UriInfo.class, String.class, String.class);
     args = new Object[] {null, getHttpHeaders(), getUriInfo(), "AMBARI", "AMBARI_SERVER"};
     listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null));
     
@@ -125,7 +125,6 @@ public class RootServiceServiceTest extends BaseServiceTest {
       return getTestResource();
     }
     
-    
     @Override
     RequestFactory getRequestFactory() {
       return getTestRequestFactory();

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
index e9b4aa7..e36077f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
@@ -109,8 +109,7 @@ public class RootServiceResponseFactoryTest {
     RootServiceResponseFactory.Components ambariServerComponent = RootServiceResponseFactory.Components.AMBARI_SERVER;
 
     // Request null service name, not-null component name
-    request = new RootServiceComponentRequest(null,
-        ambariServerComponent.name());
+    request = new RootServiceComponentRequest(null, ambariServerComponent.name());
 
     try {
       rootServiceComponents = responseFactory.getRootServiceComponents(request);
@@ -119,8 +118,8 @@ public class RootServiceResponseFactoryTest {
     }
 
     // Request existent service name, null component name
-    request = new RootServiceComponentRequest(
-        RootServiceResponseFactory.Services.AMBARI.name(), null);
+    String serviceName = RootServiceResponseFactory.Services.AMBARI.name();
+    request = new RootServiceComponentRequest(serviceName, null);
 
     rootServiceComponents = responseFactory.getRootServiceComponents(request);
     assertEquals(
@@ -142,7 +141,7 @@ public class RootServiceResponseFactoryTest {
         }
       } else {
         assertTrue(rootServiceComponents.contains(new RootServiceComponentResponse(
-            component.name(), RootServiceResponseFactory.NOT_APPLICABLE,
+            serviceName, component.name(), RootServiceResponseFactory.NOT_APPLICABLE,
             Collections.<String, String> emptyMap())));
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/228b9289/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java
index eb6f08e..f60f982 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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
@@ -25,6 +25,7 @@ import static org.easymock.EasyMock.verify;
 
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.ambari.server.controller.AmbariManagementController;
@@ -50,13 +51,15 @@ public class RootServiceComponentResourceProviderTest {
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
     Set<RootServiceComponentResponse> allResponse = new HashSet<>();
-    allResponse.add(new RootServiceComponentResponse("component1", "1.1.1", Collections.<String,String>emptyMap()));
-    allResponse.add(new RootServiceComponentResponse("component2", "1.1.1", Collections.<String,String>emptyMap()));
-    allResponse.add(new RootServiceComponentResponse("component3", "1.1.1", Collections.<String,String>emptyMap()));
-    allResponse.add(new RootServiceComponentResponse(RootServiceResponseFactory.Components.AMBARI_SERVER.name(), "1.1.1", Collections.<String,String>emptyMap()));
+    String serviceName = RootServiceResponseFactory.Services.AMBARI.name();
+    Map<String, String> emptyMap = Collections.emptyMap();
+    allResponse.add(new RootServiceComponentResponse(serviceName, "component1", "1.1.1", emptyMap));
+    allResponse.add(new RootServiceComponentResponse(serviceName, "component2", "1.1.1", emptyMap));
+    allResponse.add(new RootServiceComponentResponse(serviceName, "component3", "1.1.1", emptyMap));
+    allResponse.add(new RootServiceComponentResponse(serviceName, RootServiceResponseFactory.Components.AMBARI_SERVER.name(), "1.1.1", emptyMap));
 
     Set<RootServiceComponentResponse> nameResponse = new HashSet<>();
-    nameResponse.add(new RootServiceComponentResponse("component4", "1.1.1", Collections.<String,String>emptyMap()));
+    nameResponse.add(new RootServiceComponentResponse(serviceName, "component4", "1.1.1", emptyMap));
 
 
     // set expectations
@@ -77,7 +80,7 @@ public class RootServiceComponentResourceProviderTest {
     propertyIds.add(RootServiceComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID);
     propertyIds.add(RootServiceComponentResourceProvider.PROPERTIES_PROPERTY_ID);
     propertyIds.add(RootServiceComponentResourceProvider.COMPONENT_VERSION_PROPERTY_ID);
-    propertyIds.add(RootServiceComponentResourceProvider.PROPERTIES_SERVER_CLOCK);
+    propertyIds.add(RootServiceComponentResourceProvider.SERVER_CLOCK_PROPERTY_ID);
 
     // create the request
     Request request = PropertyHelper.getReadRequest(propertyIds);
@@ -89,14 +92,14 @@ public class RootServiceComponentResourceProviderTest {
     for (Resource resource : resources) {
       String componentName = (String) resource.getPropertyValue(RootServiceComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID);
       String componentVersion = (String) resource.getPropertyValue(RootServiceComponentResourceProvider.COMPONENT_VERSION_PROPERTY_ID);
-      Long server_clock = (Long) resource.getPropertyValue(RootServiceComponentResourceProvider.PROPERTIES_SERVER_CLOCK);
+      Long server_clock = (Long) resource.getPropertyValue(RootServiceComponentResourceProvider.SERVER_CLOCK_PROPERTY_ID);
       if (componentName.equals(RootServiceResponseFactory.Components.AMBARI_SERVER.name())){
         Assert.assertNotNull(server_clock);
       } else {
         Assert.assertNull(server_clock);
       }
       
-      Assert.assertTrue(allResponse.contains(new RootServiceComponentResponse(componentName, componentVersion, Collections.<String,String>emptyMap())));
+      Assert.assertTrue(allResponse.contains(new RootServiceComponentResponse(serviceName, componentName, componentVersion, emptyMap)));
     }
 
     // get service named service4