throws AmbariException {
if (actionRequest.getActionName() == null || actionRequest.getActionName().isEmpty()) {
throw new AmbariException("Action name must be specified");
}
ActionDefinition actionDef = actionManager.getActionDefinition(actionRequest.getActionName());
if (actionDef == null) {
throw new AmbariException("Action " + actionRequest.getActionName() + " does not exist");
}
StackId stackId = cluster.getCurrentStackVersion();
String expectedService = actionDef.getTargetService() == null ? "" : actionDef.getTargetService();
String actualService = actionRequest.getServiceName() == null ? "" : actionRequest.getServiceName();
if (!expectedService.isEmpty() && !actualService.isEmpty() && !expectedService.equals(actualService)) {
throw new AmbariException("Action " + actionRequest.getActionName() + " targets service " + actualService +
" that does not match with expected " + expectedService);
}
String targetService = expectedService;
if (targetService == null || targetService.isEmpty()) {
targetService = actualService;
}
if (targetService != null && !targetService.isEmpty()) {
ServiceInfo serviceInfo;
try {
serviceInfo = ambariMetaInfo.getService(stackId.getStackName(), stackId.getStackVersion(),
targetService);
} catch (StackAccessException se) {
serviceInfo = null;
}
if (serviceInfo == null) {
throw new AmbariException("Action " + actionRequest.getActionName() + " targets service " + targetService +
" that does not exist.");
}
}
String expectedComponent = actionDef.getTargetComponent() == null ? "" : actionDef.getTargetComponent();
String actualComponent = actionRequest.getComponentName() == null ? "" : actionRequest.getComponentName();
if (!expectedComponent.isEmpty() && !actualComponent.isEmpty() && !expectedComponent.equals(actualComponent)) {
throw new AmbariException("Action " + actionRequest.getActionName() + " targets component " + actualComponent +
" that does not match with expected " + expectedComponent);
}
String targetComponent = expectedComponent;
if (targetComponent == null || targetComponent.isEmpty()) {
targetComponent = actualComponent;
}
if (!targetComponent.isEmpty() && targetService.isEmpty()) {
throw new AmbariException("Action " + actionRequest.getActionName() + " targets component " + targetComponent +
" without specifying the target service.");
}
if (targetComponent != null && !targetComponent.isEmpty()) {
ComponentInfo compInfo;
try {
compInfo = ambariMetaInfo.getComponent(stackId.getStackName(), stackId.getStackVersion(),
targetService, targetComponent);
} catch (StackAccessException se) {
compInfo = null;
}
if (compInfo == null) {
throw new AmbariException("Action " + actionRequest.getActionName() + " targets component " + targetComponent +
" that does not exist.");
}
}
if (actionDef.getInputs() != null) {
String[] inputs = actionDef.getInputs().split(",");
for (String input : inputs) {
if (!input.trim().isEmpty() && !actionRequest.getParameters().containsKey(input.trim())) {
throw new AmbariException("Action " + actionRequest.getActionName() + " requires input '" +
input.trim() + "' that is not provided.");
}
}
}
if (actionDef.getTargetType() == TargetHostType.SPECIFIC
|| (targetService.isEmpty() && targetService.isEmpty())) {
if (actionRequest.getHosts().size() == 0) {
throw new AmbariException("Action " + actionRequest.getActionName() + " requires explicit target host(s)" +
" that is not provided.");
}
}
LOG.info("Received action execution request"
+ ", clusterName=" + actionRequest.getClusterName()
+ ", request=" + actionRequest.toString());
ActionExecutionContext actionExecutionContext = new ActionExecutionContext(
actionRequest.getClusterName(), actionRequest.getActionName(), targetService, targetComponent,
actionRequest.getHosts(), actionRequest.getParameters(), actionDef.getTargetType(),
actionDef.getDefaultTimeout());
return actionExecutionContext;
}