import type { HetznerAccount } from './classes.account.js'; import * as plugins from './hetznercloud.plugins.js'; import * as types from './types.js'; export class HetznerServer { // STATIC public static async create( hetznerAccountRefArg: HetznerAccount, optionsArg: { name: string; type: types.THetznerCloudServerName; location: types.THetznerCloudLocationName; labels?: {[key: string]: string}, userData?: string, } ) { const server = new HetznerServer(hetznerAccountRefArg); const createServerUrl = '/servers'; const createServerPayload: types.TServerCreateRequestBody = { name: optionsArg.name, image: 'ubuntu-22.04', server_type: optionsArg.type, start_after_create: true, labels: optionsArg.labels || {} as any, location: optionsArg.location, user_data: optionsArg.userData || '', public_net: { enable_ipv4: true, enable_ipv6: true, }, }; const response = await server.hetznerAccountRef.request( 'POST', createServerUrl, createServerPayload ); server.data = (response.body as types.TServerCreateResponseBody).server; return server; } public static async getServers(hetznerAccountRefArg: HetznerAccount) { const serversGetUrl = '/servers'; const response = await hetznerAccountRefArg.request('GET', serversGetUrl, {}); const serversDataArray = (response.body as types.TServersGetResponseBody).servers; const servers: HetznerServer[] = []; for (const serverData of serversDataArray) { const server = new HetznerServer(hetznerAccountRefArg); server.data = serverData; servers.push(server); } return servers; } public static async getServerByLabel(hetznerAccountRefArg: HetznerAccount, labelArg: string, valueArg?: string) { const servers = await HetznerServer.getServers(hetznerAccountRefArg); for (const server of servers) { if (valueArg ? server.data.labels[labelArg] === valueArg : server.data.labels[labelArg]) { return server; } } } // INSTANCE public hetznerAccountRef: HetznerAccount; public data: types.IServer; constructor(hetznerAccountRefArg: HetznerAccount) { this.hetznerAccountRef = hetznerAccountRefArg; } public async delete() { await this.hetznerAccountRef.request('DELETE', `/servers/${this.data.id}`, {}); } }