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