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 getServersByLabel(hetznerAccountRefArg: HetznerAccount, labelObject: {[key: string]: string}) { const servers = await HetznerServer.getServers(hetznerAccountRefArg); const results: HetznerServer[] = []; for (const server of servers) { let isMatch = true; for (const key in labelObject) { if (server.data.labels[key] !== labelObject[key]) { isMatch = false; } } if (isMatch) { results.push(server); } } return results; } // 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}`, {}); } }