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()); + } + + +}