/**
* 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.commons.lang3.StringUtils;
import org.apache.falcon.entity.v0.EntityType;
import org.apache.falcon.metadata.RelationshipType;
import org.springframework.shell.core.annotation.CliCommand;
import org.springframework.shell.core.annotation.CliOption;
import org.springframework.stereotype.Component;
import static org.apache.falcon.client.FalconCLIConstants.NAME_OPT;
import static org.apache.falcon.client.FalconCLIConstants.PIPELINE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.RELATIONS_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.DIRECTION_OPT;
import static org.apache.falcon.client.FalconCLIConstants.DIRECTION_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.EDGE_CMD;
import static org.apache.falcon.client.FalconCLIConstants.EDGE_CMD_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.FEED_OPT;
import static org.apache.falcon.client.FalconCLIConstants.FEED_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.ID_OPT;
import static org.apache.falcon.client.FalconCLIConstants.ID_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.KEY_OPT;
import static org.apache.falcon.client.FalconCLIConstants.KEY_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.LINEAGE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.LINEAGE_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.NAME_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.PIPELINE_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.PROCESS_OPT;
import static org.apache.falcon.client.FalconCLIConstants.PROCESS_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.RELATIONS_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.VALUE_OPT;
import static org.apache.falcon.client.FalconCLIConstants.VALUE_OPT_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.VERTEX_CMD;
import static org.apache.falcon.client.FalconCLIConstants.VERTEX_CMD_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.VERTEX_EDGES_CMD;
import static org.apache.falcon.client.FalconCLIConstants.VERTEX_EDGES_CMD_DESCRIPTION;
import static org.apache.falcon.client.FalconCLIConstants.VERTICES_CMD;
import static org.apache.falcon.client.FalconCLIConstants.VERTICES_CMD_DESCRIPTION;
import static org.apache.falcon.ValidationUtil.validateDimensionName;
import static org.apache.falcon.ValidationUtil.validateDimensionType;
import static org.apache.falcon.ValidationUtil.validateId;
import static org.apache.falcon.ValidationUtil.validateScheduleEntity;
import static org.apache.falcon.ValidationUtil.validateVertexEdgesCommand;
import static org.apache.falcon.ValidationUtil.validateVerticesCommand;
/**
* Metadata commands.
*/
@Component
public class FalconMetadataCommands extends BaseFalconCommands {
public static final String METADATA_PREFIX = "metadata";
public static final String METADATA_COMMAND_PREFIX = METADATA_PREFIX + " ";
@CliCommand(value = {METADATA_COMMAND_PREFIX + LINEAGE_OPT}, help = LINEAGE_OPT_DESCRIPTION)
public String lineage(
@CliOption(key = {PIPELINE_OPT}, mandatory = true, help = PIPELINE_OPT_DESCRIPTION) final String pipeline
) {
return getFalconClient().getEntityLineageGraph(pipeline, getDoAs()).getDotNotation();
}
@CliCommand(value = {METADATA_COMMAND_PREFIX + LIST_OPT}, help = LIST_OPT_DESCRIPTION)
public String list(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final String dimensionType,
@CliOption(key = {CLUSTER_OPT}, mandatory = false, help = CLUSTER_OPT_DESCRIPTION) final String cluster,
@CliOption(key = {FEED_OPT}, mandatory = false, help = FEED_OPT_DESCRIPTION) final String feed,
@CliOption(key = {PROCESS_OPT}, mandatory = false, help = PROCESS_OPT_DESCRIPTION) final String process,
@CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
) {
validateDimensionType(dimensionType.toUpperCase());
if (!(dimensionType.toUpperCase())
.equals(RelationshipType.REPLICATION_METRICS.name())) {
return getFalconClient().getDimensionList(dimensionType, cluster, getDoAs());
} else {
String schedEntityType = null;
String schedEntityName = null;
if (StringUtils.isNotEmpty(feed)) {
schedEntityType = EntityType.getEnum(FEED_OPT).name();
schedEntityName = feed;
} else if (StringUtils.isNotEmpty(process)) {
schedEntityType = EntityType.getEnum(PROCESS_OPT).name();
schedEntityName = process;
}
validateScheduleEntity(schedEntityType, schedEntityName);
return getFalconClient().getReplicationMetricsDimensionList(schedEntityType, schedEntityName,
numResults, getDoAs());
}
}
@CliCommand(value = {METADATA_COMMAND_PREFIX + RELATIONS_OPT}, help = RELATIONS_OPT_DESCRIPTION)
public String relations(
@CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final String dimensionType,
@CliOption(key = {NAME_OPT}, mandatory = true, help = NAME_OPT_DESCRIPTION) final String dimensionName,
@CliOption(key = {CLUSTER_OPT}, mandatory = false, help = CLUSTER_OPT_DESCRIPTION) final String cluster,
@CliOption(key = {FEED_OPT}, mandatory = false, help = FEED_OPT_DESCRIPTION) final String feed,
@CliOption(key = {PROCESS_OPT}, mandatory = false, help = PROCESS_OPT_DESCRIPTION) final String process,
@CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
) {
validateDimensionType(dimensionType.toUpperCase());
validateDimensionName(dimensionName, RELATIONS_OPT);
return getFalconClient().getDimensionRelations(dimensionType, dimensionName, getDoAs());
}
@CliCommand(value = {METADATA_COMMAND_PREFIX + VERTEX_CMD}, help = VERTEX_CMD_DESCRIPTION)
public String vertex(
@CliOption(key = {ID_OPT}, mandatory = true, help = ID_OPT_DESCRIPTION) final String id
) {
validateId(id);
return getFalconClient().getVertex(id, getDoAs());
}
@CliCommand(value = {METADATA_COMMAND_PREFIX + EDGE_CMD}, help = EDGE_CMD_DESCRIPTION)
public String edge(
@CliOption(key = {ID_OPT}, mandatory = true, help = ID_OPT_DESCRIPTION) final String id
) {
validateId(id);
return getFalconClient().getEdge(id, getDoAs());
}
@CliCommand(value = {METADATA_COMMAND_PREFIX + VERTICES_CMD}, help = VERTICES_CMD_DESCRIPTION)
public String vertices(
@CliOption(key = {KEY_OPT}, mandatory = true, help = KEY_OPT_DESCRIPTION) final String key,
@CliOption(key = {VALUE_OPT}, mandatory = true, help = VALUE_OPT_DESCRIPTION) final String value
) {
validateVerticesCommand(key, value);
return getFalconClient().getVertices(key, value, getDoAs());
}
@CliCommand(value = {METADATA_COMMAND_PREFIX + VERTEX_EDGES_CMD}, help = VERTEX_EDGES_CMD_DESCRIPTION)
public String vertexEdges(
@CliOption(key = {ID_OPT}, mandatory = true, help = ID_OPT_DESCRIPTION) final String id,
@CliOption(key = {DIRECTION_OPT}, mandatory = true, help = DIRECTION_OPT_DESCRIPTION) final String direction
) {
validateVertexEdgesCommand(id, direction);
return getFalconClient().getVertexEdges(id, direction, getDoAs());
}
}