1.5 KB55 lines
Blame
1import { spinner, log, note } from "@clack/prompts";
2import { hubRequest } from "../api.js";
3
4interface Instance {
5 id: number;
6 name: string;
7 ip: string | null;
8 domain: string | null;
9 region: string;
10 size: string;
11 status: string;
12}
13
14function getFlag(args: string[], flag: string): string | undefined {
15 const idx = args.indexOf(flag);
16 return idx !== -1 ? args[idx + 1] : undefined;
17}
18
19export async function instanceCreate(args: string[]) {
20 const name = getFlag(args, "--name") ?? "grove";
21 const region = getFlag(args, "--region");
22 const size = getFlag(args, "--size");
23 const ip = getFlag(args, "--ip");
24 const domain = getFlag(args, "--domain");
25
26 if (!region || !size) {
27 log.error(
28 "Usage: grove instance create --region <region> --size <size> [--ip <ip>] [--domain <domain>] [--name <name>]"
29 );
30 process.exit(1);
31 }
32
33 const s = spinner();
34 s.start("Creating instance");
35 const { instance } = await hubRequest<{ instance: Instance }>(
36 "/api/instances",
37 {
38 method: "POST",
39 body: JSON.stringify({ name, region, size, ip, domain }),
40 }
41 );
42 s.stop("Instance created");
43
44 const details = [
45 `Name: ${instance.name} (id: ${instance.id})`,
46 `Region: ${instance.region}`,
47 `Size: ${instance.size}`,
48 ];
49 if (instance.ip) details.push(`IP: ${instance.ip}`);
50 if (instance.domain) details.push(`Domain: ${instance.domain}`);
51 details.push(`Status: ${instance.status}`);
52
53 note(details.join("\n"), "Instance");
54}
55