cli/src/commands/instance-create.tsblame
View source
59e66671import { spinner, log, note } from "@clack/prompts";
e93a9782import { hubRequest } from "../api.js";
e93a9783
e93a9784interface Instance {
e93a9785 id: number;
e93a9786 name: string;
e93a9787 ip: string | null;
e93a9788 domain: string | null;
e93a9789 region: string;
e93a97810 size: string;
e93a97811 status: string;
e93a97812}
e93a97813
e93a97814function getFlag(args: string[], flag: string): string | undefined {
e93a97815 const idx = args.indexOf(flag);
e93a97816 return idx !== -1 ? args[idx + 1] : undefined;
e93a97817}
e93a97818
e93a97819export async function instanceCreate(args: string[]) {
e93a97820 const name = getFlag(args, "--name") ?? "grove";
e93a97821 const region = getFlag(args, "--region");
e93a97822 const size = getFlag(args, "--size");
e93a97823 const ip = getFlag(args, "--ip");
e93a97824 const domain = getFlag(args, "--domain");
e93a97825
e93a97826 if (!region || !size) {
59e666727 log.error(
e93a97828 "Usage: grove instance create --region <region> --size <size> [--ip <ip>] [--domain <domain>] [--name <name>]"
e93a97829 );
e93a97830 process.exit(1);
e93a97831 }
e93a97832
59e666733 const s = spinner();
59e666734 s.start("Creating instance");
e93a97835 const { instance } = await hubRequest<{ instance: Instance }>(
e93a97836 "/api/instances",
e93a97837 {
e93a97838 method: "POST",
e93a97839 body: JSON.stringify({ name, region, size, ip, domain }),
e93a97840 }
e93a97841 );
59e666742 s.stop("Instance created");
e93a97843
59e666744 const details = [
59e666745 `Name: ${instance.name} (id: ${instance.id})`,
59e666746 `Region: ${instance.region}`,
59e666747 `Size: ${instance.size}`,
59e666748 ];
59e666749 if (instance.ip) details.push(`IP: ${instance.ip}`);
59e666750 if (instance.domain) details.push(`Domain: ${instance.domain}`);
59e666751 details.push(`Status: ${instance.status}`);
59e666752
59e666753 note(details.join("\n"), "Instance");
e93a97854}