mirror of
https://github.com/nicotsx/ironmount.git
synced 2025-12-10 12:10:51 +01:00
feat: toggle auto remount
This commit is contained in:
@@ -9,7 +9,7 @@ export const startup = async () => {
|
||||
const volumes = await db.query.volumesTable.findMany({
|
||||
where: or(
|
||||
eq(volumesTable.status, "mounted"),
|
||||
and(eq(volumesTable.autoRemount, 1), eq(volumesTable.status, "error")),
|
||||
and(eq(volumesTable.autoRemount, true), eq(volumesTable.status, "error")),
|
||||
),
|
||||
});
|
||||
|
||||
@@ -28,10 +28,8 @@ export const startup = async () => {
|
||||
});
|
||||
|
||||
for (const volume of volumes) {
|
||||
const { error } = await volumeService.checkHealth(volume.name);
|
||||
if (error && volume.autoRemount) {
|
||||
// TODO: retry with backoff based on last health check time
|
||||
// Until we reach the max backoff and it'll try every 10 minutes
|
||||
const { status } = await volumeService.checkHealth(volume.name);
|
||||
if (status === "error" && volume.autoRemount) {
|
||||
await volumeService.mountVolume(volume.name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
updateVolumeBody,
|
||||
updateVolumeDto,
|
||||
healthCheckDto,
|
||||
type UpdateVolumeResponseDto,
|
||||
} from "./volume.dto";
|
||||
import { volumeService } from "./volume.service";
|
||||
|
||||
@@ -86,19 +87,17 @@ export const volumeController = new Hono()
|
||||
.put("/:name", updateVolumeDto, validator("json", updateVolumeBody), async (c) => {
|
||||
const { name } = c.req.param();
|
||||
const body = c.req.valid("json");
|
||||
const res = await volumeService.updateVolume(name, body.config);
|
||||
const res = await volumeService.updateVolume(name, body);
|
||||
|
||||
const response = {
|
||||
message: "Volume updated",
|
||||
volume: {
|
||||
name: res.volume.name,
|
||||
path: res.volume.path,
|
||||
type: res.volume.type,
|
||||
...res.volume,
|
||||
createdAt: res.volume.createdAt.getTime(),
|
||||
updatedAt: res.volume.updatedAt.getTime(),
|
||||
config: res.volume.config,
|
||||
lastHealthCheck: res.volume.lastHealthCheck.getTime(),
|
||||
},
|
||||
};
|
||||
} satisfies UpdateVolumeResponseDto;
|
||||
|
||||
return c.json(response, 200);
|
||||
})
|
||||
|
||||
@@ -139,19 +139,15 @@ export const getVolumeDto = describeRoute({
|
||||
* Update a volume
|
||||
*/
|
||||
export const updateVolumeBody = type({
|
||||
config: volumeConfigSchema,
|
||||
autoRemount: "boolean?",
|
||||
config: volumeConfigSchema.optional(),
|
||||
});
|
||||
|
||||
export type UpdateVolumeBody = typeof updateVolumeBody.infer;
|
||||
|
||||
export const updateVolumeResponse = type({
|
||||
message: "string",
|
||||
volume: type({
|
||||
name: "string",
|
||||
path: "string",
|
||||
type: "string",
|
||||
createdAt: "number",
|
||||
updatedAt: "number",
|
||||
config: volumeConfigSchema,
|
||||
}),
|
||||
volume: volumeSchema,
|
||||
});
|
||||
|
||||
export const updateVolumeDto = describeRoute({
|
||||
@@ -174,6 +170,8 @@ export const updateVolumeDto = describeRoute({
|
||||
},
|
||||
});
|
||||
|
||||
export type UpdateVolumeResponseDto = typeof updateVolumeResponse.infer;
|
||||
|
||||
/**
|
||||
* Test connection
|
||||
*/
|
||||
|
||||
@@ -13,6 +13,7 @@ import { volumesTable } from "../../db/schema";
|
||||
import { toMessage } from "../../utils/errors";
|
||||
import { getStatFs, type StatFs } from "../../utils/mountinfo";
|
||||
import { createVolumeBackend } from "../backends/backend";
|
||||
import type { UpdateVolumeBody } from "./volume.dto";
|
||||
|
||||
const listVolumes = async () => {
|
||||
const volumes = await db.query.volumesTable.findMany({});
|
||||
@@ -114,7 +115,7 @@ const getVolume = async (name: string) => {
|
||||
return { volume, statfs };
|
||||
};
|
||||
|
||||
const updateVolume = async (name: string, backendConfig: BackendConfig) => {
|
||||
const updateVolume = async (name: string, volumeData: UpdateVolumeBody) => {
|
||||
const existing = await db.query.volumesTable.findFirst({
|
||||
where: eq(volumesTable.name, name),
|
||||
});
|
||||
@@ -126,10 +127,10 @@ const updateVolume = async (name: string, backendConfig: BackendConfig) => {
|
||||
const [updated] = await db
|
||||
.update(volumesTable)
|
||||
.set({
|
||||
config: backendConfig,
|
||||
type: backendConfig.backend,
|
||||
config: volumeData.config,
|
||||
type: volumeData.config?.backend,
|
||||
autoRemount: volumeData.autoRemount,
|
||||
updatedAt: new Date(),
|
||||
status: "unmounted",
|
||||
})
|
||||
.where(eq(volumesTable.name, name))
|
||||
.returning();
|
||||
|
||||
Reference in New Issue
Block a user