hetznercloud/ts/classes.volume.ts
2024-06-15 15:31:55 +02:00

77 lines
2.4 KiB
TypeScript

import type { HetznerAccount } from './classes.account.js';
import type { HetznerServer } from './classes.server.js';
import * as plugins from './hetznercloud.plugins.js';
import * as types from './types.js';
export class HetznerVolume {
public static create = async (
hetznerAccountRefArg: HetznerAccount,
optionsArg: {
name: string;
size: number;
location: types.THetznerCloudLocationName;
labels?: {[key: string]: string},
server: HetznerServer,
}
) => {
const volume = new HetznerVolume(hetznerAccountRefArg);
const createVolumeUrl = '/volumes';
const createVolumePayload: types.TVolumeCreateRequestBody = {
name: optionsArg.name,
size: optionsArg.size,
location: optionsArg.location,
labels: optionsArg.labels || {} as any,
server: optionsArg.server.data.id,
format: 'xfs'
};
const response = await volume.hetznerAccountRef.request(
'POST',
createVolumeUrl,
createVolumePayload
);
volume.data = (response.body as types.TVolumeCreateResponseBody).volume;
return volume;
}
public static getVolumes = async (hetznerAccountRefArg: HetznerAccount) => {
const volumesGetUrl = '/volumes';
const response = await hetznerAccountRefArg.request('GET', volumesGetUrl, {});
const volumesDataArray = (response.body as types.TVolumeGetResponseBody).volumes;
const volumes: HetznerVolume[] = [];
for (const volumeData of volumesDataArray) {
const volume = new HetznerVolume(hetznerAccountRefArg);
volume.data = volumeData;
volumes.push(volume);
}
return volumes;
}
public static getVolumesByLabel = async (hetznerAccountRefArg: HetznerAccount, labelObject: {[key: string]: string}) => {
const volumes = await HetznerVolume.getVolumes(hetznerAccountRefArg);
const results: HetznerVolume[] = [];
for (const volume of volumes) {
let isMatch = true;
for (const key in labelObject) {
if (volume.data.labels[key] !== labelObject[key]) {
isMatch = false;
}
}
if (isMatch) {
results.push(volume);
}
}
return results;
}
public data: types.IVolume;
public hetznerAccountRef: HetznerAccount;
constructor(hetznerAccountRefArg: HetznerAccount) {
this.hetznerAccountRef = hetznerAccountRefArg;
}
public delete = async () => {
await this.hetznerAccountRef.request('DELETE', `/volumes/${this.data.id}`, {});
}
}