A simple command-line tool to start NetBSD virtual machines using QEMU with sensible defaults.
1import { Hono } from "hono";
2import { Effect, pipe } from "effect";
3import {
4 createVolumeIfNeeded,
5 handleError,
6 parseCreateVolumeRequest,
7 parseParams,
8 presentation,
9} from "./utils.ts";
10import { listVolumes } from "../mod.ts";
11import { deleteVolume, getVolume } from "../volumes.ts";
12import type { NewVolume } from "../types.ts";
13import { getImage } from "../images.ts";
14import { ImageNotFoundError } from "./machines.ts";
15
16const app = new Hono();
17
18app.get("/", (c) =>
19 Effect.runPromise(
20 pipe(
21 listVolumes(),
22 presentation(c),
23 ),
24 ));
25
26app.get("/:id", (c) =>
27 Effect.runPromise(
28 pipe(
29 parseParams(c),
30 Effect.flatMap(({ id }) => getVolume(id)),
31 presentation(c),
32 ),
33 ));
34
35app.delete("/:id", (c) =>
36 Effect.runPromise(
37 pipe(
38 parseParams(c),
39 Effect.flatMap(({ id }) =>
40 Effect.gen(function* () {
41 const volume = yield* getVolume(id);
42 yield* deleteVolume(id);
43 return volume;
44 })
45 ),
46 presentation(c),
47 ),
48 ));
49
50app.post("/", (c) =>
51 Effect.runPromise(
52 pipe(
53 parseCreateVolumeRequest(c),
54 Effect.flatMap((params: NewVolume) =>
55 Effect.gen(function* () {
56 const image = yield* getImage(params.baseImage);
57 if (!image) {
58 return yield* Effect.fail(
59 new ImageNotFoundError({ id: params.baseImage }),
60 );
61 }
62
63 return yield* createVolumeIfNeeded(image, params.name, params.size);
64 })
65 ),
66 presentation(c),
67 Effect.catchAll((error) => handleError(error, c)),
68 ),
69 ));
70
71export default app;