forked from snxraven/peardock
88 lines
2.4 KiB
JavaScript
88 lines
2.4 KiB
JavaScript
/**
|
|
* Volume RPC handlers.
|
|
*/
|
|
import { docker, extractVolumesList } from '../services/docker.js'
|
|
import * as validation from '../utils/validation.js'
|
|
import { Pushes } from '../../shared/protocol.js'
|
|
import { peers } from '../core/peer-registry.js'
|
|
import logger from '../utils/logger.js'
|
|
|
|
export function registerVolumeHandlers(session) {
|
|
session.respond('listVolumes', async () => {
|
|
try {
|
|
const volumesResult = await docker.listVolumes()
|
|
const volumesList = extractVolumesList(volumesResult)
|
|
return {
|
|
type: 'volumes',
|
|
data: volumesList,
|
|
success: true,
|
|
volumes: volumesList,
|
|
}
|
|
} catch (error) {
|
|
return {
|
|
type: 'volumes',
|
|
success: false,
|
|
error: `Failed to list volumes: ${error.message}`,
|
|
data: [],
|
|
volumes: [],
|
|
}
|
|
}
|
|
})
|
|
|
|
session.respond('createVolume', async (args) => {
|
|
const volumeConfig = {
|
|
Name: validation.sanitizeString(args.name, 128),
|
|
}
|
|
if (args.driver) volumeConfig.Driver = args.driver
|
|
if (args.options && typeof args.options === 'object') {
|
|
volumeConfig.DriverOpts = args.options
|
|
}
|
|
const volume = await docker.createVolume(volumeConfig)
|
|
await broadcastVolumes()
|
|
return {
|
|
success: true,
|
|
message: `Volume "${args.name}" created successfully`,
|
|
data: volume.name,
|
|
}
|
|
})
|
|
|
|
session.respond('removeVolume', async (args) => {
|
|
await docker.getVolume(args.name).remove()
|
|
await broadcastVolumes()
|
|
return { success: true, message: `Volume ${args.name} removed` }
|
|
})
|
|
|
|
session.respond('inspectVolume', async (args) => {
|
|
const volumeData = await docker.getVolume(args.name).inspect()
|
|
return { type: 'volumeConfig', data: volumeData }
|
|
})
|
|
|
|
session.respond('pruneVolumes', async (args) => {
|
|
const opts = {}
|
|
if (args.filters) opts.filters = args.filters
|
|
const result = await docker.pruneVolumes(opts)
|
|
await broadcastVolumes()
|
|
return {
|
|
success: true,
|
|
type: 'pruneVolumes',
|
|
message: 'Unused volumes pruned',
|
|
data: result,
|
|
}
|
|
})
|
|
}
|
|
|
|
export async function broadcastVolumes() {
|
|
try {
|
|
const volumesResult = await docker.listVolumes()
|
|
const volumesList = extractVolumesList(volumesResult)
|
|
peers.broadcast(Pushes.volumes, {
|
|
type: 'volumes',
|
|
data: volumesList,
|
|
success: true,
|
|
volumes: volumesList,
|
|
})
|
|
} catch (err) {
|
|
logger.error('Failed to broadcast volumes', { error: err.message })
|
|
}
|
|
}
|