Files
cloudron-box/dashboard/src/models/VolumesModel.js
T

139 lines
3.6 KiB
JavaScript

import { fetcher } from 'pankow';
import { API_ORIGIN } from '../constants.js';
const mountTypes = [
{ name: 'CIFS', value: 'cifs' },
{ name: 'EXT4', value: 'ext4' },
{ name: 'Filesystem', value: 'filesystem' },
{ name: 'Filesystem (Mountpoint)', value: 'mountpoint' },
{ name: 'NFS', value: 'nfs' },
{ name: 'SSHFS', value: 'sshfs' },
{ name: 'XFS', value: 'xfs' },
];
function filterConfigForMountType(mountType, config) {
let props = [];
switch (mountType) {
case 'filesystem':
props = ['hostPath'];
break;
case 'mountpoint':
props = ['hostPath'];
break;
case 'ext4':
props = ['diskPath'];
break;
case 'xfs':
props = ['diskPath'];
break;
case 'cifs':
props = ['host', 'seal', 'remoteDir', 'username', 'password'];
break;
case 'nfs':
props = ['host', 'remoteDir'];
break;
case 'sshfs':
props = ['host', 'port', 'remoteDir', 'user', 'privateKey'];
break;
}
const ret = {};
for (const p of props) ret[p] = config[p];
return ret;
}
function create() {
const accessToken = localStorage.token;
return {
async list() {
let result;
try {
result = await fetcher.get(`${API_ORIGIN}/api/v1/volumes`, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 200) return [result];
return [null, result.body.volumes];
},
async getStatus(id) {
let error, result;
try {
result = await fetcher.get(`${API_ORIGIN}/api/v1/volumes/${id}/status`, { access_token: accessToken });
} catch (e) {
error = e;
}
if (error || result.status !== 200) {
console.error('Failed to get volume status.', error, result);
return {};
}
return result.body;
},
async remount(id) {
let error, result;
try {
result = await fetcher.post(`${API_ORIGIN}/api/v1/volumes/${id}/remount`, {}, { access_token: accessToken });
} catch (e) {
error = e;
}
if (error || result.status !== 202) console.error('Failed to remount volume.', error, result);
},
async add(name, mountType, mountOptions) {
let error, result;
try {
result = await fetcher.post(`${API_ORIGIN}/api/v1/volumes`, { name, mountType, mountOptions: filterConfigForMountType(mountType, mountOptions) }, { access_token: accessToken });
} catch (e) {
error = e;
}
if (error || result.status !== 201) throw error || result;
},
async update(id, mountType, mountOptions) {
let error, result;
try {
result = await fetcher.post(`${API_ORIGIN}/api/v1/volumes/${id}`, { mountOptions: filterConfigForMountType(mountType, mountOptions) }, { access_token: accessToken });
} catch (e) {
error = e;
}
if (error || result.status !== 204) throw error || result;
},
async remove(id) {
let error, result;
try {
result = await fetcher.del(`${API_ORIGIN}/api/v1/volumes/${id}`, null, { access_token: accessToken });
} catch (e) {
error = e;
}
if (error || result.status !== 204) throw error || result;
},
async getBlockDevices() {
let error, result;
try {
result = await fetcher.get(`${API_ORIGIN}/api/v1/system/block_devices`, { access_token: accessToken });
} catch (e) {
error = e;
}
if (error || result.status !== 200) {
console.error('Failed to get block devices.', error, result);
return {};
}
return result.body.devices;
},
};
}
export default {
create,
mountTypes,
};