/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.falcon.shell.commands;
import org.apache.falcon.ValidationUtil;
import org.apache.falcon.ResponseHelper;
import org.apache.falcon.entity.v0.EntityType;
import org.apache.falcon.resource.EntityList;
import org.apache.falcon.resource.FeedLookupResult;
import org.apache.falcon.resource.SchedulableEntityInstanceResult;
import org.springframework.shell.core.annotation.CliCommand;
import org.springframework.shell.core.annotation.CliOption;
import org.springframework.stereotype.Component;
import java.io.File;
import static org.apache.falcon.client.FalconCLIConstants.DEFINITION_OPT;
import static org.apache.falcon.client.FalconCLIConstants.DELETE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.LOOKUP_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SLA_MISS_ALERT_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_ONLY_OPT;
import static org.apache.falcon.client.FalconCLIConstants.UPDATE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT;
import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT;
import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.DEFINITION_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.DELETE_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT;
import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.END_OPT;
import static org.apache.falcon.client.FalconCLIConstants.END_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT;
import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.FIELDS_OPT;
import static org.apache.falcon.client.FalconCLIConstants.FIELDS_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT;
import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT;
import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT;
import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.LOOKUP_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.NAMESEQ_OPT;
import static org.apache.falcon.client.FalconCLIConstants.NAMESEQ_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.NUM_INSTANCES_OPT;
import static org.apache.falcon.client.FalconCLIConstants.NUM_INSTANCES_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT;
import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT;
import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT;
import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.PATH_OPT;
import static org.apache.falcon.client.FalconCLIConstants.PATH_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.PROPS_OPT;
import static org.apache.falcon.client.FalconCLIConstants.PROPS_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT;
import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SCHEDULE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SCHEDULE_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SHOWSCHEDULER_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SHOWSCHEDULER_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SKIPDRYRUN_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SKIPDRYRUN_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SLA_MISS_ALERT_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.START_OPT;
import static org.apache.falcon.client.FalconCLIConstants.START_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT;
import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_AND_SCHEDULE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT;
import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.TAGKEYS_OPT;
import static org.apache.falcon.client.FalconCLIConstants.TAGKEYS_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.TAGS_OPT;
import static org.apache.falcon.client.FalconCLIConstants.TAGS_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.UPDATE_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.VALIDATE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.VALIDATE_OPT_DESCRIPTION;
/**
* Entity Commands.
*/
@Component
public class FalconEntityCommands extends BaseFalconCommands {
public static final String ENTITY_PREFIX = "entity";
public static final String ENTITY_COMMAND_PREFIX = ENTITY_PREFIX + " ";
@CliCommand(value = ENTITY_COMMAND_PREFIX + SLA_MISS_ALERT_OPT, help = SLA_MISS_ALERT_OPT_DESCRIPTION)
public String slaAlert(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = false, help = ENTITY_NAME_OPT_DESCRIPTION)
final String entityName,
@CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
unspecifiedDefaultValue = "*") final String colo,
@CliOption(key = {START_OPT}, mandatory = true, help = START_OPT_DESCRIPTION) final String start,
@CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end
) {
SchedulableEntityInstanceResult response = getFalconClient()
.getFeedSlaMissPendingAlerts(entityType.name().toLowerCase(), entityName, start, end, getColo(colo));
return ResponseHelper.getString(response);
}
//The command here is submitOnly in place of submit as it conflicts with submitAndSchedule and tab feature will not
//work of shell
@CliCommand(value = ENTITY_COMMAND_PREFIX + SUBMIT_ONLY_OPT, help = SUBMIT_OPT_DESCRIPTION)
public String submit(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath
) {
return getFalconClient().submit(entityType.name().toLowerCase(), filePath.getPath(),
getDoAs()).getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + LOOKUP_OPT, help = LOOKUP_OPT_DESCRIPTION)
public String lookup(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {PATH_OPT}, mandatory = true, help = PATH_OPT_DESCRIPTION) final String feedInstancePath
) {
FeedLookupResult resp = getFalconClient().reverseLookUp(entityType.name().toLowerCase(),
feedInstancePath, getDoAs());
return ResponseHelper.getString(resp);
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + UPDATE_OPT, help = UPDATE_OPT_DESCRIPTION)
public String update(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
final String entityName,
@CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION)
final File filePath,
@CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun
) {
return getFalconClient()
.update(entityType.name().toLowerCase(), entityName, filePath.getPath(), skipDryRun, getDoAs())
.getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + SUBMIT_AND_SCHEDULE_OPT, help = SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION)
public String submitAndSchedule(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath,
@CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun,
@CliOption(key = {PROPS_OPT}, mandatory = false, help = PROPS_OPT_DESCRIPTION) final String properties
) {
return getFalconClient()
.submitAndSchedule(entityType.name().toLowerCase(), filePath.getPath(), skipDryRun, getDoAs(),
properties)
.getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + VALIDATE_OPT, help = VALIDATE_OPT_DESCRIPTION)
public String validate(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath,
@CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun
) {
return getFalconClient()
.validate(entityType.name().toLowerCase(), filePath.getPath(), skipDryRun, getDoAs())
.getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + SCHEDULE_OPT, help = SCHEDULE_OPT_DESCRIPTION)
public String schedule(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
@CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
unspecifiedDefaultValue = "*") final String colo,
@CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun,
@CliOption(key = {PROPS_OPT}, mandatory = false, help = PROPS_OPT_DESCRIPTION) final String properties
) {
return getFalconClient().schedule(entityType, entityName, colo, skipDryRun, getDoAs(),
properties).getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + SUSPEND_OPT, help = SUSPEND_OPT_DESCRIPTION)
public String suspend(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
@CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
unspecifiedDefaultValue = "*") final String colo
) {
return getFalconClient().suspend(entityType, entityName, colo, getDoAs()).getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + RESUME_OPT, help = RESUME_OPT_DESCRIPTION)
public String resume(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
@CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
unspecifiedDefaultValue = "*") final String colo
) {
return getFalconClient().resume(entityType, entityName, colo, getDoAs()).getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + DELETE_OPT, help = DELETE_OPT_DESCRIPTION)
public String delete(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
) {
return getFalconClient().delete(entityType, entityName, getDoAs()).getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + STATUS_OPT, help = STATUS_OPT_DESCRIPTION)
public String getStatus(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
@CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
unspecifiedDefaultValue = "*") final String colo,
@CliOption(key = {SHOWSCHEDULER_OPT}, mandatory = true,
help = SHOWSCHEDULER_OPT_DESCRIPTION) final boolean showScheduler
) {
return getFalconClient().getStatus(entityType, entityName, colo, getDoAs(),
showScheduler).getMessage();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + DEFINITION_OPT, help = DEFINITION_OPT_DESCRIPTION)
public String getDefinition(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
) {
return getFalconClient().getDefinition(entityType.name().toLowerCase(),
entityName, getDoAs()).toString();
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + DEPENDENCY_OPT, help = DEPENDENCY_OPT_DESCRIPTION)
public String getDependency(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
) {
return getFalconClient().getDependency(entityType.name().toLowerCase(), entityName,
getDoAs()).toString();
}
// SUSPEND CHECKSTYLE CHECK ParameterNumberCheck
@CliCommand(value = ENTITY_COMMAND_PREFIX + LIST_OPT, help = LIST_OPT_DESCRIPTION)
public String list(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {FIELDS_OPT}, mandatory = false, help = FIELDS_OPT_DESCRIPTION) final String fields,
@CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
@CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
@CliOption(key = {FILTER_BY_OPT}, mandatory = false,
help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
@CliOption(key = {TAGS_OPT}, mandatory = false, help = TAGS_OPT_DESCRIPTION) final String filterTags,
@CliOption(key = {NAMESEQ_OPT}, mandatory = false,
help = NAMESEQ_OPT_DESCRIPTION) final String nameSubsequence,
@CliOption(key = {TAGKEYS_OPT}, mandatory = false, help = TAGKEYS_OPT_DESCRIPTION) final String tagKeywords,
@CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
@CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
) {
ValidationUtil.validateEntityFields(fields);
ValidationUtil.validateOrderBy(orderBy, ENTITY_PREFIX);
ValidationUtil.validateFilterBy(filterBy, ENTITY_PREFIX);
EntityList entityList = getFalconClient().getEntityList(entityType.name().toLowerCase(),
fields, nameSubsequence, tagKeywords, filterBy, filterTags, orderBy, sortOrder, offset,
numResults, getDoAs());
return entityList != null ? entityList.toString() : "No entity of type (" + entityType + ") found.";
}
@CliCommand(value = ENTITY_COMMAND_PREFIX + SUMMARY_OPT, help = SUMMARY_OPT_DESCRIPTION)
public String summary(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
@CliOption(key = {CLUSTER_OPT}, mandatory = true, help = CLUSTER_OPT_DESCRIPTION) final String cluster,
@CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start,
@CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end,
@CliOption(key = {FIELDS_OPT}, mandatory = false, help = FIELDS_OPT_DESCRIPTION) final String fields,
@CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
@CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
@CliOption(key = {FILTER_BY_OPT}, mandatory = false, help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
@CliOption(key = {TAGS_OPT}, mandatory = false, help = TAGS_OPT_DESCRIPTION) final String filterTags,
@CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
@CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults,
@CliOption(key = {NUM_INSTANCES_OPT}, mandatory = false,
help = NUM_INSTANCES_OPT_DESCRIPTION) final Integer numInstances
) {
ValidationUtil.validateEntityTypeForSummary(entityType.name().toLowerCase());
ValidationUtil.validateEntityFields(fields);
ValidationUtil.validateFilterBy(filterBy, ENTITY_PREFIX);
ValidationUtil.validateOrderBy(orderBy, ENTITY_PREFIX);
return ResponseHelper.getString(getFalconClient().getEntitySummary(
entityType.name().toLowerCase(), cluster, start, end, fields, filterBy, filterTags,
orderBy, sortOrder, offset, numResults, numInstances, getDoAs()));
}
// RESUME CHECKSTYLE CHECK ParameterNumberCheck
}