http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostRequest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostRequest.java
index 94b5985..7c4c9ab 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostRequest.java
@@ -23,7 +23,8 @@ package org.apache.ambari.server.controller;
 public class ServiceComponentHostRequest {
 
   private String clusterName; // REF
-  private String serviceName;
+  private String serviceGroupName;
+  private String serviceDisplayName;
   private String componentName;
   private String hostname;
   private String publicHostname;
@@ -33,32 +34,44 @@ public class ServiceComponentHostRequest {
   private String staleConfig; // GET - predicate
   private String adminState; // GET - predicate
   private String maintenanceState; // UPDATE
-  
+
   public ServiceComponentHostRequest(String clusterName,
-                                     String serviceName,
+                                     String serviceGroupName,
+                                     String serviceDisplayName,
                                      String componentName,
                                      String hostname,
                                      String desiredState) {
     super();
     this.clusterName = clusterName;
-    this.serviceName = serviceName;
+    this.serviceGroupName = serviceGroupName;
+    this.serviceDisplayName = serviceDisplayName;
     this.componentName = componentName;
     this.hostname = hostname;
     this.desiredState = desiredState;
   }
 
   /**
+   * @return the service group Name
+   */
+  public String getServiceGroupName() { return serviceGroupName; }
+
+  /**
+   * @param serviceGroupName the service group Name to set
+   */
+  public void setServiceGroupName(String serviceGroupName) { 
this.serviceGroupName = serviceGroupName; }
+
+  /**
    * @return the serviceName
    */
-  public String getServiceName() {
-    return serviceName;
+  public String getServiceDisplayName() {
+    return serviceDisplayName;
   }
 
   /**
-   * @param serviceName the serviceName to set
+   * @param serviceDisplayName the serviceName to set
    */
-  public void setServiceName(String serviceName) {
-    this.serviceName = serviceName;
+  public void setServiceDisplayName(String serviceDisplayName) {
+    this.serviceDisplayName = serviceDisplayName;
   }
 
   /**
@@ -106,64 +119,49 @@ public class ServiceComponentHostRequest {
   /**
    * @return the state
    */
-  public String getState() {
-    return state;
-  }
+  public String getState() { return state; }
 
   /**
    * @param state the State to set
    */
-  public void setState(String state) {
-    this.state = state;
-  }
+  public void setState(String state) { this.state = state; }
 
   /**
    * @return the clusterName
    */
-  public String getClusterName() {
-    return clusterName;
-  }
+  public String getClusterName() { return clusterName; }
 
   /**
    * @param clusterName the clusterName to set
    */
-  public void setClusterName(String clusterName) {
-    this.clusterName = clusterName;
-  }
+  public void setClusterName(String clusterName) { this.clusterName = 
clusterName; }
 
   /**
    * @param staleConfig whether the config is stale
    */
-  public void setStaleConfig(String staleConfig) {
-    this.staleConfig = staleConfig;
-  }
+  public void setStaleConfig(String staleConfig) { this.staleConfig = 
staleConfig; }
 
   /**
    * @return Stale config indicator
    */
-  public String getStaleConfig() {
-    return staleConfig;
-  }
+  public String getStaleConfig() { return staleConfig; }
 
   /**
    * @param adminState the adminState to use as predicate
    */
-  public void setAdminState(String adminState) {
-    this.adminState = adminState;
-  }
+  public void setAdminState(String adminState) { this.adminState = adminState; 
}
 
   /**
    * @return the admin state of the component
    */
-  public String getAdminState() {
-    return adminState;
-  }
+  public String getAdminState() { return adminState; }
 
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder();
     sb.append("{" + " clusterName=").append(clusterName)
-      .append(", serviceName=").append(serviceName)
+      .append(", serviceGroupName=").append(serviceGroupName)
+      .append(", serviceDisplayName=").append(serviceDisplayName)
       .append(", componentName=").append(componentName)
       .append(", hostname=").append(hostname)
       .append(", publicHostname=").append(publicHostname)
@@ -180,22 +178,14 @@ public class ServiceComponentHostRequest {
   /**
    * @param state the maintenance state
    */
-  public void setMaintenanceState(String state) {
-    maintenanceState = state;
-  }
+  public void setMaintenanceState(String state) { maintenanceState = state; }
   
   /**
    * @return the maintenance state
    */
-  public String getMaintenanceState() {
-    return maintenanceState;
-  }
+  public String getMaintenanceState() { return maintenanceState; }
 
-  public String getPublicHostname() {
-    return publicHostname;
-  }
+  public String getPublicHostname() { return publicHostname; }
 
-  public void setPublicHostname(String publicHostname) {
-    this.publicHostname = publicHostname;
-  }
+  public void setPublicHostname(String publicHostname) { this.publicHostname = 
publicHostname; }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostResponse.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostResponse.java
index 7b75e06..ebfbf5c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentHostResponse.java
@@ -26,8 +26,14 @@ import org.apache.ambari.server.state.UpgradeState;
 
 public class ServiceComponentHostResponse {
 
+  private Long clusterId; // REF
   private String clusterName; // REF
+  private Long serviceGroupId;
+  private String serviceGroupName;
+  private Long serviceId;
   private String serviceName;
+  private String serviceDisplayName;
+  private Long hostComponentId;
   private String componentName;
   private String displayName;
   private String publicHostname;
@@ -44,12 +50,19 @@ public class ServiceComponentHostResponse {
   private String maintenanceState = null;
   private UpgradeState upgradeState = UpgradeState.NONE;
 
-  public ServiceComponentHostResponse(String clusterName, String serviceName, 
String componentName,
-      String displayName, String hostname, String publicHostname, String 
liveState, String version,
-      String desiredState, String desiredStackVersion, String 
desiredRepositoryVersion,
-      HostComponentAdminState adminState) {
+  public ServiceComponentHostResponse(Long clusterId, String clusterName, Long 
serviceGroupId, String serviceGroupName,
+                                      Long serviceId, String serviceName, 
String serviceDisplayName, Long hostComponentId,
+                                      String componentName, String 
displayName, String hostname, String publicHostname,
+                                      String liveState, String version, String 
desiredState, String desiredStackVersion,
+                                      String desiredRepositoryVersion, 
HostComponentAdminState adminState) {
+    this.clusterId = clusterId;
+    this.serviceGroupId = serviceGroupId;
+    this.serviceGroupName = serviceGroupName;
+    this.serviceId = serviceId;
     this.clusterName = clusterName;
     this.serviceName = serviceName;
+    this.serviceDisplayName = serviceDisplayName;
+    this.hostComponentId = hostComponentId;
     this.componentName = componentName;
     this.displayName = displayName;
     this.hostname = hostname;
@@ -65,6 +78,46 @@ public class ServiceComponentHostResponse {
   }
 
   /**
+   * @return the serviceGroupId
+   */
+  public Long getServiceGroupId() { return serviceGroupId; }
+
+  /**
+   * @param serviceGroupId the serviceGroupId to set
+   */
+  public void setServiceGroupId(Long serviceGroupId) { this.serviceGroupId = 
serviceGroupId; }
+
+  /**
+   * @return the serviceGroupName
+   */
+  public String getServiceGroupName() { return serviceGroupName; }
+
+  /**
+   * @param serviceGroupName the serviceGroupName to set
+   */
+  public void setServiceGroupName(String serviceGroupName) { 
this.serviceGroupName = serviceGroupName; }
+
+  /**
+   * @return the serviceId
+   */
+  public Long getServiceId() { return serviceId; }
+
+  /**
+   * @param serviceId the serviceId to set
+   */
+  public void setServiceId(Long serviceId) { this.serviceId = serviceId; }
+
+  /**
+   * @return the hostComponentId
+   */
+  public Long getHostComponentId() { return hostComponentId; }
+
+  /**
+   * @param hostComponentId the hostComponentId to set
+   */
+  public void sethostComponentId(Long hostComponentId) { this.hostComponentId 
= hostComponentId; }
+
+  /**
    * @return the serviceName
    */
   public String getServiceName() {
@@ -79,6 +132,16 @@ public class ServiceComponentHostResponse {
   }
 
   /**
+   * @return the serviceName
+   */
+  public String getServiceDisplayName() { return serviceDisplayName; }
+
+  /**
+   * @param serviceDisplayName the serviceDisplayName to set
+   */
+  public void setServiceDisplayName(String serviceDisplayName) { 
this.serviceDisplayName = serviceDisplayName; }
+
+  /**
    * @return the componentName
    */
   public String getComponentName() {
@@ -186,6 +249,16 @@ public class ServiceComponentHostResponse {
   }
 
   /**
+   * @return the clusterId
+   */
+  public Long getClusterId() { return clusterId; }
+
+  /**
+   * @param clusterId the clusterId to set
+   */
+  public void setClusterId(Long clusterId) { this.clusterId = clusterId; }
+
+  /**
    * @return the clusterName
    */
   public String getClusterName() {
@@ -225,18 +298,51 @@ public class ServiceComponentHostResponse {
     ServiceComponentHostResponse that =
         (ServiceComponentHostResponse) o;
 
+    if (clusterId != null ?
+            !clusterId.equals(that.clusterId) : that.clusterId != null) {
+      return false;
+    }
+
     if (clusterName != null ?
         !clusterName.equals(that.clusterName) : that.clusterName != null) {
       return false;
     }
+
+    if (serviceGroupId != null ?
+            !serviceGroupId.equals(that.serviceGroupId) : that.serviceGroupId 
!= null) {
+      return false;
+    }
+
+    if (serviceGroupName != null ?
+            !serviceGroupName.equals(that.serviceGroupName) : 
that.serviceGroupName != null) {
+      return false;
+    }
+
+    if (serviceId != null ?
+            !serviceId.equals(that.serviceId) : that.serviceId != null) {
+      return false;
+    }
+
     if (serviceName != null ?
         !serviceName.equals(that.serviceName) : that.serviceName != null) {
       return false;
     }
+
+    if (serviceDisplayName != null ?
+            !serviceDisplayName.equals(that.serviceDisplayName) : 
that.serviceDisplayName != null) {
+      return false;
+    }
+
     if (componentName != null ?
         !componentName.equals(that.componentName) : that.componentName != 
null) {
       return false;
     }
+
+    if (displayName != null ?
+            !displayName.equals(that.displayName) : that.displayName != null) {
+      return false;
+    }
+
     if (hostname != null ?
         !hostname.equals(that.hostname) : that.hostname != null) {
       return false;
@@ -247,9 +353,15 @@ public class ServiceComponentHostResponse {
 
   @Override
   public int hashCode() {
-    int result = clusterName != null ? clusterName.hashCode() : 0;
+    int result = clusterId != null? clusterId.intValue() : 0;
+    result = clusterName != null ? clusterName.hashCode() : 0;
+    result = 71 * result + (serviceGroupId != null ? serviceGroupId.hashCode() 
: 0);
+    result = 71 * result + (serviceGroupName != null ? 
serviceGroupName.hashCode() : 0);
+    result = 71 * result + (serviceId != null ? serviceId.hashCode() : 0);
     result = 71 * result + (serviceName != null ? serviceName.hashCode() : 0);
+    result = 71 * result + (serviceDisplayName != null ? 
serviceDisplayName.hashCode() : 0);
     result = 71 * result + (componentName != null ? componentName.hashCode() : 
0);
+    result = 71 * result + (displayName != null ? displayName.hashCode() : 0);
     result = 71 * result + (hostname != null ? hostname.hashCode() : 0);
     return result;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentRequest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentRequest.java
index 3a65ff8..1556b70 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentRequest.java
@@ -22,34 +22,30 @@ package org.apache.ambari.server.controller;
 public class ServiceComponentRequest {
 
   private String clusterName; // REF
-
-  private String serviceName; // GET/CREATE/UPDATE/DELETE
-
+  private String serviceGroupName;
+  private String serviceDisplayName; // GET/CREATE/UPDATE/DELETE
   private String componentName; // GET/CREATE/UPDATE/DELETE
-
   private String desiredState; // CREATE/UPDATE
-
   private String componentCategory;
-
   private String recoveryEnabled; // CREATE/UPDATE
 
-  public ServiceComponentRequest(String clusterName, String serviceName,
+  public ServiceComponentRequest(String clusterName, String serviceGroupName, 
String serviceDisplayName,
                                  String componentName, String desiredState) {
-    this(clusterName, serviceName, componentName, desiredState, null, null);
+    this(clusterName, serviceGroupName, serviceDisplayName, componentName, 
desiredState, null, null);
   }
 
-  public ServiceComponentRequest(String clusterName, String serviceName,
-                                 String componentName, String desiredState,
-                                 String recoveryEnabled) {
-    this(clusterName, serviceName, componentName, desiredState, 
recoveryEnabled, null);
+  public ServiceComponentRequest(String clusterName, String serviceGroupName, 
String serviceDisplayName, String componentName,
+                                 String desiredState, String recoveryEnabled) {
+    this(clusterName, serviceGroupName, serviceDisplayName, componentName, 
desiredState, recoveryEnabled, null);
   }
 
-  public ServiceComponentRequest(String clusterName,
-                                 String serviceName, String componentName,
+  public ServiceComponentRequest(String clusterName, String serviceGroupName,
+                                 String serviceDisplayName, String 
componentName,
                                  String desiredState, String recoveryEnabled,
                                  String componentCategory) {
     this.clusterName = clusterName;
-    this.serviceName = serviceName;
+    this.serviceGroupName = serviceGroupName;
+    this.serviceDisplayName = serviceDisplayName;
     this.componentName = componentName;
     this.desiredState = desiredState;
     this.recoveryEnabled = recoveryEnabled;
@@ -57,25 +53,34 @@ public class ServiceComponentRequest {
   }
 
   /**
+   * @return the service group Name
+   */
+  public String getServiceGroupName() { return serviceGroupName; }
+
+  /**
+   * @param serviceGroupName the service group Name to set
+   */
+  public void setServiceGroupName(String serviceGroupName) { 
this.serviceGroupName = serviceGroupName; }
+
+  /**
    * @return the serviceName
    */
-  public String getServiceName() {
-    return serviceName;
+  public String getServiceDisplayName() {
+    return serviceDisplayName;
   }
 
   /**
-   * @param serviceName the serviceName to set
+   * @param serviceDisplayName the serviceDisplayName to set
    */
-  public void setServiceName(String serviceName) {
-    this.serviceName = serviceName;
+  public void setServiceDisplayName(String serviceDisplayName) {
+    this.serviceDisplayName = serviceDisplayName;
   }
 
+
   /**
    * @return the componentName
    */
-  public String getComponentName() {
-    return componentName;
-  }
+  public String getComponentName() { return componentName; }
 
   /**
    * @param componentName the componentName to set
@@ -136,7 +141,8 @@ public class ServiceComponentRequest {
 
   @Override
   public String toString() {
-    return String.format("[clusterName=%s, serviceName=%s, componentName=%s, 
desiredState=%s, recoveryEnabled=%s, componentCategory=%s]",
-        clusterName, serviceName, clusterName, desiredState, recoveryEnabled, 
componentCategory);
+    return String.format("[clusterName=%s, serviceGroupName=%s, 
serviceDisplayName=%s, componentName=%s, " +
+                         "desiredState=%s, recoveryEnabled=%s, 
componentCategory=%s]", clusterName, serviceGroupName,
+                          serviceDisplayName, clusterName, desiredState, 
recoveryEnabled, componentCategory);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentResponse.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentResponse.java
index 9bd3e44..b96fb8a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceComponentResponse.java
@@ -28,7 +28,11 @@ public class ServiceComponentResponse {
 
   private Long clusterId; // REF
   private String clusterName; // REF
+  private Long serviceGroupId; // REF
+  private String serviceGroupName; // REF
+  private Long serviceId; // REF
   private String serviceName;
+  private String serviceDisplayName;
   private String componentName;
   private String displayName;
   private String desiredStackId;
@@ -39,14 +43,18 @@ public class ServiceComponentResponse {
   private String desiredVersion;
   private RepositoryVersionState repoState;
 
-  public ServiceComponentResponse(Long clusterId, String clusterName, String 
serviceName,
-      String componentName, StackId desiredStackId, String desiredState,
-      Map<String, Integer> serviceComponentStateCount, boolean 
recoveryEnabled, String displayName,
-      String desiredVersion, RepositoryVersionState repoState) {
-
+  public ServiceComponentResponse(Long clusterId, String clusterName, Long 
serviceGroupId, String serviceGroupName,
+                                  Long serviceId, String serviceName, String 
serviceDisplayName, String componentName,
+                                  StackId desiredStackId, String desiredState, 
Map<String, Integer> serviceComponentStateCount,
+                                  boolean recoveryEnabled, String displayName, 
String desiredVersion,
+                                  RepositoryVersionState repoState) {
     this.clusterId = clusterId;
     this.clusterName = clusterName;
+    this.serviceGroupId = serviceGroupId;
+    this.serviceGroupName = serviceGroupName;
+    this.serviceId = serviceId;
     this.serviceName = serviceName;
+    this.serviceDisplayName = serviceDisplayName;
     this.componentName = componentName;
     this.displayName = displayName;
     this.desiredStackId = desiredStackId.getStackId();
@@ -72,6 +80,46 @@ public class ServiceComponentResponse {
   }
 
   /**
+   * @return the serviceName
+   */
+  public String getServiceDisplayName() { return serviceDisplayName; }
+
+  /**
+   * @param serviceDisplayName the serviceDisplayName to set
+   */
+  public void setServiceDisplayName(String serviceDisplayName) { 
this.serviceDisplayName = serviceDisplayName; }
+
+  /**
+   * @return the serviceId
+   */
+  public Long getServiceId() { return serviceId; }
+
+  /**
+   * @param serviceId the serviceId to set
+   */
+  public void setServiceId(Long serviceId) { this.serviceId = serviceId; }
+
+  /**
+   * @return the serviceGroupId
+   */
+  public Long getServiceGroupId() { return serviceGroupId; }
+
+  /**
+   * @param serviceGroupId the serviceGroupId to set
+   */
+  public void setServiceGroupId(Long serviceGroupId) { this.serviceGroupId = 
serviceGroupId; }
+
+  /**
+   * @return the serviceGroupName
+   */
+  public String getServiceGroupName() { return serviceGroupName; }
+
+  /**
+   * @param serviceGroupName the serviceGroupName to set
+   */
+  public void setServiceGroupName(String serviceGroupName) { 
this.serviceGroupName = serviceGroupName; }
+
+  /**
    * @return the componentName
    */
   public String getComponentName() {
@@ -212,19 +260,49 @@ public class ServiceComponentResponse {
     ServiceComponentResponse that =
         (ServiceComponentResponse) o;
 
+    if (clusterId != null ?
+            !clusterId.equals(that.clusterId) : that.clusterId != null) {
+      return false;
+    }
+
     if (clusterName != null ?
         !clusterName.equals(that.clusterName) : that.clusterName != null) {
       return false;
     }
+
+    if (serviceGroupId != null ?
+            !serviceGroupId.equals(that.serviceGroupId) : that.serviceGroupId 
!= null) {
+      return false;
+    }
+    if (serviceGroupName != null ?
+            !serviceGroupName.equals(that.serviceGroupName) : 
that.serviceGroupName != null) {
+      return false;
+    }
+    if (serviceId != null ?
+            !serviceId.equals(that.serviceId) : that.serviceId != null) {
+      return false;
+    }
+
     if (serviceName != null ?
         !serviceName.equals(that.serviceName) : that.serviceName != null) {
       return false;
     }
+
+    if (serviceDisplayName != null ?
+            !serviceDisplayName.equals(that.serviceDisplayName) : 
that.serviceDisplayName != null) {
+      return false;
+    }
+
     if (componentName != null ?
         !componentName.equals(that.componentName) : that.componentName != 
null){
       return false;
     }
 
+    if (displayName != null ?
+            !displayName.equals(that.displayName) : that.displayName != null) {
+      return false;
+    }
+
     return true;
   }
 
@@ -232,8 +310,13 @@ public class ServiceComponentResponse {
   public int hashCode() {
     int result = clusterId != null? clusterId.intValue() : 0;
     result = 71 * result + (clusterName != null ? clusterName.hashCode() : 0);
+    result = 71 * result + (serviceGroupId != null ? serviceGroupId.hashCode() 
: 0);
+    result = 71 * result + (serviceGroupName != null ? 
serviceGroupName.hashCode() : 0);
+    result = 71 * result + (serviceId != null ? serviceId.hashCode() : 0);
     result = 71 * result + (serviceName != null ? serviceName.hashCode() : 0);
+    result = 71 * result + (serviceDisplayName != null ? 
serviceDisplayName.hashCode() : 0);
     result = 71 * result + (componentName != null ? 
componentName.hashCode():0);
+    result = 71 * result + (displayName != null ? displayName.hashCode():0);
     return result;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceRequest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceRequest.java
index 3b3c940..b084582 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceRequest.java
@@ -24,7 +24,9 @@ import io.swagger.annotations.ApiModelProperty;
 public class ServiceRequest {
 
   private String clusterName; // REF
-  private String serviceName; // GET/CREATE/UPDATE/DELETE
+  private String serviceName; // GET/CREATE/DELETE
+  private String serviceDisplayName; // GET/CREATE/UPDATE/DELETE
+  private String serviceGroupName;
   private String desiredState; // CREATE/UPDATE
   private String maintenanceState; // UPDATE
   private String credentialStoreEnabled; // CREATE/UPDATE/GET
@@ -36,19 +38,27 @@ public class ServiceRequest {
    */
   private RepositoryVersionEntity resolvedRepository;
 
-  public ServiceRequest(String clusterName, String serviceName,
+  public ServiceRequest(String clusterName, String serviceGroupName, String 
serviceName,
       Long desiredRepositoryVersionId, String desiredState) {
-    this(clusterName, serviceName, desiredRepositoryVersionId, desiredState, 
null);
+    this(clusterName, serviceGroupName, serviceName, serviceName, 
desiredRepositoryVersionId, desiredState, null);
   }
 
-  public ServiceRequest(String clusterName, String serviceName,
-      Long desiredRepositoryVersionId, String desiredState, String 
credentialStoreEnabled) {
+  public ServiceRequest(String clusterName,
+                        String serviceGroupName,
+                        String serviceName,
+                        String serviceDisplayName,
+                        Long desiredRepositoryVersionId,
+                        String desiredState,
+                        String credentialStoreEnabled) {
     this.clusterName = clusterName;
+    this.serviceGroupName = serviceGroupName;
     this.serviceName = serviceName;
     this.desiredState = desiredState;
 
     this.desiredRepositoryVersionId = desiredRepositoryVersionId;
 
+    this.serviceDisplayName = serviceDisplayName;
+    this.desiredState = desiredState;
     this.credentialStoreEnabled = credentialStoreEnabled;
     // Credential store supported cannot be changed after
     // creation since it comes from the stack definition.
@@ -56,119 +66,112 @@ public class ServiceRequest {
   }
 
   /**
-   * @return the serviceName
+   * @return the service name
    */
   @ApiModelProperty(name = "service_name")
-  public String getServiceName() {
-    return serviceName;
-  }
+  public String getServiceName() { return serviceName; }
 
   /**
-   * @param serviceName the serviceName to set
+   * @param serviceName the Service Display Name to set
    */
-  public void setServiceName(String serviceName) {
-    this.serviceName = serviceName;
-  }
+  public void setServiceName(String serviceName) { this.serviceName = 
serviceName; }
+
+  /**
+   * @return the service display name
+   */
+  @ApiModelProperty(name = "service_display_name")
+  public String getServiceDisplayName() { return serviceDisplayName; }
+
+  /**
+   * @param serviceDisplayName the Service Display Name to set
+   */
+  public void setServiceDisplayName(String serviceDisplayName) { 
this.serviceDisplayName = serviceDisplayName; }
+
+  /**
+   * @return the service group Name
+   */
+  public String getServiceGroupName() { return serviceGroupName; }
+
+  /**
+   * @param serviceGroupName the service group Name to set
+   */
+  public void setServiceGroupName(String serviceGroupName) { 
this.serviceGroupName = serviceGroupName; }
 
   /**
    * @return the desiredState
    */
   @ApiModelProperty(name = "state")
-  public String getDesiredState() {
-    return desiredState;
-  }
+  public String getDesiredState() { return desiredState; }
 
   /**
    * @param desiredState the desiredState to set
    */
-  public void setDesiredState(String desiredState) {
-    this.desiredState = desiredState;
-  }
+  public void setDesiredState(String desiredState) { this.desiredState = 
desiredState; }
 
-  public Long getDesiredRepositoryVersionId() {
-    return desiredRepositoryVersionId;
-  }
+  public Long getDesiredRepositoryVersionId() { return 
desiredRepositoryVersionId; }
 
   /**
    * @return the clusterName
    */
   @ApiModelProperty(name = "cluster_name")
-  public String getClusterName() {
-    return clusterName;
-  }
+  public String getClusterName() { return clusterName; }
 
   /**
    * @param clusterName the clusterName to set
    */
-  public void setClusterName(String clusterName) {
-    this.clusterName = clusterName;
-  }
+  public void setClusterName(String clusterName) { this.clusterName = 
clusterName; }
 
   /**
    * @param state the new maintenance state
    */
-  public void setMaintenanceState(String state) {
-    maintenanceState = state;
-  }
+  public void setMaintenanceState(String state) { maintenanceState = state; }
 
   /**
    * @return the maintenance state
    */
   @ApiModelProperty(name = "maintenance_state")
-  public String getMaintenanceState() {
-    return maintenanceState;
-  }
+  public String getMaintenanceState() { return maintenanceState; }
 
   /**
    * @return credential store enabled
    */
   @ApiModelProperty(name = "credential_store_enabled")
-  public String getCredentialStoreEnabled() {
-    return credentialStoreEnabled;
-  }
+  public String getCredentialStoreEnabled() { return credentialStoreEnabled; }
 
 
   /**
    * @return credential store supported
    */
-  public String getCredentialStoreSupported() {
-    return credentialStoreSupported;
-  }
+  public String getCredentialStoreSupported() { return 
credentialStoreSupported; }
 
   /**
    * @param credentialStoreEnabled the new credential store enabled
    */
-  public void setCredentialStoreEnabled(String credentialStoreEnabled) {
-    this.credentialStoreEnabled = credentialStoreEnabled;
-  }
+  public void setCredentialStoreEnabled(String credentialStoreEnabled) { 
this.credentialStoreEnabled = credentialStoreEnabled; }
 
   /**
    * @param credentialStoreSupported the new credential store supported
    */
   @ApiModelProperty(name = "credential_store_supporteds")
-  public void setCredentialStoreSupported(String credentialStoreSupported) {
-    this.credentialStoreSupported = credentialStoreSupported;
-  }
+  public void setCredentialStoreSupported(String credentialStoreSupported) { 
this.credentialStoreSupported = credentialStoreSupported; }
 
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder();
-    sb.append("clusterName=").append(clusterName)
-      .append(", serviceName=").append(serviceName)
-      .append(", desiredState=").append(desiredState)
-      .append(", credentialStoreEnabled=").append(credentialStoreEnabled)
-      .append(", credentialStoreSupported=").append(credentialStoreSupported);
+    sb.append("clusterName=" + clusterName
+      + ", serviceGroupName=" + serviceGroupName
+      + ", serviceDisplayName=" + serviceDisplayName
+      + ", desiredState=" + desiredState
+      + ", maintenanceState=" + maintenanceState
+      + ", credentialStoreEnabled=" + credentialStoreEnabled
+      + ", credentialStoreSupported=" + credentialStoreSupported);
     return sb.toString();
   }
 
   /**
    * @param repositoryVersion
    */
-  public void setResolvedRepository(RepositoryVersionEntity repositoryVersion) 
{
-    resolvedRepository = repositoryVersion;
-  }
+  public void setResolvedRepository(RepositoryVersionEntity repositoryVersion) 
{ resolvedRepository = repositoryVersion; }
 
-  public RepositoryVersionEntity getResolvedRepository() {
-    return resolvedRepository;
-  }
+  public RepositoryVersionEntity getResolvedRepository() { return 
resolvedRepository; }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java
index ed1832a..f528b4e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java
@@ -27,7 +27,11 @@ public class ServiceResponse {
 
   private Long clusterId;
   private String clusterName;
+  private Long serviceGroupId;
+  private String serviceGroupName;
+  private Long serviceId;
   private String serviceName;
+  private String serviceDisplayName;
   private StackId desiredStackId;
   private String desiredRepositoryVersion;
   private Long desiredRepositoryVersionId;
@@ -37,13 +41,17 @@ public class ServiceResponse {
   private boolean credentialStoreSupported;
   private boolean credentialStoreEnabled;
 
-  public ServiceResponse(Long clusterId, String clusterName, String 
serviceName,
-      StackId desiredStackId, String desiredRepositoryVersion,
-      RepositoryVersionState repositoryVersionState, String desiredState,
-      boolean credentialStoreSupported, boolean credentialStoreEnabled) {
+  public ServiceResponse(Long clusterId, String clusterName, Long 
serviceGroupId, String serviceGroupName,
+                         Long serviceId, String serviceName, String 
serviceDisplayName, StackId desiredStackId,
+                         String desiredRepositoryVersion, 
RepositoryVersionState repositoryVersionState, String desiredState,
+                         boolean credentialStoreSupported, boolean 
credentialStoreEnabled) {
     this.clusterId = clusterId;
     this.clusterName = clusterName;
+    this.serviceGroupId = serviceGroupId;
+    this.serviceGroupName = serviceGroupName;
+    this.serviceId = serviceId;
     this.serviceName = serviceName;
+    this.serviceDisplayName = serviceDisplayName;
     this.desiredStackId = desiredStackId;
     this.repositoryVersionState = repositoryVersionState;
     setDesiredState(desiredState);
@@ -52,8 +60,6 @@ public class ServiceResponse {
     this.credentialStoreEnabled = credentialStoreEnabled;
   }
 
-
-
   /**
    * @return the serviceName
    */
@@ -99,6 +105,47 @@ public class ServiceResponse {
     this.clusterName = clusterName;
   }
 
+
+  /**
+   * @return the serviceGroupId
+   */
+  public Long getServiceGroupId() { return serviceGroupId; }
+
+  /**
+   * @param serviceGroupId the serviceGroupId to set
+   */
+  public void setServiceGroupId(Long serviceGroupId) { this.serviceGroupId = 
serviceGroupId; }
+
+  /**
+   * @return the service group name
+   */
+  public String getServiceGroupName() { return serviceGroupName; }
+
+  /**
+   * @param  serviceGroupName the service group name
+   */
+  public void setServiceGroupName(String serviceGroupName) { 
this.serviceGroupName = serviceGroupName; }
+
+  /**
+   * @return the serviceId
+   */
+  public Long getServiceId() { return serviceId; }
+
+  /**
+   * @param serviceId the serviceId to set
+   */
+  public void setServiceId(Long serviceId) { this.serviceId = serviceId; }
+
+  /**
+   * @return the real serviceName
+   */
+  public String getServiceDisplayName() { return serviceDisplayName; }
+
+  /**
+   * @param serviceDisplayName the real serviceName to set
+   */
+  public void setserviceDisplayName(String serviceDisplayName) { 
this.serviceDisplayName = serviceDisplayName; }
+
   /**
    * @return the desiredState
    */
@@ -144,25 +191,37 @@ public class ServiceResponse {
 
   @Override
   public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
 
     ServiceResponse that = (ServiceResponse) o;
 
     if (clusterId != null ?
-        !clusterId.equals(that.clusterId) : that.clusterId != null) {
+            !clusterId.equals(that.clusterId) : that.clusterId != null) {
       return false;
     }
     if (clusterName != null ?
-        !clusterName.equals(that.clusterName) : that.clusterName != null) {
+            !clusterName.equals(that.clusterName) : that.clusterName != null) {
+      return false;
+    }
+    if (serviceGroupId != null ?
+            !serviceGroupId.equals(that.serviceGroupId) : that.serviceGroupId 
!= null) {
+      return false;
+    }
+    if (serviceGroupName != null ?
+            !serviceGroupName.equals(that.serviceGroupName) : 
that.serviceGroupName != null) {
+      return false;
+    }
+    if (serviceId != null ?
+            !serviceId.equals(that.serviceId) : that.serviceId != null) {
       return false;
     }
     if (serviceName != null ?
-        !serviceName.equals(that.serviceName) : that.serviceName != null) {
+            !serviceName.equals(that.serviceName) : that.serviceName != null) {
+      return false;
+    }
+    if (serviceDisplayName != null ?
+            !serviceDisplayName.equals(that.serviceDisplayName) : 
that.serviceDisplayName != null) {
       return false;
     }
 
@@ -224,7 +283,11 @@ public class ServiceResponse {
   public int hashCode() {
     int result = clusterId != null? clusterId.intValue() : 0;
     result = 71 * result + (clusterName != null ? clusterName.hashCode() : 0);
+    result = 71 * result + (serviceGroupId != null ? serviceGroupId.hashCode() 
: 0);
+    result = 71 * result + (serviceGroupName != null ? 
serviceGroupName.hashCode() : 0);
+    result = 71 * result + (serviceId != null ? serviceId.hashCode() : 0);
     result = 71 * result + (serviceName != null ? serviceName.hashCode() : 0);
+    result = 71 * result + (serviceDisplayName != null ? 
serviceDisplayName.hashCode() : 0);
     return result;
   }
 
@@ -244,7 +307,6 @@ public class ServiceResponse {
   }
 
   /**
-   * @param id
    */
   public Long getDesiredRepositoryVersionId() {
     return desiredRepositoryVersionId;

http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
index 0242d7c..e154133 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
@@ -470,7 +470,7 @@ public abstract class AbstractProviderModule implements 
ProviderModule,
     Set<String> hosts = null;
     try {
       Cluster cluster = 
managementController.getClusters().getCluster(clusterName);
-      String serviceName = managementController.findServiceName(cluster, 
componentName);
+      String serviceName = managementController.findService(cluster, 
componentName);
       hosts = 
cluster.getService(serviceName).getServiceComponent(componentName).getServiceComponentHosts().keySet();
     } catch (Exception e) {
       LOG.warn("Exception in getting host names for jmx metrics: ", e);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
index 166fc5f..2a8b8fe 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
@@ -116,6 +116,7 @@ public class ClientConfigResourceProvider extends 
AbstractControllerResourceProv
   // ----- Property ID constants ---------------------------------------------
 
   protected static final String COMPONENT_CLUSTER_NAME_PROPERTY_ID = 
"ServiceComponentInfo/cluster_name";
+  protected static final String COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID = 
"ServiceComponentInfo/service_group_name";
   protected static final String COMPONENT_SERVICE_NAME_PROPERTY_ID = 
"ServiceComponentInfo/service_name";
   protected static final String COMPONENT_COMPONENT_NAME_PROPERTY_ID = 
"ServiceComponentInfo/component_name";
   protected static final String HOST_COMPONENT_HOST_NAME_PROPERTY_ID =
@@ -126,6 +127,7 @@ public class ClientConfigResourceProvider extends 
AbstractControllerResourceProv
   private static Set<String> pkPropertyIds =
     new HashSet<>(Arrays.asList(new String[]{
       COMPONENT_CLUSTER_NAME_PROPERTY_ID,
+      COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID,
       COMPONENT_SERVICE_NAME_PROPERTY_ID,
       COMPONENT_COMPONENT_NAME_PROPERTY_ID}));
 
@@ -198,7 +200,7 @@ public class ClientConfigResourceProvider extends 
AbstractControllerResourceProv
 
     ServiceComponentHostRequest schRequest =  requests.iterator().next();
     String requestComponentName = schRequest.getComponentName();
-    String requestServiceName = schRequest.getServiceName();
+    String requestServiceName = schRequest.getServiceDisplayName();
     String requestHostName =  schRequest.getHostname();
 
     Map<String,List<ServiceComponentHostResponse>> serviceToComponentMap = new 
HashMap<>();
@@ -904,6 +906,7 @@ public class ClientConfigResourceProvider extends 
AbstractControllerResourceProv
   private ServiceComponentHostRequest getRequest(Map<String, Object> 
properties) {
     return new ServiceComponentHostRequest(
             (String) properties.get(COMPONENT_CLUSTER_NAME_PROPERTY_ID),
+            (String) properties.get(COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID),
             (String) properties.get(COMPONENT_SERVICE_NAME_PROPERTY_ID),
             (String) properties.get(COMPONENT_COMPONENT_NAME_PROPERTY_ID),
             (String) properties.get(HOST_COMPONENT_HOST_NAME_PROPERTY_ID),

http://git-wip-us.apache.org/repos/asf/ambari/blob/f3520c09/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
index 2df3b00..4e2570f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
@@ -22,6 +22,7 @@ import java.util.Collection;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -31,6 +32,7 @@ import org.apache.ambari.server.ClusterNotFoundException;
 import org.apache.ambari.server.DuplicateResourceException;
 import org.apache.ambari.server.ObjectNotFoundException;
 import org.apache.ambari.server.ParentObjectNotFoundException;
+import org.apache.ambari.server.ServiceGroupNotFoundException;
 import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.AmbariManagementController;
@@ -47,6 +49,7 @@ import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 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 org.apache.ambari.server.security.authorization.AuthorizationException;
 import org.apache.ambari.server.security.authorization.AuthorizationHelper;
 import org.apache.ambari.server.security.authorization.ResourceType;
@@ -58,6 +61,7 @@ import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentFactory;
 import org.apache.ambari.server.state.ServiceComponentHost;
+import org.apache.ambari.server.state.ServiceGroup;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.commons.lang.StringUtils;
@@ -72,26 +76,32 @@ import com.google.inject.persist.Transactional;
  * Resource provider for component resources.
  */
 public class ComponentResourceProvider extends 
AbstractControllerResourceProvider {
-
+  public static final String RESPONSE_KEY = "ServiceComponentInfo";
+  public static final String ALL_PROPERTIES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "*";
   // ----- Property ID constants ---------------------------------------------
 
   // Components
-  protected static final String COMPONENT_CLUSTER_NAME_PROPERTY_ID    = 
"ServiceComponentInfo/cluster_name";
-  protected static final String COMPONENT_SERVICE_NAME_PROPERTY_ID    = 
"ServiceComponentInfo/service_name";
-  protected static final String COMPONENT_COMPONENT_NAME_PROPERTY_ID  = 
"ServiceComponentInfo/component_name";
-  protected static final String COMPONENT_DISPLAY_NAME_PROPERTY_ID    = 
"ServiceComponentInfo/display_name";
-  protected static final String COMPONENT_STATE_PROPERTY_ID           = 
"ServiceComponentInfo/state";
-  protected static final String COMPONENT_CATEGORY_PROPERTY_ID        = 
"ServiceComponentInfo/category";
-  protected static final String COMPONENT_TOTAL_COUNT_PROPERTY_ID     = 
"ServiceComponentInfo/total_count";
-  protected static final String COMPONENT_STARTED_COUNT_PROPERTY_ID   = 
"ServiceComponentInfo/started_count";
-  protected static final String COMPONENT_INSTALLED_COUNT_PROPERTY_ID = 
"ServiceComponentInfo/installed_count";
-  protected static final String COMPONENT_INIT_COUNT_PROPERTY_ID      = 
"ServiceComponentInfo/init_count";
-  protected static final String COMPONENT_UNKNOWN_COUNT_PROPERTY_ID   = 
"ServiceComponentInfo/unknown_count";
-  protected static final String COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID = 
"ServiceComponentInfo/install_failed_count";
-  protected static final String COMPONENT_RECOVERY_ENABLED_ID         = 
"ServiceComponentInfo/recovery_enabled";
-  protected static final String COMPONENT_DESIRED_STACK               = 
"ServiceComponentInfo/desired_stack";
-  protected static final String COMPONENT_DESIRED_VERSION             = 
"ServiceComponentInfo/desired_version";
-  protected static final String COMPONENT_REPOSITORY_STATE            = 
"ServiceComponentInfo/repository_state";
+  protected static final String COMPONENT_CLUSTER_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_id";
+  protected static final String COMPONENT_CLUSTER_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_name";
+  protected static final String COMPONENT_SERVICE_GROUP_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_group_id";
+  protected static final String COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_group_name";
+  protected static final String COMPONENT_SERVICE_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_id";
+  protected static final String COMPONENT_SERVICE_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_name";
+  protected static final String COMPONENT_SERVICE_DISPLAY_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_display_name";
+  protected static final String COMPONENT_COMPONENT_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "component_name";
+  protected static final String COMPONENT_DISPLAY_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "display_name";
+  protected static final String COMPONENT_STATE_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "state";
+  protected static final String COMPONENT_CATEGORY_PROPERTY_ID = RESPONSE_KEY 
+ PropertyHelper.EXTERNAL_PATH_SEP + "category";
+  protected static final String COMPONENT_TOTAL_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "total_count";
+  protected static final String COMPONENT_STARTED_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "started_count";
+  protected static final String COMPONENT_INSTALLED_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "installed_count";
+  protected static final String COMPONENT_INIT_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "init_count";
+  protected static final String COMPONENT_UNKNOWN_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "unknown_count";
+  protected static final String COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "install_failed_count";
+  protected static final String COMPONENT_RECOVERY_ENABLED_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "recovery_enabled";
+  protected static final String COMPONENT_DESIRED_STACK = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "desired_stack";
+  protected static final String COMPONENT_DESIRED_VERSION = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "desired_version";
+  protected static final String COMPONENT_REPOSITORY_STATE = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "repository_state";
 
   private static final String TRUE = "true";
 
@@ -100,7 +110,8 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
 
   private static Set<String> pkPropertyIds = Sets.newHashSet(
           COMPONENT_CLUSTER_NAME_PROPERTY_ID,
-          COMPONENT_SERVICE_NAME_PROPERTY_ID,
+          COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID,
+          COMPONENT_SERVICE_DISPLAY_NAME_PROPERTY_ID,
           COMPONENT_COMPONENT_NAME_PROPERTY_ID);
 
   /**
@@ -115,8 +126,13 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
 
   static {
     // properties
+    PROPERTY_IDS.add(COMPONENT_CLUSTER_ID_PROPERTY_ID);
     PROPERTY_IDS.add(COMPONENT_CLUSTER_NAME_PROPERTY_ID);
+    PROPERTY_IDS.add(COMPONENT_SERVICE_GROUP_ID_PROPERTY_ID);
+    PROPERTY_IDS.add(COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID);
+    PROPERTY_IDS.add(COMPONENT_SERVICE_ID_PROPERTY_ID);
     PROPERTY_IDS.add(COMPONENT_SERVICE_NAME_PROPERTY_ID);
+    PROPERTY_IDS.add(COMPONENT_SERVICE_DISPLAY_NAME_PROPERTY_ID);
     PROPERTY_IDS.add(COMPONENT_COMPONENT_NAME_PROPERTY_ID);
     PROPERTY_IDS.add(COMPONENT_DISPLAY_NAME_PROPERTY_ID);
     PROPERTY_IDS.add(COMPONENT_STATE_PROPERTY_ID);
@@ -137,7 +153,8 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
 
     // keys
     KEY_PROPERTY_IDS.put(Resource.Type.Component, 
COMPONENT_COMPONENT_NAME_PROPERTY_ID);
-    KEY_PROPERTY_IDS.put(Resource.Type.Service, 
COMPONENT_SERVICE_NAME_PROPERTY_ID);
+    KEY_PROPERTY_IDS.put(Resource.Type.ServiceGroup, 
COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID);
+    KEY_PROPERTY_IDS.put(Resource.Type.Service, 
COMPONENT_SERVICE_DISPLAY_NAME_PROPERTY_ID);
     KEY_PROPERTY_IDS.put(Resource.Type.Cluster, 
COMPONENT_CLUSTER_NAME_PROPERTY_ID);
   }
 
@@ -175,16 +192,42 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
       requests.add(getRequest(propertyMap));
     }
 
-    createResources(new Command<Void>() {
+    Set<ServiceComponentResponse> createSvcCmpnt = null;
+    createSvcCmpnt = createResources(new 
Command<Set<ServiceComponentResponse>>() {
       @Override
-      public Void invoke() throws AmbariException, AuthorizationException {
-        createComponents(requests);
-        return null;
+      public Set<ServiceComponentResponse> invoke() throws AmbariException, 
AuthorizationException {
+        return createComponents(requests);
       }
     });
 
-    notifyCreate(Resource.Type.Component, request);
-
+    Set<Resource> associatedResources = new HashSet<>();
+    if (createSvcCmpnt != null) {
+      Iterator<ServiceComponentResponse> itr = createSvcCmpnt.iterator();
+      while (itr.hasNext()) {
+        ServiceComponentResponse response = itr.next();
+        notifyCreate(Resource.Type.Component, request);
+        Resource resource = new ResourceImpl(Resource.Type.Component);
+        resource.setProperty(COMPONENT_CLUSTER_ID_PROPERTY_ID, 
response.getClusterId());
+        resource.setProperty(COMPONENT_CLUSTER_NAME_PROPERTY_ID, 
response.getClusterName());
+        resource.setProperty(COMPONENT_SERVICE_GROUP_ID_PROPERTY_ID, 
response.getServiceGroupId());
+        resource.setProperty(COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID, 
response.getServiceGroupName());
+        resource.setProperty(COMPONENT_SERVICE_ID_PROPERTY_ID, 
response.getServiceId());
+        resource.setProperty(COMPONENT_SERVICE_NAME_PROPERTY_ID, 
response.getServiceName());
+        resource.setProperty(COMPONENT_SERVICE_DISPLAY_NAME_PROPERTY_ID, 
response.getServiceDisplayName());
+        resource.setProperty(COMPONENT_COMPONENT_NAME_PROPERTY_ID, 
response.getComponentName());
+        resource.setProperty(COMPONENT_DISPLAY_NAME_PROPERTY_ID, 
response.getDisplayName());
+        resource.setProperty(COMPONENT_STATE_PROPERTY_ID, 
response.getDesiredState());
+        resource.setProperty(COMPONENT_CATEGORY_PROPERTY_ID, 
response.getCategory());
+        resource.setProperty(COMPONENT_TOTAL_COUNT_PROPERTY_ID, 
response.getServiceComponentStateCount());
+        resource.setProperty(COMPONENT_RECOVERY_ENABLED_ID, 
response.isRecoveryEnabled());
+        resource.setProperty(COMPONENT_DESIRED_STACK, 
response.getDesiredStackId());
+        resource.setProperty(COMPONENT_DESIRED_VERSION, 
response.getDesiredVersion());
+        resource.setProperty(COMPONENT_DESIRED_VERSION, 
response.getRepositoryState());
+
+        associatedResources.add(resource);
+      }
+      return getRequestStatus(null, associatedResources);
+    }
     return getRequestStatus(null);
   }
 
@@ -211,8 +254,13 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
 
     for (ServiceComponentResponse response : responses) {
       Resource resource = new ResourceImpl(Resource.Type.Component);
+      setResourceProperty(resource, COMPONENT_CLUSTER_ID_PROPERTY_ID, 
response.getClusterId(), requestedIds);
       setResourceProperty(resource, COMPONENT_CLUSTER_NAME_PROPERTY_ID, 
response.getClusterName(), requestedIds);
+      setResourceProperty(resource, COMPONENT_SERVICE_GROUP_ID_PROPERTY_ID, 
response.getServiceGroupId(), requestedIds);
+      setResourceProperty(resource, COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID, 
response.getServiceGroupName(), requestedIds);
+      setResourceProperty(resource, COMPONENT_SERVICE_ID_PROPERTY_ID, 
response.getServiceId(), requestedIds);
       setResourceProperty(resource, COMPONENT_SERVICE_NAME_PROPERTY_ID, 
response.getServiceName(), requestedIds);
+      setResourceProperty(resource, 
COMPONENT_SERVICE_DISPLAY_NAME_PROPERTY_ID, response.getServiceDisplayName(), 
requestedIds);
       setResourceProperty(resource, COMPONENT_COMPONENT_NAME_PROPERTY_ID, 
response.getComponentName(), requestedIds);
       setResourceProperty(resource, COMPONENT_DISPLAY_NAME_PROPERTY_ID, 
response.getDisplayName(), requestedIds);
       setResourceProperty(resource, COMPONENT_STATE_PROPERTY_ID, 
response.getDesiredState(), requestedIds);
@@ -262,18 +310,23 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
       throws SystemException, UnsupportedPropertyException, 
NoSuchResourceException, NoSuchParentResourceException {
 
     final Set<ServiceComponentRequest> requests = new HashSet<>();
+    DeleteStatusMetaData deleteStatusMetaData = null;
     for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
       requests.add(getRequest(propertyMap));
     }
-    RequestStatusResponse response = modifyResources(new 
Command<RequestStatusResponse>() {
+    deleteStatusMetaData = modifyResources(new Command<DeleteStatusMetaData>() 
{
       @Override
-      public RequestStatusResponse invoke() throws AmbariException, 
AuthorizationException {
-        return deleteComponents(requests);
+      public DeleteStatusMetaData invoke() throws AmbariException, 
AuthorizationException {
+        deleteComponents(requests);
+        return new DeleteStatusMetaData();
       }
     });
 
     notifyDelete(Resource.Type.Component, predicate);
-    return getRequestStatus(response);
+    for(ServiceComponentRequest svcCmpntReq : requests) {
+      deleteStatusMetaData.addDeletedKey("component_name: 
"+svcCmpntReq.getComponentName());
+    }
+    return getRequestStatus(null, null, deleteStatusMetaData);
   }
 
 
@@ -297,7 +350,8 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
   private ServiceComponentRequest getRequest(Map<String, Object> properties) {
     return new ServiceComponentRequest(
         (String) properties.get(COMPONENT_CLUSTER_NAME_PROPERTY_ID),
-        (String) properties.get(COMPONENT_SERVICE_NAME_PROPERTY_ID),
+        (String) properties.get(COMPONENT_SERVICE_GROUP_NAME_PROPERTY_ID),
+        (String) properties.get(COMPONENT_SERVICE_DISPLAY_NAME_PROPERTY_ID),
         (String) properties.get(COMPONENT_COMPONENT_NAME_PROPERTY_ID),
         (String) properties.get(COMPONENT_STATE_PROPERTY_ID),
         (String) properties.get(COMPONENT_RECOVERY_ENABLED_ID),
@@ -305,14 +359,15 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
   }
 
   // Create the components for the given requests.
-  public void createComponents(Set<ServiceComponentRequest> requests)
+  public Set<ServiceComponentResponse> 
createComponents(Set<ServiceComponentRequest> requests)
       throws AmbariException, AuthorizationException {
 
     if (requests.isEmpty()) {
       LOG.warn("Received an empty requests set");
-      return;
+      return null;
     }
 
+    Set<ServiceComponentResponse> createdSvcCmpnt = new HashSet<>();
     Clusters clusters = getManagementController().getClusters();
     AmbariMetaInfo ambariMetaInfo = 
getManagementController().getAmbariMetaInfo();
     ServiceComponentFactory serviceComponentFactory = 
getManagementController().getServiceComponentFactory();
@@ -323,11 +378,12 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
 
     for (ServiceComponentRequest request : requests) {
       Validate.notEmpty(request.getComponentName(), "component name should be 
non-empty");
+      Validate.notEmpty(request.getServiceGroupName(), "service group name 
should be non-empty");
+      Validate.notEmpty(request.getServiceDisplayName(), "service display name 
should be non-empty");
       Cluster cluster = getClusterForRequest(request, clusters);
 
       isAuthorized(cluster, getRequiredCreateAuthorizations());
 
-      setServiceNameIfAbsent(request, cluster, ambariMetaInfo);
       debug("Received a createComponent request: {}", request);
 
       if (!componentNames.containsKey(request.getClusterName())) {
@@ -335,16 +391,16 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
       }
 
       Map<String, Set<String>> serviceComponents = 
componentNames.get(request.getClusterName());
-      if (!serviceComponents.containsKey(request.getServiceName())) {
-        serviceComponents.put(request.getServiceName(), new HashSet<String>());
+      if (!serviceComponents.containsKey(request.getServiceDisplayName())) {
+        serviceComponents.put(request.getServiceDisplayName(), new 
HashSet<String>());
       }
 
-      if 
(serviceComponents.get(request.getServiceName()).contains(request.getComponentName()))
 {
+      if 
(serviceComponents.get(request.getServiceDisplayName()).contains(request.getComponentName()))
 {
         // throw error later for dup
         duplicates.add(request.toString());
         continue;
       }
-      
serviceComponents.get(request.getServiceName()).add(request.getComponentName());
+      
serviceComponents.get(request.getServiceDisplayName()).add(request.getComponentName());
 
       if (StringUtils.isNotEmpty(request.getDesiredState())) {
         Validate.isTrue(State.INIT == State.valueOf(request.getDesiredState()),
@@ -387,7 +443,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
     // now doing actual work
     for (ServiceComponentRequest request : requests) {
       Cluster cluster = clusters.getCluster(request.getClusterName());
-      Service s = cluster.getService(request.getServiceName());
+      Service s = cluster.getService(request.getServiceDisplayName());
       ServiceComponent sc = serviceComponentFactory.createNew(s, 
request.getComponentName());
       sc.setDesiredRepositoryVersion(s.getDesiredRepositoryVersion());
 
@@ -420,7 +476,9 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
       }
 
       s.addServiceComponent(sc);
+      createdSvcCmpnt.add(sc.convertToResponse());
     }
+    return createdSvcCmpnt;
   }
 
   // Get the components for the given requests.
@@ -457,9 +515,15 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
       final Service s = getServiceFromCluster(request, cluster);
       ServiceComponent sc = s.getServiceComponent(request.getComponentName());
       ServiceComponentResponse serviceComponentResponse = 
sc.convertToResponse();
-
       StackId stackId = sc.getDesiredStackId();
 
+      ServiceGroup sg = null;
+      try {
+        sg = cluster.getServiceGroup(sc.getServiceGroupId());
+      } catch (ServiceGroupNotFoundException e) {
+        sg = null;
+      }
+
       try {
         ComponentInfo componentInfo = 
ambariMetaInfo.getComponent(stackId.getStackName(),
             stackId.getStackVersion(), s.getName(), 
request.getComponentName());
@@ -476,7 +540,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
     }
 
     Set<Service> services = new HashSet<>();
-    if (StringUtils.isNotEmpty(request.getServiceName())) {
+    if (StringUtils.isNotEmpty(request.getServiceDisplayName())) {
       services.add(getServiceFromCluster(request, cluster));
     } else {
       services.addAll(cluster.getServices().values());
@@ -554,12 +618,13 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
       Validate.notEmpty(request.getComponentName(), "component name should be 
non-empty");
       final Cluster cluster = getClusterForRequest(request, clusters);
       final String clusterName = request.getClusterName();
+      final String serviceGroupName = request.getServiceGroupName();
+      final String serviceName = request.getServiceDisplayName();
       final String componentName = request.getComponentName();
 
       LOG.info("Received a updateComponent request: {}", request);
 
       setServiceNameIfAbsent(request, cluster, ambariMetaInfo);
-      final String serviceName = request.getServiceName();
 
       debug("Received a updateComponent request: {}", request);
 
@@ -634,6 +699,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
               + " servicecomponent"
               + ", clusterName=" + cluster.getClusterName()
               + ", clusterId=" + cluster.getClusterId()
+              + ", serviceGroupName=" + serviceGroupName
               + ", serviceName=" + sc.getServiceName()
               + ", componentName=" + sc.getName()
               + ", recoveryEnabled=" + sc.isRecoveryEnabled()
@@ -646,6 +712,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
         }
         debug("Handling update to ServiceComponent"
               + ", clusterName=" + clusterName
+              + ", serviceGroupName=" + serviceGroupName
               + ", serviceName=" + serviceName
               + ", componentName=" + sc.getName()
               + ", recoveryEnabled=" + sc.isRecoveryEnabled()
@@ -660,6 +727,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
         if (oldSchState == State.DISABLED || oldSchState == State.UNKNOWN) {
           debug("Ignoring ServiceComponentHost"
                 + ", clusterName=" + clusterName
+                + ", serviceGroupName=" + serviceGroupName
                 + ", serviceName=" + serviceName
                 + ", componentName=" + sc.getName()
                 + ", recoveryEnabled=" + sc.isRecoveryEnabled()
@@ -673,6 +741,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
           ignoredScHosts.add(sch);
           debug("Ignoring ServiceComponentHost"
                 + ", clusterName=" + clusterName
+                + ", serviceGroupName=" + serviceGroupName
                 + ", serviceName=" + serviceName
                 + ", componentName=" + sc.getName()
                 + ", recoveryEnabled=" + sc.isRecoveryEnabled()
@@ -687,6 +756,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
           ignoredScHosts.add(sch);
           debug("Ignoring ServiceComponentHost in maintenance state"
                 + ", clusterName=" + clusterName
+                + ", serviceGroupName=" + serviceGroupName
                 + ", serviceName=" + serviceName
                 + ", componentName=" + sc.getName()
                 + ", recoveryEnabled=" + sc.isRecoveryEnabled()
@@ -701,6 +771,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
               + " servicecomponenthost"
               + ", clusterName=" + cluster.getClusterName()
               + ", clusterId=" + cluster.getClusterId()
+              + ", serviceGroupName=" + serviceGroupName
               + ", serviceName=" + sch.getServiceName()
               + ", componentName=" + sch.getServiceComponentName()
               + ", recoveryEnabled=" + sc.isRecoveryEnabled()
@@ -717,6 +788,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
 
         debug("Handling update to ServiceComponentHost"
               + ", clusterName=" + clusterName
+              + ", serviceGroupName=" + serviceGroupName
               + ", serviceName=" + serviceName
               + ", componentName=" + sc.getName()
               + ", recoveryEnabled=" + sc.isRecoveryEnabled()
@@ -799,7 +871,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
 
   private Service getServiceFromCluster(final ServiceComponentRequest request, 
final Cluster cluster) throws AmbariException {
     try {
-      return cluster.getService(request.getServiceName());
+      return cluster.getService(request.getServiceDisplayName());
     } catch (ServiceNotFoundException e) {
       throw new ParentObjectNotFoundException("Parent Service resource doesn't 
exist.", e);
     }
@@ -829,11 +901,11 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
   private void setServiceNameIfAbsent(final ServiceComponentRequest request,
                                       final Cluster cluster,
                                       final AmbariMetaInfo ambariMetaInfo) 
throws AmbariException {
-    if (StringUtils.isEmpty(request.getServiceName())) {
+    if (StringUtils.isEmpty(request.getServiceDisplayName())) {
 
       String componentName = request.getComponentName();
 
-      String serviceName = getManagementController().findServiceName(cluster, 
componentName);
+      String serviceName = getManagementController().findService(cluster, 
componentName);
 
       debug("Looking up service name for component, componentName={}, 
serviceName={}", componentName, serviceName);
 
@@ -842,7 +914,7 @@ public class ComponentResourceProvider extends 
AbstractControllerResourceProvide
                 + ", componentName=" + request.getComponentName()
                 + ", clusterName=" + cluster.getClusterName());
       }
-      request.setServiceName(serviceName);
+      request.setServiceDisplayName(serviceName);
     }
   }
 

Reply via email to