if (actionRequest.getActionName() == null || actionRequest.getActionName().isEmpty()) {
throw new AmbariException("Action name must be specified");
}
ActionDefinition actionDef = ambariMetaInfo.getActionDefinition(actionRequest.getActionName());
if (actionDef == null) {
throw new AmbariException("Action " + actionRequest.getActionName() + " does not exist");
}
if (actionDef.getInputs() != null) {
String[] inputs = actionDef.getInputs().split(",");
for (String input : inputs) {
String inputName = input.trim();
if (!inputName.isEmpty()) {
boolean mandatory = true;
if (inputName.startsWith("[") && inputName.endsWith("]")) {
mandatory = false;
}
if (mandatory && !actionRequest.getParameters().containsKey(inputName)) {
throw new AmbariException("Action " + actionRequest.getActionName() + " requires input '" +
input.trim() + "' that is not provided.");
}
}
}
}
List<RequestResourceFilter> resourceFilters = actionRequest.getResourceFilters();
RequestResourceFilter resourceFilter = null;
if (resourceFilters != null && !resourceFilters.isEmpty()) {
if (resourceFilters.size() > 1) {
throw new AmbariException("Custom action definition only allows one " +
"resource filter to be specified.");
} else {
resourceFilter = resourceFilters.get(0);
}
}
String targetService = "";
String targetComponent = "";
if (null != actionRequest.getClusterName()) {
Cluster cluster = clusters.getCluster(actionRequest.getClusterName());
if (cluster == null) {
throw new AmbariException("Unable to find cluster. clusterName = " +
actionRequest.getClusterName());
}
StackId stackId = cluster.getCurrentStackVersion();
String expectedService = actionDef.getTargetService() == null ? "" : actionDef.getTargetService();
String actualService = resourceFilter == null || resourceFilter.getServiceName() == null ? "" : resourceFilter.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);
}
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 = resourceFilter == null || resourceFilter.getComponentName() == null ? "" : resourceFilter.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);
}
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 (TargetHostType.SPECIFIC.equals(actionDef.getTargetType())
|| (targetService.isEmpty() && targetComponent.isEmpty())) {
if (resourceFilter == null || resourceFilter.getHostNames().size() == 0) {
throw new AmbariException("Action " + actionRequest.getActionName() + " requires explicit target host(s)" +
" that is not provided.");
}