2024-01-29 20:08:05 +00:00
|
|
|
import type { HetznerAccount } from './classes.account.js';
|
|
|
|
import * as plugins from './hetznercloud.plugins.js';
|
|
|
|
import * as types from './types.js';
|
|
|
|
|
|
|
|
export class HetznerServer {
|
|
|
|
// STATIC
|
2024-02-17 20:55:25 +00:00
|
|
|
public static async create(
|
|
|
|
hetznerAccountRefArg: HetznerAccount,
|
|
|
|
optionsArg: {
|
|
|
|
name: string;
|
2024-02-18 00:17:15 +00:00
|
|
|
type: types.THetznerCloudServerName;
|
|
|
|
location: types.THetznerCloudLocationName;
|
2024-02-18 22:23:20 +00:00
|
|
|
labels?: {[key: string]: string},
|
|
|
|
userData?: string,
|
2024-02-17 20:55:25 +00:00
|
|
|
}
|
|
|
|
) {
|
2024-01-29 20:08:05 +00:00
|
|
|
const server = new HetznerServer(hetznerAccountRefArg);
|
|
|
|
|
|
|
|
const createServerUrl = '/servers';
|
2024-02-17 20:55:25 +00:00
|
|
|
const createServerPayload: types.TServerCreateRequestBody = {
|
|
|
|
name: optionsArg.name,
|
|
|
|
image: 'ubuntu-22.04',
|
2024-02-18 00:17:15 +00:00
|
|
|
server_type: optionsArg.type,
|
2024-02-17 20:55:25 +00:00
|
|
|
start_after_create: true,
|
2024-02-17 20:58:10 +00:00
|
|
|
labels: optionsArg.labels || {} as any,
|
2024-02-17 20:55:25 +00:00
|
|
|
location: optionsArg.location,
|
2024-02-18 22:23:20 +00:00
|
|
|
user_data: optionsArg.userData || '',
|
2024-02-17 20:55:25 +00:00
|
|
|
public_net: {
|
|
|
|
enable_ipv4: true,
|
|
|
|
enable_ipv6: true,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
const response = await server.hetznerAccountRef.request(
|
|
|
|
'POST',
|
|
|
|
createServerUrl,
|
|
|
|
createServerPayload
|
|
|
|
);
|
2024-01-29 20:08:05 +00:00
|
|
|
server.data = (response.body as types.TServerCreateResponseBody).server;
|
|
|
|
return server;
|
|
|
|
}
|
|
|
|
|
2024-01-29 20:14:05 +00:00
|
|
|
public static async getServers(hetznerAccountRefArg: HetznerAccount) {
|
|
|
|
const serversGetUrl = '/servers';
|
|
|
|
const response = await hetznerAccountRefArg.request('GET', serversGetUrl, {});
|
2024-02-17 20:55:25 +00:00
|
|
|
const serversDataArray = (response.body as types.TServersGetResponseBody).servers;
|
2024-01-29 20:14:05 +00:00
|
|
|
const servers: HetznerServer[] = [];
|
|
|
|
for (const serverData of serversDataArray) {
|
|
|
|
const server = new HetznerServer(hetznerAccountRefArg);
|
|
|
|
server.data = serverData;
|
|
|
|
servers.push(server);
|
|
|
|
}
|
|
|
|
return servers;
|
|
|
|
}
|
|
|
|
|
2024-02-18 22:23:20 +00:00
|
|
|
public static async getServerByLabel(hetznerAccountRefArg: HetznerAccount, labelArg: string, valueArg?: string) {
|
|
|
|
const servers = await HetznerServer.getServers(hetznerAccountRefArg);
|
|
|
|
for (const server of servers) {
|
2024-02-18 22:25:57 +00:00
|
|
|
if (valueArg ? server.data.labels[labelArg] === valueArg : server.data.labels[labelArg]) {
|
2024-02-18 22:23:20 +00:00
|
|
|
return server;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-01-29 20:08:05 +00:00
|
|
|
// 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}`, {});
|
|
|
|
}
|
|
|
|
}
|