This is an automated email from the ASF dual-hosted git repository. mradhakrishnan pushed a commit to branch branch-feature-AMBARI-14714-dep in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714-dep by this push: new 9c025b9 [AMBARI-22707] Implement resolving dependencies for each service 9c025b9 is described below commit 9c025b938015080f724a2c4b6651845fa9037cb1 Author: Madhuvanthi Radhakrishnan <mradhakrish...@hortonworks.com> AuthorDate: Thu May 24 12:50:27 2018 -0700 [AMBARI-22707] Implement resolving dependencies for each service --- .../ambari/server/api/services/ServiceKey.java | 21 +++++++++++-- .../controller/AmbariManagementController.java | 8 +++++ .../controller/AmbariManagementControllerImpl.java | 26 ++++++++++++++-- .../controller/ServiceDependencyRequest.java | 16 +++++++++- .../controller/ServiceDependencyResponse.java | 20 ++++++++++-- .../ServiceDependencyResourceProvider.java | 16 ++++++++-- .../internal/ServiceResourceProvider.java | 36 ++++++++++++++++++++-- .../orm/entities/ServiceDependencyEntity.java | 16 ++++++++++ .../org/apache/ambari/server/state/Cluster.java | 2 +- .../org/apache/ambari/server/state/Service.java | 2 +- .../apache/ambari/server/state/ServiceImpl.java | 6 ++-- .../java/org/apache/ambari/server/state/State.java | 35 +++++++++++++++++++-- .../ambari/server/state/cluster/ClusterImpl.java | 5 +-- .../src/main/resources/Ambari-DDL-Derby-CREATE.sql | 1 + .../src/main/resources/Ambari-DDL-MySQL-CREATE.sql | 1 + .../main/resources/Ambari-DDL-Oracle-CREATE.sql | 1 + .../main/resources/Ambari-DDL-Postgres-CREATE.sql | 2 ++ .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql | 1 + .../main/resources/Ambari-DDL-SQLServer-CREATE.sql | 1 + .../AmbariCustomCommandExecutionHelperTest.java | 3 +- .../controller/AmbariManagementControllerTest.java | 3 +- .../ServiceDependencyResourceProviderTest.java | 17 +++++----- 22 files changed, 209 insertions(+), 30 deletions(-) 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 32b87f5..635585c 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 @@ -17,6 +17,8 @@ */ package org.apache.ambari.server.api.services; +import org.apache.ambari.server.state.ServiceDependencyType; + public class ServiceKey { private Long serviceId; @@ -26,12 +28,13 @@ public class ServiceKey { private String serviceName; private String serviceGroupName; private String clusterName; + private ServiceDependencyType dependencyType; public ServiceKey() { } public ServiceKey(Long clusterId, String clusterName, Long serviceGroupId, String serviceGroupName, Long serviceId, String serviceName, - Long dependencyId) { + Long dependencyId, ServiceDependencyType dependencyType) { this.clusterId = clusterId; this.clusterName = clusterName; this.serviceGroupId = serviceGroupId; @@ -39,6 +42,8 @@ public class ServiceKey { this.serviceId = serviceId; this.serviceName = serviceName; this.dependencyId = dependencyId; + this.dependencyType = dependencyType; + } public Long getClusterId() { @@ -97,15 +102,25 @@ public class ServiceKey { this.dependencyId = dependencyId; } + public ServiceDependencyType getDependencyType() { + return dependencyType; + } + + public void setDependencyType(ServiceDependencyType dependencyType) { + this.dependencyType = dependencyType; + } + @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof ServiceKey)) return false; + if (o == null || getClass() != o.getClass()) return false; ServiceKey that = (ServiceKey) o; if (clusterId != null ? !clusterId.equals(that.clusterId) : that.clusterId != null) return false; if (clusterName != null ? !clusterName.equals(that.clusterName) : that.clusterName != null) return false; + if (dependencyId != null ? !dependencyId.equals(that.dependencyId) : that.dependencyId != null) return false; + if (dependencyType != that.dependencyType) return false; if (serviceGroupId != null ? !serviceGroupId.equals(that.serviceGroupId) : that.serviceGroupId != null) return false; if (serviceGroupName != null ? !serviceGroupName.equals(that.serviceGroupName) : that.serviceGroupName != null) @@ -121,9 +136,11 @@ public class ServiceKey { int result = serviceId != null ? serviceId.hashCode() : 0; result = 31 * result + (serviceGroupId != null ? serviceGroupId.hashCode() : 0); result = 31 * result + (clusterId != null ? clusterId.hashCode() : 0); + result = 31 * result + (dependencyId != null ? dependencyId.hashCode() : 0); result = 31 * result + (serviceName != null ? serviceName.hashCode() : 0); result = 31 * result + (serviceGroupName != null ? serviceGroupName.hashCode() : 0); result = 31 * result + (clusterName != null ? clusterName.hashCode() : 0); + result = 31 * result + (dependencyType != null ? dependencyType.hashCode() : 0); return result; } } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java index 4069e38..b0f368f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java @@ -663,6 +663,14 @@ public interface AmbariManagementController { Collection<ServiceComponentHost> ignoredHosts, boolean runSmokeTest, boolean reconfigureClients) throws AmbariException; + void updateServiceStates( + Cluster cluster, + Map<State, List<Service>> changedServices, + Map<State, List<ServiceComponent>> changedComps, + Map<String, Map<State, List<ServiceComponentHost>>> changedScHosts, + Collection<ServiceComponentHost> ignoredScHosts + ); + /** * Getter for the url of JDK, stored at server resources folder */ diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java index 24b95e6..144f527 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java @@ -3012,11 +3012,16 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle continue; } - RoleCommand roleCommand; + RoleCommand roleCommand = null; State oldSchState = scHost.getState(); - ServiceComponentHostEvent event; + ServiceComponentHostEvent event = null; switch (newState) { + case RESOLVED: + if (oldSchState == State.INIT){ + scHost.setState(serviceComponent.getDesiredState()); + } + break; case INSTALLED: if (oldSchState == State.INIT || oldSchState == State.UNINSTALLED @@ -3209,6 +3214,13 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } catch (InvalidStateTransitionException e) { LOG.error("Error transitioning ServiceComponentHost state to INSTALLED", e); } + } else if(newState == State.RESOLVED){ + scHost.setState(serviceComponent.getDesiredState()); + try { + scHost.handleEvent(new ServiceComponentHostOpSucceededEvent(scHost.getServiceComponentName(), scHost.getHostName(), System.currentTimeMillis())); + }catch (InvalidStateTransitionException e) { + LOG.error("Error transitioning ServiceComponentHost state to RESOLVED", e); + } } else { // !!! can never be null createHostAction(cluster, stage, scHost, configurations, configurationAttributes, configTags, @@ -3455,7 +3467,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle return response; } @Transactional - void updateServiceStates( + @Override + public void updateServiceStates( Cluster cluster, Map<State, List<Service>> changedServices, Map<State, List<ServiceComponent>> changedComps, @@ -3523,6 +3536,13 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle //actually set the new state sch.setDesiredState(newState); + if(newState == State.RESOLVED || newState == State.RESOLVE_FAILED){ + HostComponentStateEntity hostComponentStateEntity = hostComponentStateDAO.findById(sch.getHostComponentId()); + hostComponentStateEntity.setCurrentState(newState); + hostComponentStateDAO.merge(hostComponentStateEntity); + hostComponentStateDAO.refresh(hostComponentStateEntity); + + } } } } 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 7f1e80c..ef6a08d 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 @@ -17,6 +17,8 @@ */ package org.apache.ambari.server.controller; +import org.apache.ambari.server.state.ServiceDependencyType; + public class ServiceDependencyRequest { private String clusterName; @@ -26,9 +28,10 @@ public class ServiceDependencyRequest { private String dependentServiceName; private String dependentServiceGroupName; private Long dependencyId; + private ServiceDependencyType dependencyType; public ServiceDependencyRequest(String clusterName, String serviceName, String serviceGroupName, String dependentClusterName, - String dependentServiceGroupName, String dependentServiceName, Long dependencyId) { + String dependentServiceGroupName, String dependentServiceName, Long dependencyId, ServiceDependencyType dependencyType) { this.clusterName = clusterName; this.serviceName = serviceName; this.serviceGroupName = serviceGroupName; @@ -36,6 +39,8 @@ public class ServiceDependencyRequest { this.dependentServiceGroupName = dependentServiceGroupName; this.dependentServiceName = dependentServiceName; this.dependencyId = dependencyId; + this.dependencyType = dependencyType; + } public String getClusterName() { @@ -94,6 +99,14 @@ public class ServiceDependencyRequest { this.serviceName = serviceName; } + public ServiceDependencyType getDependencyType() { + return dependencyType; + } + + public void setDependencyType(ServiceDependencyType dependencyType) { + this.dependencyType = dependencyType; + } + @Override public String toString() { return "ServiceDependencyRequest{" + @@ -104,6 +117,7 @@ public class ServiceDependencyRequest { ", dependentServiceName='" + dependentServiceName + '\'' + ", dependentServiceGroupName='" + dependentServiceGroupName + '\'' + ", dependencyId=" + dependencyId + + ", dependencyType=" + dependencyType + '}'; } } 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 89a5441..1b435e1 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 @@ -18,6 +18,8 @@ package org.apache.ambari.server.controller; +import org.apache.ambari.server.state.ServiceDependencyType; + public class ServiceDependencyResponse { private Long clusterId; @@ -33,11 +35,12 @@ public class ServiceDependencyResponse { private String dependencyServiceName; private String dependencyClusterName; private String dependencyServiceGroupName; + private ServiceDependencyType dependencyType; 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 dependencyId) { + Long serviceId, String serviceName, Long dependencyId, ServiceDependencyType dependencyType) { this.clusterId = clusterId; this.clusterName = clusterName; this.dependencyClusterId = dependencyClusterId; @@ -51,6 +54,7 @@ public class ServiceDependencyResponse { this.serviceId = serviceId; this.serviceName = serviceName; this.dependencyId = dependencyId; + this.dependencyType = dependencyType; } public Long getClusterId() { @@ -157,10 +161,18 @@ public class ServiceDependencyResponse { this.dependencyId = dependencyId; } + public ServiceDependencyType getDependencyType() { + return dependencyType; + } + + public void setDependencyType(ServiceDependencyType dependencyType) { + this.dependencyType = dependencyType; + } + @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof ServiceDependencyResponse)) return false; + if (o == null || getClass() != o.getClass()) return false; ServiceDependencyResponse that = (ServiceDependencyResponse) o; @@ -168,6 +180,7 @@ public class ServiceDependencyResponse { if (clusterName != null ? !clusterName.equals(that.clusterName) : that.clusterName != null) return false; if (dependencyClusterId != null ? !dependencyClusterId.equals(that.dependencyClusterId) : that.dependencyClusterId != null) return false; + if (dependencyId != null ? !dependencyId.equals(that.dependencyId) : that.dependencyId != null) return false; if (dependencyClusterName != null ? !dependencyClusterName.equals(that.dependencyClusterName) : that.dependencyClusterName != null) return false; if (dependencyServiceGroupId != null ? !dependencyServiceGroupId.equals(that.dependencyServiceGroupId) : that.dependencyServiceGroupId != null) @@ -178,6 +191,7 @@ public class ServiceDependencyResponse { return false; if (dependencyServiceName != null ? !dependencyServiceName.equals(that.dependencyServiceName) : that.dependencyServiceName != null) return false; + if (dependencyType != that.dependencyType) return false; if (serviceGroupId != null ? !serviceGroupId.equals(that.serviceGroupId) : that.serviceGroupId != null) return false; if (serviceGroupName != null ? !serviceGroupName.equals(that.serviceGroupName) : that.serviceGroupName != null) @@ -196,12 +210,14 @@ public class ServiceDependencyResponse { result = 31 * result + (dependencyClusterId != null ? dependencyClusterId.hashCode() : 0); result = 31 * result + (dependencyServiceId != null ? dependencyServiceId.hashCode() : 0); result = 31 * result + (dependencyServiceGroupId != null ? dependencyServiceGroupId.hashCode() : 0); + result = 31 * result + (dependencyId != null ? dependencyId.hashCode() : 0); result = 31 * result + (clusterName != null ? clusterName.hashCode() : 0); result = 31 * result + (serviceName != null ? serviceName.hashCode() : 0); result = 31 * result + (serviceGroupName != null ? serviceGroupName.hashCode() : 0); result = 31 * result + (dependencyServiceName != null ? dependencyServiceName.hashCode() : 0); result = 31 * result + (dependencyClusterName != null ? dependencyClusterName.hashCode() : 0); result = 31 * result + (dependencyServiceGroupName != null ? dependencyServiceGroupName.hashCode() : 0); + result = 31 * result + (dependencyType != null ? dependencyType.hashCode() : 0); return result; } } 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 3cb7d18..049516a 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 @@ -53,6 +53,7 @@ import org.apache.ambari.server.security.authorization.RoleAuthorization; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Service; +import org.apache.ambari.server.state.ServiceDependencyType; import org.apache.ambari.server.state.ServiceGroup; import org.apache.ambari.server.utils.StageUtils; import org.apache.commons.lang.StringUtils; @@ -83,6 +84,7 @@ public class ServiceDependencyResourceProvider extends AbstractControllerResourc 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"; + public static final String SERVICE_DEPENDENCY_DEPENDENCY_TYPE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "dependency_type"; protected ObjectMapper mapper = new ObjectMapper();; @@ -120,6 +122,7 @@ public class ServiceDependencyResourceProvider extends AbstractControllerResourc 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); + PROPERTY_IDS.add(SERVICE_DEPENDENCY_DEPENDENCY_TYPE_PROPERTY_ID); // keys KEY_PROPERTY_IDS.put(Resource.Type.Cluster, SERVICE_DEPENDENCY_CLUSTER_NAME_PROPERTY_ID); @@ -196,6 +199,9 @@ public class ServiceDependencyResourceProvider extends AbstractControllerResourc response.getDependencyServiceGroupName()); resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID, response.getDependencyId()); + resource.setProperty(SERVICE_DEPENDENCY_DEPENDENCY_TYPE_PROPERTY_ID, + response.getDependencyType()); + associatedResources.add(resource); } @@ -253,6 +259,8 @@ public class ServiceDependencyResourceProvider extends AbstractControllerResourc response.getDependencyServiceGroupName(), requestedIds); setResourceProperty(resource, SERVICE_DEPENDENCY_DEPENDENCY_ID_PROPERTY_ID, response.getDependencyId(), requestedIds); + setResourceProperty(resource, SERVICE_DEPENDENCY_DEPENDENCY_TYPE_PROPERTY_ID, + response.getDependencyType(), requestedIds); resources.add(resource); } @@ -328,10 +336,12 @@ public class ServiceDependencyResourceProvider extends AbstractControllerResourc 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 dependencyTypeStr = (String)properties.get(SERVICE_DEPENDENCY_DEPENDENCY_TYPE_PROPERTY_ID); + ServiceDependencyType dependencyType = StringUtils.isEmpty(dependencyTypeStr) ? null : ServiceDependencyType.valueOf(dependencyTypeStr); 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); + dependentClusterName, dependentServiceGroupName, dependentServiceName, dependencyId, dependencyType); return svcRequest; } @@ -368,7 +378,7 @@ public class ServiceDependencyResourceProvider extends AbstractControllerResourc Service dependentService = cluster.getService(dependentServiceGroup.getServiceGroupName(), request.getDependentServiceName()); - Service updatedService = cluster.addDependencyToService(request.getServiceGroupName(), request.getServiceName(), dependentService.getServiceId()); + Service updatedService = cluster.addDependencyToService(request.getServiceGroupName(), request.getServiceName(), dependentService.getServiceId(),request.getDependencyType()); createdServiceDependencies.addAll(updatedService.getServiceDependencyResponses()); } return createdServiceDependencies; @@ -498,11 +508,13 @@ public class ServiceDependencyResourceProvider extends AbstractControllerResourc final String dependentClusterName = request.getDependentClusterName(); final String dependentServiceGroupName = request.getDependentServiceGroupName(); final String dependentServiceName = request.getDependentServiceName(); + final ServiceDependencyType dependencyType = request.getDependencyType(); 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(dependentServiceName, "Dependency service name should be provided when creating a service dependency"); + Validate.notNull(dependencyType, "Dependency type should be provided when creating a service dependency"); //throws cluster not found exception Cluster cluster = clusters.getCluster(clusterName); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java index 72e43f7..213754e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java @@ -66,6 +66,7 @@ import org.apache.ambari.server.serveraction.kerberos.KerberosMissingAdminCreden import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.MaintenanceState; +import org.apache.ambari.server.state.RequiredService; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentHost; @@ -598,6 +599,7 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider boolean reconfigureClients, boolean startDependencies) throws AmbariException, AuthorizationException { AmbariManagementController controller = getManagementController(); + AmbariMetaInfo ambariMetaInfo = controller.getAmbariMetaInfo(); if (requests.isEmpty()) { LOG.warn("Received an empty requests set"); @@ -743,6 +745,8 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider seenNewStates.add(newState); + Map<State, List<Service>> resolvedService = new EnumMap<>(State.class); + State desiredState = null; if (newState != oldState) { // The if user is trying to start or stop the service, ensure authorization if (((newState == State.INSTALLED) || (newState == State.STARTED)) && @@ -764,15 +768,43 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider changedServices.put(newState, new ArrayList<>()); } changedServices.get(newState).add(s); + + if(newState == State.RESOLVED) { + // create service dependencies + ServiceInfo currentServiceInfo = ambariMetaInfo.getService(s); + for (RequiredService requiredService : currentServiceInfo.getRequiredServices()) { + if (!cluster.getServices().containsKey(requiredService.getName())) { + desiredState = State.RESOLVE_FAILED; + break; + } + Service reqService = cluster.getService(requiredService.getName()); + cluster.addDependencyToService(s.getServiceGroupName(), s.getName(), reqService.getServiceId(), requiredService.getDependencyType()); + } + if(desiredState != State.RESOLVE_FAILED) + desiredState = State.RESOLVED; } + } // TODO should we check whether all servicecomponents and // servicecomponenthosts are in the required desired state? updateServiceComponents(requestStages, changedComps, changedScHosts, - ignoredScHosts, reqOpLvl, s, newState); + ignoredScHosts, reqOpLvl, s, (desiredState == null? newState : desiredState)); + if(newState == State.RESOLVED){ + resolvedService.put(desiredState, new ArrayList<>()); + resolvedService.get(desiredState).add(s); + changedServices.put(desiredState, new ArrayList<>()); + changedServices.get(desiredState).add(s); + controller.updateServiceStates(cluster, resolvedService, changedComps, changedScHosts, ignoredScHosts); + } } + + if(changedServices.containsKey(State.RESOLVED)){ + return requestStages; + } + + if (startDependencies && changedServices.containsKey(State.STARTED)) { HashSet<Service> depServices = new HashSet<>(); for (Service service : changedServices.get(State.STARTED)) { @@ -863,7 +895,7 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider } continue; } - // + if (newState == oldSchState) { ignoredScHosts.add(sch); if (LOG.isDebugEnabled()) { diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDependencyEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDependencyEntity.java index b8e2650..91382f1 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDependencyEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDependencyEntity.java @@ -19,6 +19,8 @@ package org.apache.ambari.server.orm.entities; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -27,6 +29,8 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.TableGenerator; +import org.apache.ambari.server.state.ServiceDependencyType; + @Entity @Table(name = "servicedependencies") @TableGenerator(name = "service_dependency_id_generator", @@ -50,6 +54,10 @@ public class ServiceDependencyEntity { @Column(name = "service_group_id", nullable = false, insertable = true, updatable = false) private long serviceGroupId; + @Column(name = "dependency_type", nullable = false, length = 255) + @Enumerated(value = EnumType.STRING) + private ServiceDependencyType dependencyType; + @Column(name = "dependent_service_id", nullable = false, insertable = false, updatable = false) private long dependentServiceId; @@ -135,6 +143,14 @@ public class ServiceDependencyEntity { this.serviceId = serviceId; } + public ServiceDependencyType getDependencyType() { + return dependencyType; + } + + public void setDependencyType(ServiceDependencyType dependencyType) { + this.dependencyType = dependencyType; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java index 03e3151..afd84c5 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java @@ -76,7 +76,7 @@ public interface Cluster { throws AmbariException; Service addDependencyToService(String serviceGroupName, String serviceName, - Long dependencyServiceId) throws AmbariException; + Long dependencyServiceId, ServiceDependencyType dependencyType) throws AmbariException; Service removeDependencyFromService(String serviceGroupName, String serviceName, Long dependencyServiceId); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java index b640d77..b0c360d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java @@ -93,7 +93,7 @@ public interface Service { ClusterServiceEntity removeDependencyService(Long dependencyServiceId); - ClusterServiceEntity addDependencyService(Long dependencyServiceId) throws AmbariException; + ClusterServiceEntity addDependencyService(Long dependencyServiceId, ServiceDependencyType dependencyType) throws AmbariException; void delete(DeleteHostComponentStatusMetaData deleteMetaData); 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 63603ea..2d36fff 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 @@ -377,7 +377,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(), sk.getDependencyId())); + getServiceId(), getName(), sk.getDependencyId(), sk.getDependencyType())); } } return responses; @@ -417,6 +417,7 @@ public class ServiceImpl implements Service { serviceKey.setServiceName(dependencyService.getServiceName()); serviceKey.setServiceId(dependencyService.getServiceId()); serviceKey.setDependencyId(sde.getServiceDependencyId()); + serviceKey.setDependencyType(sde.getDependencyType()); serviceDependenciesList.add(serviceKey); } } @@ -575,7 +576,7 @@ public class ServiceImpl implements Service { } @Override - public ClusterServiceEntity addDependencyService(Long dependencyServiceId) throws AmbariException { + public ClusterServiceEntity addDependencyService(Long dependencyServiceId, ServiceDependencyType dependencyType) throws AmbariException { Service dependentService = null; for (Cluster cl : clusters.getClusters().values()) { if (cl.getServicesById().containsKey(dependencyServiceId)) { @@ -588,6 +589,7 @@ public class ServiceImpl implements Service { ClusterServiceEntity dependentServiceEntity = clusterServiceDAO.findByPK(dependentService.getServiceId()); ServiceDependencyEntity newServiceDependency = new ServiceDependencyEntity(); + newServiceDependency.setDependencyType(dependencyType); newServiceDependency.setService(currentServiceEntity); newServiceDependency.setServiceGroupId(currentServiceEntity.getServiceGroupId()); newServiceDependency.setServiceClusterId(currentServiceEntity.getClusterId()); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/State.java b/ambari-server/src/main/java/org/apache/ambari/server/state/State.java index 351c587..a1c3947 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/State.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/State.java @@ -38,6 +38,14 @@ public enum State { */ INSTALLED, /** + * State when dependencies have been resolved successfully. + */ + RESOLVED, + /** + * State when dependency resolution fails. + */ + RESOLVE_FAILED, + /** * In the process of starting. */ STARTING, @@ -87,6 +95,7 @@ public enum State { case STARTED: case UNINSTALLED: case DISABLED: + case RESOLVED: return true; default: return false; @@ -120,6 +129,8 @@ public enum State { case INSTALLING: case INSTALLED: case INSTALL_FAILED: + case RESOLVED: + case RESOLVE_FAILED: case UNINSTALLED: case UNKNOWN: case DISABLED: @@ -149,7 +160,8 @@ public enum State { || startState == State.UPGRADING || startState == State.STOPPING || startState == State.UNKNOWN - || startState == State.DISABLED) { + || startState == State.DISABLED + || startState == State.RESOLVED) { return true; } break; @@ -181,6 +193,18 @@ public enum State { return true; } break; + case RESOLVED: + if (startState == State.INIT + || startState == State.RESOLVE_FAILED) { + return true; + } + break; + case INSTALL_FAILED: + if (startState == State.RESOLVED + || startState == State.INSTALLING) { + return true; + } + break; } return false; } @@ -200,7 +224,8 @@ public enum State { || startState == State.UNINSTALLED || startState == State.INSTALLED || startState == State.STARTED - || startState == State.STOPPING) { + || startState == State.STOPPING + || startState == State.RESOLVED) { return true; } break; @@ -210,6 +235,12 @@ public enum State { return true; } break; + case RESOLVED: + if (startState == State.INIT + || startState == State.RESOLVE_FAILED) { + return true; + } + break; } return false; } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java index c1f5ef9..10f144f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java @@ -135,6 +135,7 @@ import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentHost; import org.apache.ambari.server.state.ServiceComponentHostEvent; import org.apache.ambari.server.state.ServiceComponentHostEventType; +import org.apache.ambari.server.state.ServiceDependencyType; import org.apache.ambari.server.state.ServiceFactory; import org.apache.ambari.server.state.ServiceGroup; import org.apache.ambari.server.state.ServiceGroupFactory; @@ -971,7 +972,7 @@ public class ClusterImpl implements Cluster { } @Override - public Service addDependencyToService(String serviceGroupName, String serviceName, Long dependencyServiceId) throws AmbariException { + public Service addDependencyToService(String serviceGroupName, String serviceName, Long dependencyServiceId, ServiceDependencyType dependencyType ) throws AmbariException { Service currentService = null; for (Service service : getServicesById().values()) { if (service.getName().equals(serviceName) && service.getServiceGroupName().equals(serviceGroupName)) { @@ -984,7 +985,7 @@ public class ClusterImpl implements Cluster { clusterGlobalLock.writeLock().lock(); try { - updatedServiceEntity = currentService.addDependencyService(dependencyServiceId); + updatedServiceEntity = currentService.addDependencyService(dependencyServiceId, dependencyType); updatedService = serviceFactory.createExisting(this, getServiceGroup(currentService.getServiceGroupName()), updatedServiceEntity); diff --git a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql index 5c0e8a1..9f0ba5b 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql @@ -188,6 +188,7 @@ CREATE TABLE servicedependencies ( service_id BIGINT NOT NULL, service_group_id BIGINT NOT NULL, service_cluster_id BIGINT NOT NULL, + dependency_type VARCHAR(255) NOT NULL, dependent_service_id BIGINT NOT NULL, dependent_service_group_id BIGINT NOT NULL, dependent_service_cluster_id BIGINT NOT NULL, diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql index d9f1472..b92b5e9 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql @@ -207,6 +207,7 @@ CREATE TABLE servicedependencies ( service_id BIGINT NOT NULL, service_group_id BIGINT NOT NULL, service_cluster_id BIGINT NOT NULL, + dependency_type VARCHAR(255) NOT NULL, dependent_service_id BIGINT NOT NULL, dependent_service_group_id BIGINT NOT NULL, dependent_service_cluster_id BIGINT NOT NULL, diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql index a2b9dee..796124e 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql @@ -187,6 +187,7 @@ CREATE TABLE servicedependencies ( service_id NUMBER(19) NOT NULL, service_group_id NUMBER(19) NOT NULL, service_cluster_id NUMBER(19) NOT NULL, + dependency_type VARCHAR(255) NOT NULL, dependent_service_id NUMBER(19) NOT NULL, dependent_service_group_id NUMBER(19) NOT NULL, dependent_service_cluster_id NUMBER(19) NOT NULL, diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql index 505e8db..6eae513 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql @@ -1,4 +1,5 @@ -- +-- -- 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 @@ -190,6 +191,7 @@ CREATE TABLE servicedependencies ( service_id BIGINT NOT NULL, service_group_id BIGINT NOT NULL, service_cluster_id BIGINT NOT NULL, + dependency_type VARCHAR(255) NOT NULL, dependent_service_id BIGINT NOT NULL, dependent_service_group_id BIGINT NOT NULL, dependent_service_cluster_id BIGINT NOT NULL, diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql index 0033a69..fb92084 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql @@ -186,6 +186,7 @@ CREATE TABLE servicedependencies ( service_id NUMBER(19) NOT NULL, service_group_id NUMBER(19) NOT NULL, service_cluster_id NUMBER(19) NOT NULL, + dependency_type VARCHAR(255) NOT NULL, dependent_service_id NUMBER(19) NOT NULL, dependent_service_group_id NUMBER(19) NOT NULL, dependent_service_cluster_id NUMBER(19) NOT NULL, diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql index c6cca3c..573dd48 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql @@ -201,6 +201,7 @@ CREATE TABLE servicedependencies ( service_id BIGINT NOT NULL, service_group_id BIGINT NOT NULL, service_cluster_id BIGINT NOT NULL, + dependency_type VARCHAR(255) NOT NULL, dependent_service_id BIGINT NOT NULL, dependent_service_group_id BIGINT NOT NULL, dependent_service_cluster_id BIGINT NOT NULL, diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java index d1e0d21..97a2e4a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java @@ -83,6 +83,7 @@ import org.apache.ambari.server.state.PropertyInfo; import org.apache.ambari.server.state.SecurityType; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; +import org.apache.ambari.server.state.ServiceDependencyType; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.State; @@ -628,7 +629,7 @@ public class AmbariCustomCommandExecutionHelperTest { } //add dependency from HDFS to HADOOP_CLIENTS - c1.addDependencyToService("CORE", "HDFS", clientService.getServiceId()); + c1.addDependencyToService("CORE", "HDFS", clientService.getServiceId(), ServiceDependencyType.INSTALL); ambariCustomCommandExecutionHelper.addExecutionCommandsToStage(actionExecutionContext, stage, new HashMap<>(), null); } diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java index afaf395..c28018e 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java @@ -136,6 +136,7 @@ import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentFactory; import org.apache.ambari.server.state.ServiceComponentHost; import org.apache.ambari.server.state.ServiceComponentHostFactory; +import org.apache.ambari.server.state.ServiceDependencyType; import org.apache.ambari.server.state.ServiceFactory; import org.apache.ambari.server.state.ServiceGroup; import org.apache.ambari.server.state.ServiceInfo; @@ -5973,7 +5974,7 @@ public class AmbariManagementControllerTest { Service mapred = cluster.addService(serviceGroup, "YARN", "YARN"); Service hadoop_clients = cluster.addService(serviceGroup, "HADOOP_CLIENTS", "HADOOP_CLIENTS"); - hdfs = cluster.addDependencyToService("CORE", "HDFS", hadoop_clients.getServiceId()); + hdfs = cluster.addDependencyToService("CORE", "HDFS", hadoop_clients.getServiceId(), ServiceDependencyType.INSTALL); hdfs.addServiceComponent(Role.HDFS_CLIENT.name(), Role.HDFS_CLIENT.name()); hdfs.addServiceComponent(Role.NAMENODE.name(), Role.NAMENODE.name()); 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 index 46b572a..ee1b500 100644 --- 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 @@ -54,6 +54,7 @@ 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.ServiceDependencyType; import org.apache.ambari.server.state.ServiceGroup; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.State; @@ -306,7 +307,7 @@ public class ServiceDependencyResourceProviderTest { Set<ServiceDependencyRequest> requests = new HashSet<>(); ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, hdfs.getName(), serviceGroupCore.getServiceGroupName(), - cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), null); + cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), null, ServiceDependencyType.INSTALL); requests.add(request); ServiceDependencyResourceProvider serviceDependencyResourceProvider = new ServiceDependencyResourceProvider(controller); @@ -337,7 +338,7 @@ public class ServiceDependencyResourceProviderTest { Set<ServiceDependencyRequest> requests = new HashSet<>(); ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, hdfs.getName(), serviceGroupCore.getServiceGroupName(), - cluster1, serviceGroupTest.getServiceGroupName(), zookeeper.getName(), null); + cluster1, serviceGroupTest.getServiceGroupName(), zookeeper.getName(), null, ServiceDependencyType.INSTALL); requests.add(request); ServiceDependencyResourceProvider serviceDependencyResourceProvider = new ServiceDependencyResourceProvider(controller); @@ -366,7 +367,7 @@ public class ServiceDependencyResourceProviderTest { Set<ServiceDependencyRequest> requests = new HashSet<>(); ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, hdfs.getName(), serviceGroupCore.getServiceGroupName(), - cluster1, "invalid_service_group_name", zookeeper.getName(), null); + cluster1, "invalid_service_group_name", zookeeper.getName(), null, ServiceDependencyType.INSTALL); requests.add(request); ServiceDependencyResourceProvider serviceDependencyResourceProvider = new ServiceDependencyResourceProvider(controller); @@ -396,7 +397,7 @@ public class ServiceDependencyResourceProviderTest { Set<ServiceDependencyRequest> requests = new HashSet<>(); ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, hdfs.getName(), serviceGroupCore.getServiceGroupName(), - "invalid_cluster_name", serviceGroupCore.getServiceGroupName(), zookeeper.getName(), null); + "invalid_cluster_name", serviceGroupCore.getServiceGroupName(), zookeeper.getName(), null, ServiceDependencyType.INSTALL); requests.add(request); ServiceDependencyResourceProvider serviceDependencyResourceProvider = new ServiceDependencyResourceProvider(controller); @@ -427,7 +428,7 @@ public class ServiceDependencyResourceProviderTest { Set<ServiceDependencyRequest> requests = new HashSet<>(); ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, hdfs.getName(), serviceGroupCore.getServiceGroupName(), - cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), null); + cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), null, ServiceDependencyType.INSTALL); requests.add(request); ServiceDependencyResourceProvider serviceDependencyResourceProvider = new ServiceDependencyResourceProvider(controller); @@ -446,7 +447,7 @@ public class ServiceDependencyResourceProviderTest { Set<ServiceDependencyRequest> deleteRequests = new HashSet<>(); ServiceDependencyRequest deleteRequest = new ServiceDependencyRequest(cluster1, hdfs.getName(), serviceGroupCore.getServiceGroupName(), - null, null, null, serviceDependencyResponse.getDependencyId()); + null, null, null, serviceDependencyResponse.getDependencyId(), ServiceDependencyType.INSTALL); deleteRequests.add(deleteRequest); serviceDependencyResourceProvider.deleteServiceDependencies(deleteRequests); @@ -468,7 +469,7 @@ public class ServiceDependencyResourceProviderTest { Set<ServiceDependencyRequest> requests = new HashSet<>(); ServiceDependencyRequest request = new ServiceDependencyRequest(cluster1, hdfs.getName(), serviceGroupCore.getServiceGroupName(), - cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), null); + cluster1, serviceGroupCore.getServiceGroupName(), yarn.getName(), null, ServiceDependencyType.INSTALL); requests.add(request); ServiceDependencyResourceProvider serviceDependencyResourceProvider = new ServiceDependencyResourceProvider(controller); @@ -487,7 +488,7 @@ public class ServiceDependencyResourceProviderTest { Set<ServiceDependencyRequest> getRequests = new HashSet<>(); ServiceDependencyRequest getRequest = new ServiceDependencyRequest(cluster1, hdfs.getName(), serviceGroupCore.getServiceGroupName(), - null, null, null, serviceDependencyResponse.getDependencyId()); + null, null, null, serviceDependencyResponse.getDependencyId(), ServiceDependencyType.INSTALL); Set<ServiceDependencyResponse> getResponses = serviceDependencyResourceProvider.getServiceDependencies(getRequests); -- To stop receiving notification emails like this one, please contact mradhakrish...@apache.org.