Search in sources :

Example 6 with Subparser

use of net.sourceforge.argparse4j.inf.Subparser in project kafka by apache.

the class AgentClient method main.

public static void main(String[] args) throws Exception {
    ArgumentParser rootParser = ArgumentParsers.newArgumentParser("trogdor-agent-client").defaultHelp(true).description("The Trogdor agent client.");
    Subparsers subParsers = rootParser.addSubparsers().dest("command");
    Subparser uptimeParser = subParsers.addParser("uptime").help("Get the agent uptime.");
    addTargetArgument(uptimeParser);
    addJsonArgument(uptimeParser);
    Subparser statusParser = subParsers.addParser("status").help("Get the agent status.");
    addTargetArgument(statusParser);
    addJsonArgument(statusParser);
    Subparser createWorkerParser = subParsers.addParser("createWorker").help("Create a new worker.");
    addTargetArgument(createWorkerParser);
    addWorkerIdArgument(createWorkerParser, "The worker ID to create.");
    createWorkerParser.addArgument("--taskId").action(store()).required(true).type(String.class).dest("taskId").metavar("TASK_ID").help("The task ID to create.");
    createWorkerParser.addArgument("--spec", "-s").action(store()).required(true).type(String.class).dest("taskSpec").metavar("TASK_SPEC").help("The task spec to create, or a path to a file containing the task spec.");
    Subparser stopWorkerParser = subParsers.addParser("stopWorker").help("Stop a worker.");
    addTargetArgument(stopWorkerParser);
    addWorkerIdArgument(stopWorkerParser, "The worker ID to stop.");
    Subparser destroyWorkerParser = subParsers.addParser("destroyWorker").help("Destroy a worker.");
    addTargetArgument(destroyWorkerParser);
    addWorkerIdArgument(destroyWorkerParser, "The worker ID to destroy.");
    Subparser shutdownParser = subParsers.addParser("shutdown").help("Shut down the agent.");
    addTargetArgument(shutdownParser);
    Namespace res = rootParser.parseArgsOrFail(args);
    String target = res.getString("target");
    AgentClient client = new Builder().maxTries(3).target(target).build();
    ZoneOffset localOffset = OffsetDateTime.now().getOffset();
    switch(res.getString("command")) {
        case "uptime":
            {
                UptimeResponse uptime = client.uptime();
                if (res.getBoolean("json")) {
                    System.out.println(JsonUtil.toJsonString(uptime));
                } else {
                    System.out.printf("Agent is running at %s.%n", target);
                    System.out.printf("\tStart time: %s%n", dateString(uptime.serverStartMs(), localOffset));
                    System.out.printf("\tCurrent server time: %s%n", dateString(uptime.nowMs(), localOffset));
                    System.out.printf("\tUptime: %s%n", durationString(uptime.nowMs() - uptime.serverStartMs()));
                }
                break;
            }
        case "status":
            {
                AgentStatusResponse status = client.status();
                if (res.getBoolean("json")) {
                    System.out.println(JsonUtil.toJsonString(status));
                } else {
                    System.out.printf("Agent is running at %s.%n", target);
                    System.out.printf("\tStart time: %s%n", dateString(status.serverStartMs(), localOffset));
                    List<List<String>> lines = new ArrayList<>();
                    List<String> header = new ArrayList<>(Arrays.asList("WORKER_ID", "TASK_ID", "STATE", "TASK_TYPE"));
                    lines.add(header);
                    for (Map.Entry<Long, WorkerState> entry : status.workers().entrySet()) {
                        List<String> cols = new ArrayList<>();
                        cols.add(Long.toString(entry.getKey()));
                        cols.add(entry.getValue().taskId());
                        cols.add(entry.getValue().getClass().getSimpleName());
                        cols.add(entry.getValue().spec().getClass().getCanonicalName());
                        lines.add(cols);
                    }
                    System.out.print(StringFormatter.prettyPrintGrid(lines));
                }
                break;
            }
        case "createWorker":
            {
                long workerId = res.getLong("workerId");
                String taskId = res.getString("taskId");
                TaskSpec taskSpec = JsonUtil.objectFromCommandLineArgument(res.getString("taskSpec"), TaskSpec.class);
                CreateWorkerRequest req = new CreateWorkerRequest(workerId, taskId, taskSpec);
                client.createWorker(req);
                System.out.printf("Sent CreateWorkerRequest for worker %d%n.", req.workerId());
                break;
            }
        case "stopWorker":
            {
                long workerId = res.getLong("workerId");
                client.stopWorker(new StopWorkerRequest(workerId));
                System.out.printf("Sent StopWorkerRequest for worker %d%n.", workerId);
                break;
            }
        case "destroyWorker":
            {
                long workerId = res.getLong("workerId");
                client.destroyWorker(new DestroyWorkerRequest(workerId));
                System.out.printf("Sent DestroyWorkerRequest for worker %d%n.", workerId);
                break;
            }
        case "shutdown":
            {
                client.invokeShutdown();
                System.out.println("Sent ShutdownRequest.");
                break;
            }
        default:
            {
                System.out.println("You must choose an action. Type --help for help.");
                Exit.exit(1);
            }
    }
}
Also used : UriBuilder(javax.ws.rs.core.UriBuilder) TaskSpec(org.apache.kafka.trogdor.task.TaskSpec) StringFormatter.durationString(org.apache.kafka.trogdor.common.StringFormatter.durationString) StringFormatter.dateString(org.apache.kafka.trogdor.common.StringFormatter.dateString) ArgumentParser(net.sourceforge.argparse4j.inf.ArgumentParser) Namespace(net.sourceforge.argparse4j.inf.Namespace) ZoneOffset(java.time.ZoneOffset) UptimeResponse(org.apache.kafka.trogdor.rest.UptimeResponse) DestroyWorkerRequest(org.apache.kafka.trogdor.rest.DestroyWorkerRequest) Subparsers(net.sourceforge.argparse4j.inf.Subparsers) AgentStatusResponse(org.apache.kafka.trogdor.rest.AgentStatusResponse) StopWorkerRequest(org.apache.kafka.trogdor.rest.StopWorkerRequest) Subparser(net.sourceforge.argparse4j.inf.Subparser) ArrayList(java.util.ArrayList) List(java.util.List) CreateWorkerRequest(org.apache.kafka.trogdor.rest.CreateWorkerRequest)

Example 7 with Subparser

use of net.sourceforge.argparse4j.inf.Subparser in project kafka by apache.

the class CoordinatorClient method main.

public static void main(String[] args) throws Exception {
    ArgumentParser rootParser = ArgumentParsers.newArgumentParser("trogdor-coordinator-client").description("The Trogdor coordinator client.");
    Subparsers subParsers = rootParser.addSubparsers().dest("command");
    Subparser uptimeParser = subParsers.addParser("uptime").help("Get the coordinator uptime.");
    addTargetArgument(uptimeParser);
    addJsonArgument(uptimeParser);
    Subparser statusParser = subParsers.addParser("status").help("Get the coordinator status.");
    addTargetArgument(statusParser);
    addJsonArgument(statusParser);
    Subparser showTaskParser = subParsers.addParser("showTask").help("Show a coordinator task.");
    addTargetArgument(showTaskParser);
    addJsonArgument(showTaskParser);
    showTaskParser.addArgument("--id", "-i").action(store()).required(true).type(String.class).dest("taskId").metavar("TASK_ID").help("The task ID to show.");
    showTaskParser.addArgument("--verbose", "-v").action(storeTrue()).dest("verbose").metavar("VERBOSE").help("Print out everything.");
    showTaskParser.addArgument("--show-status", "-S").action(storeTrue()).dest("showStatus").metavar("SHOW_STATUS").help("Show the task status.");
    Subparser showTasksParser = subParsers.addParser("showTasks").help("Show many coordinator tasks.  By default, all tasks are shown, but " + "command-line options can be specified as filters.");
    addTargetArgument(showTasksParser);
    addJsonArgument(showTasksParser);
    MutuallyExclusiveGroup idGroup = showTasksParser.addMutuallyExclusiveGroup();
    idGroup.addArgument("--id", "-i").action(append()).type(String.class).dest("taskIds").metavar("TASK_IDS").help("Show only this task ID.  This option may be specified multiple times.");
    idGroup.addArgument("--id-pattern").action(store()).type(String.class).dest("taskIdPattern").metavar("TASK_ID_PATTERN").help("Only display tasks which match the given ID pattern.");
    showTasksParser.addArgument("--state", "-s").type(TaskStateType.class).dest("taskStateType").metavar("TASK_STATE_TYPE").help("Show only tasks in this state.");
    Subparser createTaskParser = subParsers.addParser("createTask").help("Create a new task.");
    addTargetArgument(createTaskParser);
    createTaskParser.addArgument("--id", "-i").action(store()).required(true).type(String.class).dest("taskId").metavar("TASK_ID").help("The task ID to create.");
    createTaskParser.addArgument("--spec", "-s").action(store()).required(true).type(String.class).dest("taskSpec").metavar("TASK_SPEC").help("The task spec to create, or a path to a file containing the task spec.");
    Subparser stopTaskParser = subParsers.addParser("stopTask").help("Stop a task.");
    addTargetArgument(stopTaskParser);
    stopTaskParser.addArgument("--id", "-i").action(store()).required(true).type(String.class).dest("taskId").metavar("TASK_ID").help("The task ID to create.");
    Subparser destroyTaskParser = subParsers.addParser("destroyTask").help("Destroy a task.");
    addTargetArgument(destroyTaskParser);
    destroyTaskParser.addArgument("--id", "-i").action(store()).required(true).type(String.class).dest("taskId").metavar("TASK_ID").help("The task ID to destroy.");
    Subparser shutdownParser = subParsers.addParser("shutdown").help("Shut down the coordinator.");
    addTargetArgument(shutdownParser);
    Namespace res = rootParser.parseArgsOrFail(args);
    String target = res.getString("target");
    CoordinatorClient client = new Builder().maxTries(3).target(target).build();
    ZoneOffset localOffset = OffsetDateTime.now().getOffset();
    switch(res.getString("command")) {
        case "uptime":
            {
                UptimeResponse uptime = client.uptime();
                if (res.getBoolean("json")) {
                    System.out.println(JsonUtil.toJsonString(uptime));
                } else {
                    System.out.printf("Coordinator is running at %s.%n", target);
                    System.out.printf("\tStart time: %s%n", dateString(uptime.serverStartMs(), localOffset));
                    System.out.printf("\tCurrent server time: %s%n", dateString(uptime.nowMs(), localOffset));
                    System.out.printf("\tUptime: %s%n", durationString(uptime.nowMs() - uptime.serverStartMs()));
                }
                break;
            }
        case "status":
            {
                CoordinatorStatusResponse response = client.status();
                if (res.getBoolean("json")) {
                    System.out.println(JsonUtil.toJsonString(response));
                } else {
                    System.out.printf("Coordinator is running at %s.%n", target);
                    System.out.printf("\tStart time: %s%n", dateString(response.serverStartMs(), localOffset));
                }
                break;
            }
        case "showTask":
            {
                String taskId = res.getString("taskId");
                TaskRequest req = new TaskRequest(taskId);
                TaskState taskState = null;
                try {
                    taskState = client.task(req);
                } catch (NotFoundException e) {
                    System.out.printf("Task %s was not found.%n", taskId);
                    Exit.exit(1);
                }
                if (res.getBoolean("json")) {
                    System.out.println(JsonUtil.toJsonString(taskState));
                } else {
                    System.out.printf("Task %s of type %s is %s. %s%n", taskId, taskState.spec().getClass().getCanonicalName(), taskState.stateType(), prettyPrintTaskInfo(taskState, localOffset));
                    if (taskState instanceof TaskDone) {
                        TaskDone taskDone = (TaskDone) taskState;
                        if ((taskDone.error() != null) && (!taskDone.error().isEmpty())) {
                            System.out.printf("Error: %s%n", taskDone.error());
                        }
                    }
                    if (res.getBoolean("verbose")) {
                        System.out.printf("Spec: %s%n%n", JsonUtil.toPrettyJsonString(taskState.spec()));
                    }
                    if (res.getBoolean("verbose") || res.getBoolean("showStatus")) {
                        System.out.printf("Status: %s%n%n", JsonUtil.toPrettyJsonString(taskState.status()));
                    }
                }
                break;
            }
        case "showTasks":
            {
                TaskStateType taskStateType = res.<TaskStateType>get("taskStateType");
                List<String> taskIds = new ArrayList<>();
                Pattern taskIdPattern = null;
                if (res.getList("taskIds") != null) {
                    for (Object taskId : res.getList("taskIds")) {
                        taskIds.add((String) taskId);
                    }
                } else if (res.getString("taskIdPattern") != null) {
                    try {
                        taskIdPattern = Pattern.compile(res.getString("taskIdPattern"));
                    } catch (PatternSyntaxException e) {
                        System.out.println("Invalid task ID regular expression " + res.getString("taskIdPattern"));
                        e.printStackTrace();
                        Exit.exit(1);
                    }
                }
                TasksRequest req = new TasksRequest(taskIds, 0, 0, 0, 0, Optional.ofNullable(taskStateType));
                TasksResponse response = client.tasks(req);
                if (taskIdPattern != null) {
                    TreeMap<String, TaskState> filteredTasks = new TreeMap<>();
                    for (Map.Entry<String, TaskState> entry : response.tasks().entrySet()) {
                        if (taskIdPattern.matcher(entry.getKey()).matches()) {
                            filteredTasks.put(entry.getKey(), entry.getValue());
                        }
                    }
                    response = new TasksResponse(filteredTasks);
                }
                if (res.getBoolean("json")) {
                    System.out.println(JsonUtil.toJsonString(response));
                } else {
                    System.out.println(prettyPrintTasksResponse(response, localOffset));
                }
                if (response.tasks().isEmpty()) {
                    Exit.exit(1);
                }
                break;
            }
        case "createTask":
            {
                String taskId = res.getString("taskId");
                TaskSpec taskSpec = JsonUtil.objectFromCommandLineArgument(res.getString("taskSpec"), TaskSpec.class);
                CreateTaskRequest req = new CreateTaskRequest(taskId, taskSpec);
                try {
                    client.createTask(req);
                    System.out.printf("Sent CreateTaskRequest for task %s.%n", req.id());
                } catch (RequestConflictException rce) {
                    System.out.printf("CreateTaskRequest for task %s got a 409 status code - " + "a task with the same ID but a different specification already exists.%nException: %s%n", req.id(), rce.getMessage());
                    Exit.exit(1);
                }
                break;
            }
        case "stopTask":
            {
                String taskId = res.getString("taskId");
                StopTaskRequest req = new StopTaskRequest(taskId);
                client.stopTask(req);
                System.out.printf("Sent StopTaskRequest for task %s.%n", taskId);
                break;
            }
        case "destroyTask":
            {
                String taskId = res.getString("taskId");
                DestroyTaskRequest req = new DestroyTaskRequest(taskId);
                client.destroyTask(req);
                System.out.printf("Sent DestroyTaskRequest for task %s.%n", taskId);
                break;
            }
        case "shutdown":
            {
                client.shutdown();
                System.out.println("Sent ShutdownRequest.");
                break;
            }
        default:
            {
                System.out.println("You must choose an action. Type --help for help.");
                Exit.exit(1);
            }
    }
}
Also used : CoordinatorStatusResponse(org.apache.kafka.trogdor.rest.CoordinatorStatusResponse) TasksResponse(org.apache.kafka.trogdor.rest.TasksResponse) MutuallyExclusiveGroup(net.sourceforge.argparse4j.inf.MutuallyExclusiveGroup) UriBuilder(javax.ws.rs.core.UriBuilder) NotFoundException(javax.ws.rs.NotFoundException) StringFormatter.durationString(org.apache.kafka.trogdor.common.StringFormatter.durationString) StringFormatter.dateString(org.apache.kafka.trogdor.common.StringFormatter.dateString) ArgumentParser(net.sourceforge.argparse4j.inf.ArgumentParser) ZoneOffset(java.time.ZoneOffset) Subparsers(net.sourceforge.argparse4j.inf.Subparsers) DestroyTaskRequest(org.apache.kafka.trogdor.rest.DestroyTaskRequest) Subparser(net.sourceforge.argparse4j.inf.Subparser) RequestConflictException(org.apache.kafka.trogdor.rest.RequestConflictException) ArrayList(java.util.ArrayList) List(java.util.List) TaskStateType(org.apache.kafka.trogdor.rest.TaskStateType) PatternSyntaxException(java.util.regex.PatternSyntaxException) Pattern(java.util.regex.Pattern) StopTaskRequest(org.apache.kafka.trogdor.rest.StopTaskRequest) TaskDone(org.apache.kafka.trogdor.rest.TaskDone) TaskSpec(org.apache.kafka.trogdor.task.TaskSpec) DestroyTaskRequest(org.apache.kafka.trogdor.rest.DestroyTaskRequest) TaskRequest(org.apache.kafka.trogdor.rest.TaskRequest) StopTaskRequest(org.apache.kafka.trogdor.rest.StopTaskRequest) CreateTaskRequest(org.apache.kafka.trogdor.rest.CreateTaskRequest) TreeMap(java.util.TreeMap) Namespace(net.sourceforge.argparse4j.inf.Namespace) UptimeResponse(org.apache.kafka.trogdor.rest.UptimeResponse) CreateTaskRequest(org.apache.kafka.trogdor.rest.CreateTaskRequest) TasksRequest(org.apache.kafka.trogdor.rest.TasksRequest) TaskState(org.apache.kafka.trogdor.rest.TaskState)

Example 8 with Subparser

use of net.sourceforge.argparse4j.inf.Subparser in project helios by spotify.

the class CliParser method setupCommands.

private void setupCommands() {
    // Job commands
    new JobCreateCommand(parse("create"));
    new JobRemoveCommand(parse("remove"));
    new JobInspectCommand(parse("inspect"));
    new JobDeployCommand(parse("deploy"));
    new JobUndeployCommand(parse("undeploy"));
    new JobStartCommand(parse("start"));
    new JobStopCommand(parse("stop"));
    new JobHistoryCommand(parse("history"));
    new JobListCommand(parse("jobs"));
    new JobStatusCommand(parse("status"));
    new JobWatchCommand(parse("watch"));
    // Host commands
    new HostListCommand(parse("hosts"));
    new HostRegisterCommand(parse("register"));
    new HostDeregisterCommand(parse("deregister"));
    // Master commands
    new MasterListCommand(parse("masters"));
    // Deployment group commands
    new DeploymentGroupCreateCommand(parse("create-deployment-group"));
    new DeploymentGroupRemoveCommand(parse("remove-deployment-group"));
    new DeploymentGroupListCommand(parse("list-deployment-groups"));
    new DeploymentGroupInspectCommand(parse("inspect-deployment-group"));
    new DeploymentGroupStatusCommand(parse("deployment-group-status"));
    new DeploymentGroupWatchCommand(parse("watch-deployment-group"));
    new RollingUpdateCommand(parse("rolling-update"));
    new DeploymentGroupStopCommand(parse("stop-deployment-group"));
    // Version Command
    final Subparser version = parse("version").help("print version of master and client");
    new VersionCommand(version);
}
Also used : HostListCommand(com.spotify.helios.cli.command.HostListCommand) JobInspectCommand(com.spotify.helios.cli.command.JobInspectCommand) RollingUpdateCommand(com.spotify.helios.cli.command.RollingUpdateCommand) DeploymentGroupStatusCommand(com.spotify.helios.cli.command.DeploymentGroupStatusCommand) VersionCommand(com.spotify.helios.cli.command.VersionCommand) DeploymentGroupCreateCommand(com.spotify.helios.cli.command.DeploymentGroupCreateCommand) MasterListCommand(com.spotify.helios.cli.command.MasterListCommand) JobHistoryCommand(com.spotify.helios.cli.command.JobHistoryCommand) HostRegisterCommand(com.spotify.helios.cli.command.HostRegisterCommand) DeploymentGroupListCommand(com.spotify.helios.cli.command.DeploymentGroupListCommand) Subparser(net.sourceforge.argparse4j.inf.Subparser) JobUndeployCommand(com.spotify.helios.cli.command.JobUndeployCommand) JobDeployCommand(com.spotify.helios.cli.command.JobDeployCommand) DeploymentGroupRemoveCommand(com.spotify.helios.cli.command.DeploymentGroupRemoveCommand) JobStopCommand(com.spotify.helios.cli.command.JobStopCommand) JobWatchCommand(com.spotify.helios.cli.command.JobWatchCommand) DeploymentGroupWatchCommand(com.spotify.helios.cli.command.DeploymentGroupWatchCommand) JobListCommand(com.spotify.helios.cli.command.JobListCommand) JobStartCommand(com.spotify.helios.cli.command.JobStartCommand) DeploymentGroupInspectCommand(com.spotify.helios.cli.command.DeploymentGroupInspectCommand) HostDeregisterCommand(com.spotify.helios.cli.command.HostDeregisterCommand) JobRemoveCommand(com.spotify.helios.cli.command.JobRemoveCommand) DeploymentGroupStopCommand(com.spotify.helios.cli.command.DeploymentGroupStopCommand) JobCreateCommand(com.spotify.helios.cli.command.JobCreateCommand) JobStatusCommand(com.spotify.helios.cli.command.JobStatusCommand)

Example 9 with Subparser

use of net.sourceforge.argparse4j.inf.Subparser in project helios by spotify.

the class DeploymentGroupStatusCommandTest method setUp.

@Before
public void setUp() {
    // use a real, dummy Subparser impl to avoid having to mock out every single call
    final ArgumentParser parser = ArgumentParsers.newArgumentParser("test");
    final Subparser subparser = parser.addSubparsers().addParser("status");
    command = new DeploymentGroupStatusCommand(subparser);
}
Also used : Subparser(net.sourceforge.argparse4j.inf.Subparser) ArgumentParser(net.sourceforge.argparse4j.inf.ArgumentParser) Before(org.junit.Before)

Example 10 with Subparser

use of net.sourceforge.argparse4j.inf.Subparser in project helios by spotify.

the class JobListCommandTest method setUp.

@Before
public void setUp() {
    // use a real, dummy Subparser impl to avoid having to mock out every single call
    final ArgumentParser parser = ArgumentParsers.newArgumentParser("test");
    final Subparser subparser = parser.addSubparsers().addParser("list");
    command = new JobListCommand(subparser);
    when(client.jobs()).thenReturn(Futures.immediateFuture(jobs));
    final Map<JobId, JobStatus> statuses = new HashMap<>();
    for (final JobId jobId : jobs.keySet()) {
        // pretend each job is deployed
        final JobStatus status = JobStatus.newBuilder().setDeployments(ImmutableMap.of("host", Deployment.of(jobId, Goal.START))).build();
        statuses.put(jobId, status);
    }
    when(client.jobStatuses(jobs.keySet())).thenReturn(Futures.immediateFuture(statuses));
}
Also used : JobStatus(com.spotify.helios.common.descriptors.JobStatus) HashMap(java.util.HashMap) Subparser(net.sourceforge.argparse4j.inf.Subparser) ArgumentParser(net.sourceforge.argparse4j.inf.ArgumentParser) JobId(com.spotify.helios.common.descriptors.JobId) Before(org.junit.Before)

Aggregations

Subparser (net.sourceforge.argparse4j.inf.Subparser)21 ArgumentParser (net.sourceforge.argparse4j.inf.ArgumentParser)10 Before (org.junit.Before)7 Namespace (net.sourceforge.argparse4j.inf.Namespace)5 ImmutableMap (com.google.common.collect.ImmutableMap)3 OptionMetadata (io.airlift.airline.model.OptionMetadata)3 List (java.util.List)3 Argument (net.sourceforge.argparse4j.inf.Argument)3 Configuration (io.dropwizard.Configuration)2 Bootstrap (io.dropwizard.setup.Bootstrap)2 ZoneOffset (java.time.ZoneOffset)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 Map (java.util.Map)2 UriBuilder (javax.ws.rs.core.UriBuilder)2 Subparsers (net.sourceforge.argparse4j.inf.Subparsers)2 StringFormatter.dateString (org.apache.kafka.trogdor.common.StringFormatter.dateString)2 StringFormatter.durationString (org.apache.kafka.trogdor.common.StringFormatter.durationString)2 UptimeResponse (org.apache.kafka.trogdor.rest.UptimeResponse)2 TaskSpec (org.apache.kafka.trogdor.task.TaskSpec)2