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 <[email protected]>
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();