77 lines
2.4 KiB
TypeScript
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}`, {});
|
|
}
|
|
} |