Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-14714 68c62212c -> 6a7f5b1bc


AMBARI-22345. Add service dependencies.(vbrodetskyi)


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

Branch: refs/heads/branch-feature-AMBARI-14714
Commit: 6a7f5b1bc12ab13ecd28cb1bac555962eed1cc69
Parents: 68c6221
Author: Vitaly Brodetskyi <vbrodets...@hortonworks.com>
Authored: Thu Dec 21 19:15:16 2017 +0200
Committer: Vitaly Brodetskyi <vbrodets...@hortonworks.com>
Committed: Thu Dec 21 19:15:16 2017 +0200

----------------------------------------------------------------------
 .../ambari/server/api/services/ServiceKey.java  |  13 +-
 .../controller/ServiceDependencyRequest.java    |  50 +-
 .../controller/ServiceDependencyResponse.java   |  12 +-
 .../ServiceDependencyResourceProvider.java      | 121 ++--
 .../apache/ambari/server/state/ServiceImpl.java |   3 +-
 .../ServiceDependencyResourceProviderTest.java  | 573 +++++++++++++++++++
 6 files changed, 714 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6a7f5b1b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceKey.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceKey.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceKey.java
index ace7098..32b87f5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceKey.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceKey.java
@@ -22,6 +22,7 @@ public class ServiceKey {
   private Long serviceId;
   private Long serviceGroupId;
   private Long clusterId;
+  private Long dependencyId;
   private String serviceName;
   private String serviceGroupName;
   private String clusterName;
@@ -29,13 +30,15 @@ public class ServiceKey {
   public ServiceKey() {
   }
 
-  public ServiceKey(Long clusterId, String clusterName, Long serviceGroupId, 
String serviceGroupName, Long serviceId, String serviceName) {
+  public ServiceKey(Long clusterId, String clusterName, Long serviceGroupId, 
String serviceGroupName, Long serviceId, String serviceName,
+                    Long dependencyId) {
     this.clusterId = clusterId;
     this.clusterName = clusterName;
     this.serviceGroupId = serviceGroupId;
     this.serviceGroupName = serviceGroupName;
     this.serviceId = serviceId;
     this.serviceName = serviceName;
+    this.dependencyId = dependencyId;
   }
 
   public Long getClusterId() {
@@ -86,6 +89,14 @@ public class ServiceKey {
     this.serviceName = serviceName;
   }
 
+  public Long getDependencyId() {
+    return dependencyId;
+  }
+
+  public void setDependencyId(Long dependencyId) {
+    this.dependencyId = dependencyId;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a7f5b1b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyRequest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyRequest.java
index 6cf46b4..7f1e80c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyRequest.java
@@ -22,13 +22,20 @@ public class ServiceDependencyRequest {
   private String clusterName;
   private String serviceName;
   private String serviceGroupName;
-  private Long dependencyServiceId;
+  private String dependentClusterName;
+  private String dependentServiceName;
+  private String dependentServiceGroupName;
+  private Long dependencyId;
 
-  public ServiceDependencyRequest(String clusterName, String serviceName, 
String serviceGroupName, Long dependencyServiceId) {
+  public ServiceDependencyRequest(String clusterName, String serviceName, 
String serviceGroupName, String dependentClusterName,
+                                  String dependentServiceGroupName, String 
dependentServiceName, Long dependencyId) {
     this.clusterName = clusterName;
     this.serviceName = serviceName;
     this.serviceGroupName = serviceGroupName;
-    this.dependencyServiceId = dependencyServiceId;
+    this.dependentClusterName = dependentClusterName;
+    this.dependentServiceGroupName = dependentServiceGroupName;
+    this.dependentServiceName = dependentServiceName;
+    this.dependencyId = dependencyId;
   }
 
   public String getClusterName() {
@@ -39,12 +46,36 @@ public class ServiceDependencyRequest {
     this.clusterName = clusterName;
   }
 
-  public Long getDependencyServiceId() {
-    return dependencyServiceId;
+  public Long getDependencyId() {
+    return dependencyId;
   }
 
-  public void setDependencyServiceId(Long dependencyServiceId) {
-    this.dependencyServiceId = dependencyServiceId;
+  public void setDependencyId(Long dependencyId) {
+    this.dependencyId = dependencyId;
+  }
+
+  public String getDependentClusterName() {
+    return dependentClusterName;
+  }
+
+  public void setDependentClusterName(String dependentClusterName) {
+    this.dependentClusterName = dependentClusterName;
+  }
+
+  public String getDependentServiceGroupName() {
+    return dependentServiceGroupName;
+  }
+
+  public void setDependentServiceGroupName(String dependentServiceGroupName) {
+    this.dependentServiceGroupName = dependentServiceGroupName;
+  }
+
+  public String getDependentServiceName() {
+    return dependentServiceName;
+  }
+
+  public void setDependentServiceName(String dependentServiceName) {
+    this.dependentServiceName = dependentServiceName;
   }
 
   public String getServiceGroupName() {
@@ -69,7 +100,10 @@ public class ServiceDependencyRequest {
             "clusterName='" + clusterName + '\'' +
             ", serviceName='" + serviceName + '\'' +
             ", serviceGroupName='" + serviceGroupName + '\'' +
-            ", dependencyServiceId=" + dependencyServiceId +
+            ", dependentClusterName='" + dependentClusterName + '\'' +
+            ", dependentServiceName='" + dependentServiceName + '\'' +
+            ", dependentServiceGroupName='" + dependentServiceGroupName + '\'' 
+
+            ", dependencyId=" + dependencyId +
             '}';
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a7f5b1b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyResponse.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyResponse.java
index b6d40e3..89a5441 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceDependencyResponse.java
@@ -26,6 +26,7 @@ public class ServiceDependencyResponse {
   private Long dependencyClusterId;
   private Long dependencyServiceId;
   private Long dependencyServiceGroupId;
+  private Long dependencyId;
   private String clusterName;
   private String serviceName;
   private String serviceGroupName;
@@ -36,7 +37,7 @@ public class ServiceDependencyResponse {
   public ServiceDependencyResponse(Long clusterId, String clusterName, Long 
dependencyClusterId, String dependencyClusterName,
                                    Long dependencyServiceGroupId, String 
dependencyServiceGroupName, Long dependencyServiceId,
                                    String dependencyServiceName, Long 
serviceGroupId, String serviceGroupName,
-                                   Long serviceId, String serviceName) {
+                                   Long serviceId, String serviceName, Long 
dependencyId) {
     this.clusterId = clusterId;
     this.clusterName = clusterName;
     this.dependencyClusterId = dependencyClusterId;
@@ -49,6 +50,7 @@ public class ServiceDependencyResponse {
     this.serviceGroupName = serviceGroupName;
     this.serviceId = serviceId;
     this.serviceName = serviceName;
+    this.dependencyId = dependencyId;
   }
 
   public Long getClusterId() {
@@ -147,6 +149,14 @@ public class ServiceDependencyResponse {
     this.serviceName = serviceName;
   }
 
+  public Long getDependencyId() {
+    return dependencyId;
+  }
+
+  public void setDependencyId(Long dependencyId) {
+    this.dependencyId = dependencyId;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a7f5b1b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProvider.java
index dd48875..3cb7d18 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProvider.java
@@ -76,12 +76,13 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
   public static final String SERVICE_DEPENDENCY_SERVICE_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_name";
   public static final String SERVICE_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID 
= RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_group_name";
   public static final String SERVICE_DEPENDENCY_SERVICE_GROUP_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "service_group_id";
-  public static final String 
SERVICE_DEPENDENCY_DEPENDENCY_CLUSTER_ID_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependency_cluster_id";
-  public static final String 
SERVICE_DEPENDENCY_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependency_cluster_name";
-  public static final String 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_ID_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependency_service_id";
-  public static final String 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_NAME_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependency_service_name";
-  public static final String 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependency_service_group_name";
-  public static final String 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_GROUP_ID_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependency_service_group_id";
+  public static final String 
SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_ID_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependent_cluster_id";
+  public static final String 
SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_NAME_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependent_cluster_name";
+  public static final String 
SERVICE_DEPENDENCY_DEPENDENT_SERVICE_ID_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependent_service_id";
+  public static final String 
SERVICE_DEPENDENCY_DEPENDENT_SERVICE_NAME_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependent_service_name";
+  public static final String 
SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_NAME_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependent_service_group_name";
+  public static final String 
SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_ID_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "dependent_service_group_id";
+  public static final String SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "dependency_id";
 
   protected ObjectMapper mapper = new ObjectMapper();;
 
@@ -90,7 +91,7 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
                   SERVICE_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID,
                   SERVICE_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID,
                   SERVICE_DEPENDENCY_SERVICE_NAME_PROPERTY_ID,
-                  SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_ID_PROPERTY_ID}));
+                  SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID}));
 
   private static Gson gson = StageUtils.getGson();
 
@@ -110,20 +111,21 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
     PROPERTY_IDS.add(SERVICE_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID);
     PROPERTY_IDS.add(SERVICE_DEPENDENCY_SERVICE_ID_PROPERTY_ID);
     PROPERTY_IDS.add(SERVICE_DEPENDENCY_SERVICE_NAME_PROPERTY_ID);
-    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENCY_CLUSTER_ID_PROPERTY_ID);
-    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID);
-    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_ID_PROPERTY_ID);
-    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_NAME_PROPERTY_ID);
+    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_ID_PROPERTY_ID);
+    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_NAME_PROPERTY_ID);
+    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_ID_PROPERTY_ID);
+    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_NAME_PROPERTY_ID);
     PROPERTY_IDS.add(SERVICE_DEPENDENCY_SERVICE_GROUP_ID_PROPERTY_ID);
     PROPERTY_IDS.add(SERVICE_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID);
-    
PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_GROUP_ID_PROPERTY_ID);
-    
PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID);
+    
PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_ID_PROPERTY_ID);
+    
PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_NAME_PROPERTY_ID);
+    PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID);
 
     // keys
     KEY_PROPERTY_IDS.put(Resource.Type.Cluster, 
SERVICE_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID);
     KEY_PROPERTY_IDS.put(Resource.Type.Service, 
SERVICE_DEPENDENCY_SERVICE_NAME_PROPERTY_ID);
     KEY_PROPERTY_IDS.put(Resource.Type.ServiceGroup, 
SERVICE_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID);
-    KEY_PROPERTY_IDS.put(Resource.Type.ServiceDependency, 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_ID_PROPERTY_ID);
+    KEY_PROPERTY_IDS.put(Resource.Type.ServiceDependency, 
SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID);
   }
 
   private Clusters clusters;
@@ -180,18 +182,20 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
                 response.getServiceGroupId());
         resource.setProperty(SERVICE_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID,
                 response.getServiceGroupName());
-        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_CLUSTER_ID_PROPERTY_ID,
+        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_ID_PROPERTY_ID,
                 response.getDependencyClusterId());
-        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID,
+        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_NAME_PROPERTY_ID,
                 response.getDependencyClusterName());
-        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_ID_PROPERTY_ID,
+        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_ID_PROPERTY_ID,
                 response.getDependencyServiceId());
-        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_NAME_PROPERTY_ID,
+        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_NAME_PROPERTY_ID,
                 response.getDependencyServiceName());
-        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_GROUP_ID_PROPERTY_ID,
+        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_ID_PROPERTY_ID,
                 response.getDependencyServiceGroupId());
-        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID,
+        
resource.setProperty(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_NAME_PROPERTY_ID,
                 response.getDependencyServiceGroupName());
+        resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID,
+                response.getDependencyId());
 
         associatedResources.add(resource);
       }
@@ -235,18 +239,20 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
               response.getServiceGroupId(), requestedIds);
       setResourceProperty(resource, 
SERVICE_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID,
               response.getServiceGroupName(), requestedIds);
-      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENCY_CLUSTER_ID_PROPERTY_ID,
+      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_ID_PROPERTY_ID,
               response.getDependencyClusterId(), requestedIds);
-      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID,
+      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_NAME_PROPERTY_ID,
               response.getDependencyClusterName(), requestedIds);
-      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_ID_PROPERTY_ID,
+      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENT_SERVICE_ID_PROPERTY_ID,
               response.getDependencyServiceId(), requestedIds);
-      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_NAME_PROPERTY_ID,
+      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENT_SERVICE_NAME_PROPERTY_ID,
               response.getDependencyServiceName(), requestedIds);
-      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_GROUP_ID_PROPERTY_ID,
+      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_ID_PROPERTY_ID,
               response.getDependencyServiceGroupId(), requestedIds);
-      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID,
+      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_NAME_PROPERTY_ID,
               response.getDependencyServiceGroupName(), requestedIds);
+      setResourceProperty(resource, 
SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID,
+              response.getDependencyId(), requestedIds);
 
       resources.add(resource);
     }
@@ -283,7 +289,7 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
     notifyDelete(Resource.Type.ServiceDependency, predicate);
     for(ServiceDependencyRequest svgReq : requests) {
       deleteStatusMetaData.addDeletedKey("cluster_name: " + 
svgReq.getClusterName() + ", " + " service_name: " + svgReq.getServiceName()
-              + " dependency_service_ID: " + svgReq.getDependencyServiceId());
+              + " dependency id: " + svgReq.getDependencyId());
     }
     return getRequestStatus(null, null, deleteStatusMetaData);
   }
@@ -319,9 +325,13 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
     String clusterName = (String) 
properties.get(SERVICE_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID);
     String serviceName = (String) 
properties.get(SERVICE_DEPENDENCY_SERVICE_NAME_PROPERTY_ID);
     String serviceGroupName = (String) 
properties.get(SERVICE_DEPENDENCY_SERVICE_GROUP_NAME_PROPERTY_ID);
-    String strdependencyServiceId = (String) 
properties.get(SERVICE_DEPENDENCY_DEPENDENCY_SERVICE_ID_PROPERTY_ID);
-    Long dependencyServiceId = strdependencyServiceId == null ? null : 
Long.valueOf(strdependencyServiceId);
-    ServiceDependencyRequest svcRequest = new 
ServiceDependencyRequest(clusterName, serviceName, serviceGroupName, 
dependencyServiceId);
+    String dependentClusterName = (String) 
properties.get(SERVICE_DEPENDENCY_DEPENDENT_CLUSTER_NAME_PROPERTY_ID);
+    String dependentServiceName = (String) 
properties.get(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_NAME_PROPERTY_ID);
+    String dependentServiceGroupName = (String) 
properties.get(SERVICE_DEPENDENCY_DEPENDENT_SERVICE_GROUP_NAME_PROPERTY_ID);
+    String strDependencyId = (String) 
properties.get(SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID);
+    Long dependencyId = strDependencyId == null ? null : 
Long.valueOf(strDependencyId);
+    ServiceDependencyRequest svcRequest = new 
ServiceDependencyRequest(clusterName, serviceName, serviceGroupName,
+            dependentClusterName, dependentServiceGroupName, 
dependentServiceName, dependencyId);
     return svcRequest;
   }
 
@@ -339,12 +349,26 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
     // do all validation checks
     validateCreateRequests(requests, clusters);
 
+
     Set<ServiceDependencyResponse> createdServiceDependencies = new 
HashSet<>();
     for (ServiceDependencyRequest request : requests) {
       Cluster cluster = clusters.getCluster(request.getClusterName());
+      ServiceGroup serviceGroup = 
cluster.getServiceGroup(request.getServiceGroupName());
+
+      Cluster dependentServiceCluster = cluster;
+      if (StringUtils.isNotEmpty(request.getDependentClusterName())) {
+        dependentServiceCluster = 
clusters.getCluster(request.getDependentClusterName());
+      }
+
+      ServiceGroup dependentServiceGroup = serviceGroup;
+      if (StringUtils.isNotEmpty(request.getDependentServiceGroupName())) {
+        dependentServiceGroup = 
dependentServiceCluster.getServiceGroup(request.getDependentServiceGroupName());
+      }
+
 
+      Service dependentService = 
cluster.getService(dependentServiceGroup.getServiceGroupName(), 
request.getDependentServiceName());
 
-      Service updatedService = 
cluster.addDependencyToService(request.getServiceGroupName(), 
request.getServiceName(), request.getDependencyServiceId());
+      Service updatedService = 
cluster.addDependencyToService(request.getServiceGroupName(), 
request.getServiceName(), dependentService.getServiceId());
       
createdServiceDependencies.addAll(updatedService.getServiceDependencyResponses());
     }
     return createdServiceDependencies;
@@ -412,7 +436,6 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
 
     Clusters clusters = getManagementController().getClusters();
 
-    Set<ServiceDependencyRequest> removable = new HashSet<>();
 
     for (ServiceDependencyRequest serviceDependencyRequest : request) {
       if (null == serviceDependencyRequest.getClusterName()
@@ -427,7 +450,6 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
         }
 
         Cluster cluster = 
clusters.getCluster(serviceDependencyRequest.getClusterName());
-        ServiceGroup serviceGroup = 
cluster.getServiceGroup(serviceDependencyRequest.getServiceGroupName());
         Service service = null;
 
         for (Service srv : cluster.getServicesById().values()) {
@@ -444,18 +466,20 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
                   "dependencies, so nothing to remove.");
         } else {
           boolean dependencyAvailable = false;
+          long dependentServiceId = 0L;
           for (ServiceKey serviceKey : serviceKeys) {
-            if (serviceKey.getServiceId() == 
serviceDependencyRequest.getDependencyServiceId()) {
+            if (serviceKey.getDependencyId() == 
serviceDependencyRequest.getDependencyId()) {
               dependencyAvailable = true;
+              dependentServiceId = serviceKey.getServiceId();
             }
           }
           if (!dependencyAvailable) {
             throw new AmbariException("Servcie name " + 
serviceDependencyRequest.getServiceName() + " has no" +
-                    "dependency service with id" + 
serviceDependencyRequest.getDependencyServiceId() + ", so nothing to remove.");
+                    "service dependency with id" + 
serviceDependencyRequest.getDependencyId() + ", so nothing to remove.");
           }
 
           
service.getCluster().removeDependencyFromService(serviceDependencyRequest.getServiceGroupName(),
 serviceDependencyRequest.getServiceName(),
-                  serviceDependencyRequest.getDependencyServiceId());
+                  dependentServiceId);
         }
       }
     }
@@ -471,12 +495,14 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
       final String clusterName = request.getClusterName();
       final String serviceGroupName = request.getServiceGroupName();
       final String serviceName = request.getServiceName();
-      final Long dependencyServiceId = request.getDependencyServiceId();
+      final String dependentClusterName = request.getDependentClusterName();
+      final String dependentServiceGroupName = 
request.getDependentServiceGroupName();
+      final String dependentServiceName = request.getDependentServiceName();
 
       Validate.notNull(clusterName, "Cluster name should be provided when 
creating a service dependency");
       Validate.notNull(serviceGroupName, "Service group name should be 
provided when creating a service dependency");
       Validate.notNull(serviceName, "Service name should be provided when 
creating a service dependency");
-      Validate.notNull(dependencyServiceId, "Dependency service id should be 
provided when creating a service dependency");
+      Validate.notNull(dependentServiceName, "Dependency service name should 
be provided when creating a service dependency");
 
       //throws cluster not found exception
       Cluster cluster = clusters.getCluster(clusterName);
@@ -485,17 +511,18 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
       //throws service not found exception
       Service service = cluster.getService(serviceName);
 
-      boolean dependencyServiceAvailable = false;
-      for (Cluster cl : clusters.getClusters().values()) {
-        if (cl.getServicesById().containsKey(dependencyServiceId)) {
-          dependencyServiceAvailable = true;
-        }
+      Cluster dependencyCluster = cluster;
+      if (StringUtils.isNotEmpty(dependentClusterName)) {
+        dependencyCluster = clusters.getCluster(dependentClusterName);
       }
 
-      if (!dependencyServiceAvailable) {
-        throw new AmbariException("There is no service with id=" + 
dependencyServiceId);
+      ServiceGroup dependencyServiceGroup = serviceGroup;
+      if (StringUtils.isNotEmpty(dependentServiceGroupName)) {
+        dependencyServiceGroup = 
dependencyCluster.getServiceGroup(dependentServiceGroupName);
       }
 
+      Service dependencyService = 
dependencyCluster.getService(dependentServiceGroupName, dependentServiceName);
+
       if (LOG.isDebugEnabled()) {
         LOG.debug("Received a createServiceDependency request" +
                 ", clusterName=" + clusterName + ", serviceGroupName=" + 
serviceGroupName + ", request=" + request);
@@ -509,8 +536,8 @@ public class ServiceDependencyResourceProvider extends 
AbstractControllerResourc
 
       if (service.getServiceDependencies() != null) {
         for (ServiceKey sk : service.getServiceDependencies()) {
-          if (sk.getServiceId() == dependencyServiceId) {
-            throw new AmbariException("Service with id=" + dependencyServiceId 
+ " already added to dependencies for " +
+          if (sk.getServiceId() == dependencyService.getServiceId()) {
+            throw new AmbariException("Service with id=" + 
dependencyService.getServiceId() + " already added to dependencies for " +
                     serviceName + " service");
           }
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a7f5b1b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java 
b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
index 02ea294..7f1daa7 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
@@ -364,7 +364,7 @@ public class ServiceImpl implements Service {
         responses.add(new ServiceDependencyResponse(cluster.getClusterId(), 
cluster.getClusterName(),
                  sk.getClusterId(), sk.getClusterName(), 
sk.getServiceGroupId(), sk.getServiceGroupName(),
                  sk.getServiceId(), sk.getServiceName(), getServiceGroupId(), 
getServiceGroupName(),
-                 getServiceId(), getName()));
+                 getServiceId(), getName(), sk.getDependencyId()));
       }
     }
     return responses;
@@ -403,6 +403,7 @@ public class ServiceImpl implements Service {
         serviceKey.setClusterId(clusterId);
         serviceKey.setServiceName(dependencyService.getServiceName());
         serviceKey.setServiceId(dependencyService.getServiceId());
+        serviceKey.setDependencyId(sde.getServiceDependencyId());
         serviceDependenciesList.add(serviceKey);
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a7f5b1b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProviderTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProviderTest.java
new file mode 100644
index 0000000..391d9bc
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceDependencyResourceProviderTest.java
@@ -0,0 +1,573 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.persistence.EntityManager;
+
+import org.apache.ambari.server.H2DatabaseCleaner;
+import org.apache.ambari.server.actionmanager.ActionDBAccessor;
+import org.apache.ambari.server.actionmanager.ActionManager;
+import org.apache.ambari.server.actionmanager.HostRoleCommand;
+import org.apache.ambari.server.actionmanager.StageFactory;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
+import org.apache.ambari.server.audit.AuditLogger;
+import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ClusterRequest;
+import org.apache.ambari.server.controller.MaintenanceStateHelper;
+import org.apache.ambari.server.controller.RequestStatusResponse;
+import org.apache.ambari.server.controller.ServiceComponentHostRequest;
+import org.apache.ambari.server.controller.ServiceComponentRequest;
+import org.apache.ambari.server.controller.ServiceDependencyRequest;
+import org.apache.ambari.server.controller.ServiceDependencyResponse;
+import org.apache.ambari.server.controller.ServiceRequest;
+import org.apache.ambari.server.orm.GuiceJpaInitializer;
+import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.OrmTestHelper;
+import org.apache.ambari.server.orm.dao.ClusterServiceDAO;
+import org.apache.ambari.server.orm.dao.HostDAO;
+import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
+import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
+import org.apache.ambari.server.orm.dao.ServiceGroupDAO;
+import org.apache.ambari.server.orm.dao.TopologyHostInfoDAO;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.security.TestAuthenticationFactory;
+import org.apache.ambari.server.stack.StackManagerMock;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ConfigHelper;
+import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.HostState;
+import org.apache.ambari.server.state.SecurityType;
+import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.ServiceComponentFactory;
+import org.apache.ambari.server.state.ServiceComponentHostFactory;
+import org.apache.ambari.server.state.ServiceFactory;
+import org.apache.ambari.server.state.ServiceGroup;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.State;
+import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
+import org.apache.ambari.server.topology.TopologyManager;
+import org.apache.ambari.server.utils.EventBusSynchronizer;
+import org.apache.ambari.server.utils.StageUtils;
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+
+public class ServiceDependencyResourceProviderTest {
+
+  private static final String SERVICE_GROUP_NAME_CORE = "CORE";
+  private static final String SERVICE_GROUP_NAME_TEST = "TEST";
+  private static final String SERVICE_NAME_HDFS = "HDFS";
+  private static final String SERVICE_NAME_YARN = "YARN";
+  private static final String SERVICE_NAME_ZOOKEEPER = "ZOOKEEPER";
+
+  private static AmbariManagementController controller;
+  private static Clusters clusters;
+  private ActionDBAccessor actionDB;
+  private static Injector injector;
+  private ServiceFactory serviceFactory;
+  private ServiceComponentFactory serviceComponentFactory;
+  private ServiceComponentHostFactory serviceComponentHostFactory;
+  private static AmbariMetaInfo ambariMetaInfo;
+  private EntityManager entityManager;
+  private static Properties backingProperties;
+  private Configuration configuration;
+  private ConfigHelper configHelper;
+  private ConfigGroupFactory configGroupFactory;
+  private OrmTestHelper helper;
+  private StageFactory stageFactory;
+  private HostDAO hostDAO;
+  private ServiceGroupDAO serviceGroupDAO;
+  private ClusterServiceDAO serviceDAO;
+  private TopologyHostInfoDAO topologyHostInfoDAO;
+  private HostRoleCommandDAO hostRoleCommandDAO;
+  private StackManagerMock stackManagerMock;
+  private RepositoryVersionDAO repositoryVersionDAO;
+
+  RepositoryVersionEntity repositoryVersion206;
+
+
+  @BeforeClass
+  public static void beforeClass() throws Exception {
+    InMemoryDefaultTestModule module = new InMemoryDefaultTestModule();
+    backingProperties = module.getProperties();
+    injector = Guice.createInjector(module);
+    H2DatabaseCleaner.resetSequences(injector);
+    injector.getInstance(GuiceJpaInitializer.class);
+    ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
+    ambariMetaInfo.init();
+    clusters = injector.getInstance(Clusters.class);
+    controller = injector.getInstance(AmbariManagementController.class);
+    TopologyManager topologyManager = 
injector.getInstance(TopologyManager.class);
+    StageUtils.setTopologyManager(topologyManager);
+    Configuration configuration = injector.getInstance(Configuration.class);
+    StageUtils.setConfiguration(configuration);
+    ActionManager.setTopologyManager(topologyManager);
+
+    
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
+  }
+
+  @Before
+  public void setup() throws Exception {
+    EventBusSynchronizer.synchronizeAmbariEventPublisher(injector);
+
+    entityManager = injector.getProvider(EntityManager.class).get();
+    actionDB = injector.getInstance(ActionDBAccessor.class);
+    serviceFactory = injector.getInstance(ServiceFactory.class);
+    serviceComponentFactory = injector.getInstance(
+            ServiceComponentFactory.class);
+    serviceComponentHostFactory = injector.getInstance(
+            ServiceComponentHostFactory.class);
+    configuration = injector.getInstance(Configuration.class);
+    configHelper = injector.getInstance(ConfigHelper.class);
+    configGroupFactory = injector.getInstance(ConfigGroupFactory.class);
+    helper = injector.getInstance(OrmTestHelper.class);
+    stageFactory = injector.getInstance(StageFactory.class);
+    hostDAO = injector.getInstance(HostDAO.class);
+    serviceGroupDAO = injector.getInstance(ServiceGroupDAO.class);
+    serviceDAO = injector.getInstance(ClusterServiceDAO.class);
+    topologyHostInfoDAO = injector.getInstance(TopologyHostInfoDAO.class);
+    hostRoleCommandDAO = injector.getInstance(HostRoleCommandDAO.class);
+    stackManagerMock = (StackManagerMock) ambariMetaInfo.getStackManager();
+    EasyMock.replay(injector.getInstance(AuditLogger.class));
+
+    repositoryVersion206 = helper.getOrCreateRepositoryVersion(
+            new StackId("HDP-2.0.6"), "2.0.6-1234");
+
+
+
+    repositoryVersionDAO = injector.getInstance(RepositoryVersionDAO.class);
+  }
+
+  @After
+  public void teardown() {
+    actionDB = null;
+    EasyMock.reset(injector.getInstance(AuditLogger.class));
+  }
+
+  @AfterClass
+  public static void afterClass() throws Exception {
+    H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
+  }
+
+  private static String getUniqueName() {
+    return UUID.randomUUID().toString();
+  }
+
+  private void setOsFamily(Host host, String osFamily, String osVersion) {
+    Map<String, String> hostAttributes = new HashMap<>();
+    hostAttributes.put("os_family", osFamily);
+    hostAttributes.put("os_release_version", osVersion);
+
+    host.setHostAttributes(hostAttributes);
+  }
+
+  private void addHost(String hostname) throws Exception {
+    addHostToCluster(hostname, null);
+  }
+
+  private void addHostToCluster(String hostname, String clusterName) throws 
Exception {
+
+    if (!clusters.hostExists(hostname)) {
+      clusters.addHost(hostname);
+      setOsFamily(clusters.getHost(hostname), "redhat", "6.3");
+      clusters.getHost(hostname).setState(HostState.HEALTHY);
+    }
+
+    if (null != clusterName) {
+      clusters.mapHostToCluster(hostname, clusterName);
+    }
+  }
+
+
+  /**
+   * Creates a Cluster object, along with its corresponding ClusterVersion 
based on the stack.
+   * @param clusterName Cluster name
+   * @throws Exception
+   */
+  private void createCluster(String clusterName) throws Exception{
+    ClusterRequest r = new ClusterRequest(null, clusterName, 
State.INSTALLED.name(), SecurityType.NONE, "HDP-0.1", null);
+    controller.createCluster(r);
+  }
+
+  private void createService(String clusterName, String serviceGroupName, 
String serviceName, State desiredState) throws Exception {
+    createService(clusterName, serviceGroupName, serviceName, 
repositoryVersion206, desiredState);
+  }
+
+  private void createService(String clusterName, String serviceGroupName, 
String serviceName,
+                             RepositoryVersionEntity repositoryVersion, State 
desiredState
+  )
+          throws Exception {
+    String dStateStr = null;
+    if (desiredState != null) {
+      dStateStr = desiredState.toString();
+    }
+
+    ServiceRequest r1 = new ServiceRequest(clusterName, serviceGroupName, 
serviceName,
+            repositoryVersion.getId(), dStateStr,
+            null);
+
+    ServiceResourceProviderTest.createServices(controller, 
repositoryVersionDAO, Collections.singleton(r1));
+  }
+
+  private void createServiceComponent(String clusterName,
+                                      String serviceGroupName, String 
serviceName, String componentName, State desiredState
+  )
+          throws Exception {
+    String dStateStr = null;
+    if (desiredState != null) {
+      dStateStr = desiredState.toString();
+    }
+    ServiceComponentRequest r = new ServiceComponentRequest(clusterName, 
serviceGroupName,
+            serviceName, componentName, dStateStr);
+    ComponentResourceProviderTest.createComponents(controller, 
Collections.singleton(r));
+  }
+
+  private void createServiceComponentHost(String clusterName,
+                                          String serviceGroupName, String 
serviceName, String componentName, String hostname,
+                                          State desiredState
+  ) throws Exception {
+    String dStateStr = null;
+    if (desiredState != null) {
+      dStateStr = desiredState.toString();
+    }
+    ServiceComponentHostRequest r = new 
ServiceComponentHostRequest(clusterName, serviceGroupName,
+            serviceName, componentName, hostname, dStateStr);
+    controller.createHostComponents(Collections.singleton(r));
+  }
+
+
+  private long installService(String clusterName, String serviceGroupName, 
String serviceName, boolean runSmokeTests, boolean reconfigureClients)
+          throws Exception {
+    return installService(clusterName, serviceGroupName, serviceName, 
runSmokeTests, reconfigureClients, null, null);
+  }
+
+
+  /**
+   * Allows to set maintenanceStateHelper. For use when there is anything to 
test
+   * with maintenance mode.
+   */
+  private long installService(String clusterName, String serviceGroupName, 
String serviceName,
+                              boolean runSmokeTests, boolean 
reconfigureClients,
+                              MaintenanceStateHelper maintenanceStateHelper,
+                              Map<String, String> mapRequestPropsInput
+  )
+          throws Exception {
+
+    ServiceRequest r = new ServiceRequest(clusterName, serviceGroupName, 
serviceName, repositoryVersion206.getId(),
+            State.INSTALLED.toString(), null);
+
+    Set<ServiceRequest> requests = new HashSet<>();
+    requests.add(r);
+
+    Map<String, String> mapRequestProps = new HashMap<>();
+    mapRequestProps.put("context", "Called from a test");
+    if(mapRequestPropsInput != null) {
+      mapRequestProps.putAll(mapRequestPropsInput);
+    }
+
+    RequestStatusResponse resp = 
ServiceResourceProviderTest.updateServices(controller, requests,
+            mapRequestProps, runSmokeTests, reconfigureClients, 
maintenanceStateHelper);
+
+    Assert.assertEquals(State.INSTALLED,
+            clusters.getCluster(clusterName).getService(serviceName)
+                    .getDesiredState());
+
+    if (resp != null) {
+      // manually change live state to stopped as no running action manager
+      List<HostRoleCommand> commands = 
actionDB.getRequestTasks(resp.getRequestId());
+      for (HostRoleCommand cmd : commands) {
+        
clusters.getCluster(clusterName).getService(serviceName).getServiceComponent(cmd.getRole().name())
+                
.getServiceComponentHost(cmd.getHostName()).setState(State.INSTALLED);
+      }
+      return resp.getRequestId();
+    } else {
+      return -1;
+    }
+  }
+
+
+  private Cluster setupClusterWithHosts(String clusterName, String stackId, 
List<String> hosts,
+                                        String osType) throws Exception {
+    ClusterRequest r = new ClusterRequest(null, clusterName, stackId, null);
+    controller.createCluster(r);
+    Cluster c1 = clusters.getCluster(clusterName);
+    for (String host : hosts) {
+      addHostToCluster(host, clusterName);
+    }
+    return c1;
+  }
+
+  private Cluster createDefaultCluster(String clusterName) throws Exception {
+    // !!! weird, but the assertions are banking on alphabetical order
+    final String host1 = "a" + getUniqueName();
+    final String host2 = "b" + getUniqueName();
+    final String host3 = "c" + getUniqueName();
+
+    setupClusterWithHosts(clusterName, "HDP-2.0.6", Arrays.asList(host1, 
host2, host3), "centos6");
+
+    Cluster cluster = clusters.getCluster(clusterName);
+    cluster.setDesiredStackVersion(new StackId("HDP-2.0.6"));
+    cluster.setCurrentStackVersion(new StackId("HDP-2.0.6"));
+
+    RepositoryVersionEntity repositoryVersion = repositoryVersion206;
+
+    ServiceGroup serviceGroupCore = 
cluster.addServiceGroup(SERVICE_GROUP_NAME_CORE);
+    ServiceGroup serviceGroupTest = 
cluster.addServiceGroup(SERVICE_GROUP_NAME_TEST);
+
+    Service hdfs = cluster.addService(serviceGroupCore, SERVICE_NAME_HDFS, 
SERVICE_NAME_HDFS, repositoryVersion);
+    Service yarn = cluster.addService(serviceGroupCore, SERVICE_NAME_YARN, 
SERVICE_NAME_YARN, repositoryVersion);
+    Service zookeeper = cluster.addService(serviceGroupTest, 
SERVICE_NAME_ZOOKEEPER, SERVICE_NAME_ZOOKEEPER, repositoryVersion);
+
+    return cluster;
+  }
+
+
+
+  @Test
+  public void testDefaultRequestForServiceDependencyCreation() throws 
Exception {
+    final String cluster1 = getUniqueName();
+
+    Cluster cluster = createDefaultCluster(cluster1);
+
+    ServiceGroup serviceGroupCore = 
cluster.getServiceGroup(SERVICE_GROUP_NAME_CORE);
+    Service hdfs = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_HDFS);
+    Service yarn = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_YARN);
+
+    Set<ServiceDependencyRequest> requests = new HashSet<>();
+    ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, 
hdfs.getName(), serviceGroupCore.getServiceGroupName(),
+            cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), 
null);
+    requests.add(request);
+
+    ServiceDependencyResourceProvider serviceDependencyResourceProvider = new 
ServiceDependencyResourceProvider(controller);
+    Set<ServiceDependencyResponse> responses = 
serviceDependencyResourceProvider.createServiceDependencies(requests);
+
+    Assert.assertEquals(responses.size(), 1);
+
+    ServiceDependencyResponse serviceDependencyResponse = 
responses.iterator().next();
+    Assert.assertEquals(serviceDependencyResponse.getServiceName(), 
hdfs.getName());
+    Assert.assertEquals(serviceDependencyResponse.getDependencyServiceName(), 
yarn.getName());
+    Assert.assertEquals(serviceDependencyResponse.getClusterName(), cluster1);
+    Assert.assertEquals(serviceDependencyResponse.getDependencyClusterName(), 
cluster1);
+    Assert.assertEquals(serviceDependencyResponse.getServiceGroupName(), 
serviceGroupCore.getServiceGroupName());
+    
Assert.assertEquals(serviceDependencyResponse.getDependencyServiceGroupName(), 
serviceGroupCore.getServiceGroupName());
+  }
+
+
+  @Test
+  public void 
testRequestWithTwoDifferentServiceGroupsForServiceDependencyCreation() throws 
Exception {
+    final String cluster1 = getUniqueName();
+
+    Cluster cluster = createDefaultCluster(cluster1);
+
+    ServiceGroup serviceGroupCore = 
cluster.getServiceGroup(SERVICE_GROUP_NAME_CORE);
+    ServiceGroup serviceGroupTest = 
cluster.getServiceGroup(SERVICE_GROUP_NAME_TEST);
+    Service hdfs = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_HDFS);
+    Service zookeeper = cluster.getService(SERVICE_GROUP_NAME_TEST, 
SERVICE_NAME_ZOOKEEPER);
+
+    Set<ServiceDependencyRequest> requests = new HashSet<>();
+    ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, 
hdfs.getName(), serviceGroupCore.getServiceGroupName(),
+            cluster1, serviceGroupTest.getServiceGroupName(), 
zookeeper.getName(), null);
+    requests.add(request);
+
+    ServiceDependencyResourceProvider serviceDependencyResourceProvider = new 
ServiceDependencyResourceProvider(controller);
+    Set<ServiceDependencyResponse> responses = 
serviceDependencyResourceProvider.createServiceDependencies(requests);
+
+    Assert.assertEquals(responses.size(), 1);
+
+    ServiceDependencyResponse serviceDependencyResponse = 
responses.iterator().next();
+    Assert.assertEquals(serviceDependencyResponse.getServiceName(), 
hdfs.getName());
+    Assert.assertEquals(serviceDependencyResponse.getDependencyServiceName(), 
zookeeper.getName());
+    Assert.assertEquals(serviceDependencyResponse.getClusterName(), cluster1);
+    Assert.assertEquals(serviceDependencyResponse.getDependencyClusterName(), 
cluster1);
+    Assert.assertEquals(serviceDependencyResponse.getServiceGroupName(), 
serviceGroupCore.getServiceGroupName());
+    
Assert.assertEquals(serviceDependencyResponse.getDependencyServiceGroupName(), 
serviceGroupTest.getServiceGroupName());
+  }
+
+  @Test
+  public void testRequestWithInvalidServiceGroupName() throws Exception {
+    final String cluster1 = getUniqueName();
+
+    Cluster cluster = createDefaultCluster(cluster1);
+
+    ServiceGroup serviceGroupCore = 
cluster.getServiceGroup(SERVICE_GROUP_NAME_CORE);
+    Service hdfs = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_HDFS);
+    Service zookeeper = cluster.getService(SERVICE_GROUP_NAME_TEST, 
SERVICE_NAME_ZOOKEEPER);
+
+    Set<ServiceDependencyRequest> requests = new HashSet<>();
+    ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, 
hdfs.getName(), serviceGroupCore.getServiceGroupName(),
+            cluster1, "invalid_service_group_name", zookeeper.getName(), null);
+    requests.add(request);
+
+    ServiceDependencyResourceProvider serviceDependencyResourceProvider = new 
ServiceDependencyResourceProvider(controller);
+    boolean isFailed = false;
+    Exception exception = null;
+    try {
+      Set<ServiceDependencyResponse> responses = 
serviceDependencyResourceProvider.createServiceDependencies(requests);
+    } catch (Exception e) {
+      isFailed = true;
+      exception = e;
+    }
+
+    Assert.assertTrue(isFailed);
+    Assert.assertTrue(exception.getMessage().contains("ServiceGroup not 
found"));
+
+  }
+
+  @Test
+  public void testRequestWithInvalidClusterName() throws Exception {
+    final String cluster1 = getUniqueName();
+
+    Cluster cluster = createDefaultCluster(cluster1);
+
+    ServiceGroup serviceGroupCore = 
cluster.getServiceGroup(SERVICE_GROUP_NAME_CORE);
+    Service hdfs = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_HDFS);
+    Service zookeeper = cluster.getService(SERVICE_GROUP_NAME_TEST, 
SERVICE_NAME_ZOOKEEPER);
+
+    Set<ServiceDependencyRequest> requests = new HashSet<>();
+    ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, 
hdfs.getName(), serviceGroupCore.getServiceGroupName(),
+            "invalid_cluster_name", serviceGroupCore.getServiceGroupName(), 
zookeeper.getName(), null);
+    requests.add(request);
+
+    ServiceDependencyResourceProvider serviceDependencyResourceProvider = new 
ServiceDependencyResourceProvider(controller);
+    boolean isFailed = false;
+    Exception exception = null;
+    try {
+      Set<ServiceDependencyResponse> responses = 
serviceDependencyResourceProvider.createServiceDependencies(requests);
+    } catch (Exception e) {
+      isFailed = true;
+      exception = e;
+    }
+
+    Assert.assertTrue(isFailed);
+    Assert.assertTrue(exception.getMessage().contains("Cluster not found"));
+
+  }
+
+
+  @Test
+  public void testDeleteRequestForServiceDependency() throws Exception {
+    final String cluster1 = getUniqueName();
+
+    Cluster cluster = createDefaultCluster(cluster1);
+
+    ServiceGroup serviceGroupCore = 
cluster.getServiceGroup(SERVICE_GROUP_NAME_CORE);
+    Service hdfs = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_HDFS);
+    Service yarn = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_YARN);
+
+    Set<ServiceDependencyRequest> requests = new HashSet<>();
+    ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, 
hdfs.getName(), serviceGroupCore.getServiceGroupName(),
+            cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), 
null);
+    requests.add(request);
+
+    ServiceDependencyResourceProvider serviceDependencyResourceProvider = new 
ServiceDependencyResourceProvider(controller);
+    Set<ServiceDependencyResponse> responses = 
serviceDependencyResourceProvider.createServiceDependencies(requests);
+
+    Assert.assertEquals(responses.size(), 1);
+
+    ServiceDependencyResponse serviceDependencyResponse = 
responses.iterator().next();
+    Assert.assertEquals(serviceDependencyResponse.getServiceName(), 
hdfs.getName());
+    Assert.assertEquals(serviceDependencyResponse.getDependencyServiceName(), 
yarn.getName());
+    Assert.assertEquals(serviceDependencyResponse.getClusterName(), cluster1);
+    Assert.assertEquals(serviceDependencyResponse.getDependencyClusterName(), 
cluster1);
+    Assert.assertEquals(serviceDependencyResponse.getServiceGroupName(), 
serviceGroupCore.getServiceGroupName());
+    
Assert.assertEquals(serviceDependencyResponse.getDependencyServiceGroupName(), 
serviceGroupCore.getServiceGroupName());
+
+
+    Set<ServiceDependencyRequest> deleteRequests = new HashSet<>();
+    ServiceDependencyRequest deleteRequest = new 
ServiceDependencyRequest(cluster1, hdfs.getName(), 
serviceGroupCore.getServiceGroupName(),
+            null, null, null, serviceDependencyResponse.getDependencyId());
+    deleteRequests.add(deleteRequest);
+
+    
serviceDependencyResourceProvider.deleteServiceDependencies(deleteRequests);
+    Service updatedHdfs = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_HDFS);
+
+    Assert.assertTrue(updatedHdfs.getServiceDependencies().isEmpty());
+
+  }
+
+  @Test
+  public void testGetRequestForServiceDependencyCreation() throws Exception {
+    final String cluster1 = getUniqueName();
+
+    Cluster cluster = createDefaultCluster(cluster1);
+
+    ServiceGroup serviceGroupCore = 
cluster.getServiceGroup(SERVICE_GROUP_NAME_CORE);
+    Service hdfs = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_HDFS);
+    Service yarn = cluster.getService(SERVICE_GROUP_NAME_CORE, 
SERVICE_NAME_YARN);
+
+    Set<ServiceDependencyRequest> requests = new HashSet<>();
+    ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, 
hdfs.getName(), serviceGroupCore.getServiceGroupName(),
+            cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), 
null);
+    requests.add(request);
+
+    ServiceDependencyResourceProvider serviceDependencyResourceProvider = new 
ServiceDependencyResourceProvider(controller);
+    Set<ServiceDependencyResponse> responses = 
serviceDependencyResourceProvider.createServiceDependencies(requests);
+
+    Assert.assertEquals(responses.size(), 1);
+
+    ServiceDependencyResponse serviceDependencyResponse = 
responses.iterator().next();
+    Assert.assertEquals(serviceDependencyResponse.getServiceName(), 
hdfs.getName());
+    Assert.assertEquals(serviceDependencyResponse.getDependencyServiceName(), 
yarn.getName());
+    Assert.assertEquals(serviceDependencyResponse.getClusterName(), cluster1);
+    Assert.assertEquals(serviceDependencyResponse.getDependencyClusterName(), 
cluster1);
+    Assert.assertEquals(serviceDependencyResponse.getServiceGroupName(), 
serviceGroupCore.getServiceGroupName());
+    
Assert.assertEquals(serviceDependencyResponse.getDependencyServiceGroupName(), 
serviceGroupCore.getServiceGroupName());
+
+
+    Set<ServiceDependencyRequest> getRequests = new HashSet<>();
+    ServiceDependencyRequest getRequest = new 
ServiceDependencyRequest(cluster1, hdfs.getName(), 
serviceGroupCore.getServiceGroupName(),
+            null, null, null, serviceDependencyResponse.getDependencyId());
+
+    Set<ServiceDependencyResponse> getResponses = 
serviceDependencyResourceProvider.getServiceDependencies(getRequests);
+
+    Assert.assertEquals(responses.size(), 1);
+
+    ServiceDependencyResponse getServiceDependencyResponse = 
responses.iterator().next();
+    Assert.assertEquals(getServiceDependencyResponse.getServiceName(), 
hdfs.getName());
+    
Assert.assertEquals(getServiceDependencyResponse.getDependencyServiceName(), 
yarn.getName());
+    Assert.assertEquals(getServiceDependencyResponse.getClusterName(), 
cluster1);
+    
Assert.assertEquals(getServiceDependencyResponse.getDependencyClusterName(), 
cluster1);
+    Assert.assertEquals(getServiceDependencyResponse.getServiceGroupName(), 
serviceGroupCore.getServiceGroupName());
+    
Assert.assertEquals(getServiceDependencyResponse.getDependencyServiceGroupName(),
 serviceGroupCore.getServiceGroupName());
+  }
+
+
+}

Reply via email to