This is an automated email from the ASF dual-hosted git repository. adoroszlai pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push: new b268518 AMBARI-24988. Support provision_action in complex Add Service request (#2691) b268518 is described below commit b268518b25ee9f78d00926b27516a773ea58967c Author: Doroszlai, Attila <6454655+adorosz...@users.noreply.github.com> AuthorDate: Wed Dec 5 18:00:47 2018 +0100 AMBARI-24988. Support provision_action in complex Add Service request (#2691) --- .../controller/AmbariManagementControllerImpl.java | 32 ++++++++++---------- .../internal/HostComponentResourceProvider.java | 8 +++-- .../controller/internal/ProvisionAction.java | 26 +++++++++++++--- .../addservice/AddServiceOrchestrator.java | 11 +++++-- .../addservice/ResourceProviderAdapter.java | 35 +++++++++++++++++----- 5 files changed, 79 insertions(+), 33 deletions(-) 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 465d1ee..642960d 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 @@ -283,9 +283,9 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle private static final Type hostAttributesType = new TypeToken<Map<String, String>>() {}.getType(); - private static final String CLUSTER_PHASE_PROPERTY = "phase"; - private static final String CLUSTER_PHASE_INITIAL_INSTALL = "INITIAL_INSTALL"; - private static final String CLUSTER_PHASE_INITIAL_START = "INITIAL_START"; + public static final String CLUSTER_PHASE_PROPERTY = "phase"; + public static final String CLUSTER_PHASE_INITIAL_INSTALL = "INITIAL_INSTALL"; + public static final String CLUSTER_PHASE_INITIAL_START = "INITIAL_START"; private static final String AMBARI_SERVER_HOST = "ambari_server_host"; private static final String AMBARI_SERVER_PORT = "ambari_server_port"; private static final String AMBARI_SERVER_USE_SSL = "ambari_server_use_ssl"; @@ -2962,7 +2962,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle // reset Kerberos-related configs. // Check if it's blueprint install. If it is, then do not configure this service // at this time. - if (!hostComponentAlreadyExists(cluster, scHost) && !("INITIAL_INSTALL".equals(requestProperties.get("phase")))) { + if (!hostComponentAlreadyExists(cluster, scHost) && !(CLUSTER_PHASE_INITIAL_INSTALL.equals(requestProperties.get(CLUSTER_PHASE_PROPERTY)))) { componentsToConfigureForKerberos.add(scHost); } @@ -3279,8 +3279,9 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle RoleGraph rg = roleGraphFactory.createNew(rco); - if (CommandExecutionType.DEPENDENCY_ORDERED == configs.getStageExecutionType() && "INITIAL_START".equals - (requestProperties.get("phase"))) { + if (CommandExecutionType.DEPENDENCY_ORDERED == configs.getStageExecutionType() && + CLUSTER_PHASE_INITIAL_START.equals(requestProperties.get(CLUSTER_PHASE_PROPERTY)) + ) { LOG.info("Set DEPENDENCY_ORDERED CommandExecutionType on stage: {}", stage.getRequestContext()); rg.setCommandExecutionType(CommandExecutionType.DEPENDENCY_ORDERED); } @@ -3347,23 +3348,22 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle ServiceComponentHost sch) throws AmbariException { boolean isClientComponent = false; Service service = cluster.getService(sch.getServiceName()); + String componentName = sch.getServiceComponentName(); if (service != null) { - ServiceComponent serviceComponent = service.getServiceComponent(sch.getServiceComponentName()); + ServiceComponent serviceComponent = service.getServiceComponent(componentName); if (serviceComponent != null) { isClientComponent = serviceComponent.isClientComponent(); } } // Skip INSTALL for service components if START_ONLY is set for component, or if START_ONLY is set on cluster // level and no other provsion action is specified for component - if (requestProperties.get(SKIP_INSTALL_FOR_COMPONENTS) != null && - (requestProperties.get(SKIP_INSTALL_FOR_COMPONENTS).contains(sch.getServiceComponentName()) || - (requestProperties.get(SKIP_INSTALL_FOR_COMPONENTS).equals("ALL") && !requestProperties.get - (DONT_SKIP_INSTALL_FOR_COMPONENTS).contains(sch - .getServiceComponentName()))) && - "INITIAL_INSTALL".equals(requestProperties.get("phase")) && !isClientComponent) { - return true; - } - return false; + String skipInstallForComponents = requestProperties.get(SKIP_INSTALL_FOR_COMPONENTS); + return !isClientComponent && + CLUSTER_PHASE_INITIAL_INSTALL.equals(requestProperties.get(CLUSTER_PHASE_PROPERTY)) && + skipInstallForComponents != null && + (skipInstallForComponents.contains(componentName) || + (skipInstallForComponents.equals("ALL") && !requestProperties.get(DONT_SKIP_INSTALL_FOR_COMPONENTS).contains(componentName)) + ); } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java index 79441d5..d24034d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java @@ -17,6 +17,10 @@ */ package org.apache.ambari.server.controller.internal; +import static org.apache.ambari.server.controller.AmbariManagementControllerImpl.CLUSTER_PHASE_INITIAL_INSTALL; +import static org.apache.ambari.server.controller.AmbariManagementControllerImpl.CLUSTER_PHASE_INITIAL_START; +import static org.apache.ambari.server.controller.AmbariManagementControllerImpl.CLUSTER_PHASE_PROPERTY; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -385,7 +389,7 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro installProperties.put(DESIRED_STATE, "INSTALLED"); Map<String, String> requestInfo = new HashMap<>(); requestInfo.put("context", String.format("Install components on host %s", hostname)); - requestInfo.put("phase", "INITIAL_INSTALL"); + requestInfo.put(CLUSTER_PHASE_PROPERTY, CLUSTER_PHASE_INITIAL_INSTALL); requestInfo.put(AmbariManagementControllerImpl.SKIP_INSTALL_FOR_COMPONENTS, StringUtils.join (skipInstallForComponents, ";")); requestInfo.put(AmbariManagementControllerImpl.DONT_SKIP_INSTALL_FOR_COMPONENTS, StringUtils.join @@ -436,7 +440,7 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro Map<String, String> requestInfo = new HashMap<>(); requestInfo.put("context", String.format("Start components on host %s", hostName)); - requestInfo.put("phase", "INITIAL_START"); + requestInfo.put(CLUSTER_PHASE_PROPERTY, CLUSTER_PHASE_INITIAL_START); requestInfo.put(Setting.SETTING_NAME_SKIP_FAILURE, Boolean.toString(skipFailure)); Predicate clusterPredicate = new EqualsPredicate<>(CLUSTER_NAME, cluster); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionAction.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionAction.java index d80d31d..193f724 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionAction.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionAction.java @@ -18,9 +18,27 @@ package org.apache.ambari.server.controller.internal; - public enum ProvisionAction { - INSTALL_ONLY, // Skip Start - START_ONLY, // Skip Install - INSTALL_AND_START // Default action + INSTALL_ONLY { + @Override + public boolean skipStart() { + return true; + } + }, + START_ONLY { + @Override + public boolean skipInstall() { + return true; + } + }, + INSTALL_AND_START, // Default action + ; + + public boolean skipInstall() { + return false; + } + + public boolean skipStart() { + return false; + } } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/AddServiceOrchestrator.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/AddServiceOrchestrator.java index ed0b71d..556e0fa 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/AddServiceOrchestrator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/AddServiceOrchestrator.java @@ -130,7 +130,9 @@ public class AddServiceOrchestrator { resourceProviders.createComponents(request); resourceProviders.updateServiceDesiredState(request, State.INSTALLED); - resourceProviders.updateServiceDesiredState(request, State.STARTED); + if (!request.getRequest().getProvisionAction().skipStart()) { + resourceProviders.updateServiceDesiredState(request, State.STARTED); + } resourceProviders.createHostComponents(request); configureKerberos(request, cluster, existingServices); @@ -164,10 +166,13 @@ public class AddServiceOrchestrator { } private void createHostTasks(AddServiceInfo request) { - LOG.info("Creating host tasks for {}", request); + LOG.info("Creating host tasks for {}: {}", request, request.getRequest().getProvisionAction()); resourceProviders.updateHostComponentDesiredState(request, State.INSTALLED); - resourceProviders.updateHostComponentDesiredState(request, State.STARTED); + if (!request.getRequest().getProvisionAction().skipStart()) { + resourceProviders.updateHostComponentDesiredState(request, State.STARTED); + } + try { request.getStages().persist(); } catch (AmbariException e) { diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/ResourceProviderAdapter.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/ResourceProviderAdapter.java index db8a57a..99f097b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/ResourceProviderAdapter.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/ResourceProviderAdapter.java @@ -19,6 +19,9 @@ package org.apache.ambari.server.topology.addservice; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toSet; +import static org.apache.ambari.server.controller.AmbariManagementControllerImpl.CLUSTER_PHASE_PROPERTY; +import static org.apache.ambari.server.controller.AmbariManagementControllerImpl.DONT_SKIP_INSTALL_FOR_COMPONENTS; +import static org.apache.ambari.server.controller.AmbariManagementControllerImpl.SKIP_INSTALL_FOR_COMPONENTS; import java.util.List; import java.util.Map; @@ -32,12 +35,14 @@ import javax.inject.Singleton; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.controller.AmbariManagementController; +import org.apache.ambari.server.controller.AmbariManagementControllerImpl; import org.apache.ambari.server.controller.ClusterRequest; import org.apache.ambari.server.controller.ConfigurationRequest; import org.apache.ambari.server.controller.internal.ClusterResourceProvider; import org.apache.ambari.server.controller.internal.ComponentResourceProvider; import org.apache.ambari.server.controller.internal.CredentialResourceProvider; import org.apache.ambari.server.controller.internal.HostComponentResourceProvider; +import org.apache.ambari.server.controller.internal.ProvisionAction; import org.apache.ambari.server.controller.internal.RequestImpl; import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.internal.ServiceResourceProvider; @@ -153,8 +158,12 @@ public class ResourceProviderAdapter { HostComponentResourceProvider.STATE, desiredState.name(), "context", String.format("Put new components to %s state", desiredState) )); + + ImmutableMap.Builder<String, String> requestInfo = createRequestInfo(request.clusterName(), Resource.Type.HostComponent); + addProvisionProperties(requestInfo, desiredState, request.getRequest().getProvisionAction()); + HostComponentResourceProvider rp = (HostComponentResourceProvider) getClusterController().ensureResourceProvider(Resource.Type.HostComponent); - Request internalRequest = createRequest(request.clusterName(), properties, Resource.Type.HostComponent); + Request internalRequest = createRequest(properties, requestInfo.build()); try { rp.doUpdateResources(request.getStages(), internalRequest, predicateForNewServices(request, HostComponentResourceProvider.HOST_ROLES), false, false, false); } catch (UnsupportedPropertyException | SystemException | NoSuchParentResourceException | NoSuchResourceException e) { @@ -165,7 +174,7 @@ public class ResourceProviderAdapter { } private static void createResources(AddServiceInfo request, Set<Map<String, Object>> properties, Resource.Type resourceType, boolean okIfExists) { - Request internalRequest = new RequestImpl(null, properties, null, null); + Request internalRequest = createRequest(properties, null); ResourceProvider rp = getClusterController().ensureResourceProvider(resourceType); try { rp.createResources(internalRequest); @@ -181,7 +190,7 @@ public class ResourceProviderAdapter { } private static void updateResources(AddServiceInfo request, Set<Map<String, Object>> properties, Resource.Type resourceType, Predicate predicate) { - Request internalRequest = createRequest(request.clusterName(), properties, resourceType); + Request internalRequest = createRequest(properties, createRequestInfo(request.clusterName(), resourceType).build()); ResourceProvider rp = getClusterController().ensureResourceProvider(resourceType); try { rp.updateResources(internalRequest, predicate); @@ -202,14 +211,24 @@ public class ResourceProviderAdapter { } } - private static Request createRequest(String clusterName, Set<Map<String, Object>> properties, Resource.Type resourceType) { - Map<String, String> requestInfoProperties = ImmutableMap.of( - RequestOperationLevel.OPERATION_LEVEL_ID, RequestOperationLevel.getExternalLevelName(resourceType.name()), - RequestOperationLevel.OPERATION_CLUSTER_ID, clusterName - ); + private static Request createRequest(Set<Map<String, Object>> properties, Map<String, String> requestInfoProperties) { return new RequestImpl(null, properties, requestInfoProperties, null); } + private static ImmutableMap.Builder<String, String> createRequestInfo(String clusterName, Resource.Type resourceType) { + return new ImmutableMap.Builder<String, String>() + .put(RequestOperationLevel.OPERATION_LEVEL_ID, RequestOperationLevel.getExternalLevelName(resourceType.name())) + .put(RequestOperationLevel.OPERATION_CLUSTER_ID, clusterName); + } + + private static void addProvisionProperties(ImmutableMap.Builder<String, String> requestInfo, State desiredState, ProvisionAction requestAction) { + if (desiredState == State.INSTALLED && requestAction.skipInstall()) { + requestInfo.put(SKIP_INSTALL_FOR_COMPONENTS, "ALL"); + requestInfo.put(DONT_SKIP_INSTALL_FOR_COMPONENTS, ""); + requestInfo.put(CLUSTER_PHASE_PROPERTY, AmbariManagementControllerImpl.CLUSTER_PHASE_INITIAL_INSTALL); + } + } + private static Map<String, Object> createServiceRequestProperties(AddServiceInfo request, String service) { ImmutableMap.Builder<String, Object> properties = ImmutableMap.builder();