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

Reply via email to