| 1 | import { spinner, log, note } from "@clack/prompts"; |
| 2 | import { hubRequest } from "../api.js"; |
| 3 | |
| 4 | interface 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 | |
| 14 | function getFlag(args: string[], flag: string): string | undefined { |
| 15 | const idx = args.indexOf(flag); |
| 16 | return idx !== -1 ? args[idx + 1] : undefined; |
| 17 | } |
| 18 | |
| 19 | export 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 | |